#!/bin/bash ############################################################ # Decription: Script to manage stack docker # # Author: Gilles Mouchet (gilles.mouchet@gmail.com) # Creation Date: 12-06-2025 # Version: 1.0 # Usage: ./manage.sh # Changelog: # V1.0 - dd-Mmm-2025 - GMo # Added # - Creation of script from scratch # ############################################################ #----------------------------------------------------------------- # Doesn't change anything from here #----------------------------------------------------------------- version="1.0-rc1" prog_name="./$(/bin/basename $0)" containers_to_start=(init minio minio-cli grafana loki promtail prometheus node-exporter proxy) containers_all=("${containers_to_start[@]}" log-generator dns-tools) # Couleurs VERT="\e[32m" ROUGE="\e[31m" NORMAL="\e[0m" #----------------------------------------------------------------- # Functions #----------------------------------------------------------------- # display help function print_usage { /bin/cat << EOF Usage: $prog_name [options] Options: config Create folder for persit. vol. and copy conf files param Display all vars defined in .env file list Display container (servie) list define in docker compose file create Create container start Start stack '${COMPOSE_PROJECT_NAME}' stop Stop stack '${COMPOSE_PROJECT_NAME}' down Stop stack '${COMPOSE_PROJECT_NAME}' and delete containers restart Restart stack '${COMPOSE_PROJECT_NAME}' version,-v,--version Display script version help,-h,--help Display this help Examples: To start stack '${COMPOSE_PROJECT_NAME}' $prog_name start To stop stack '${COMPOSE_PROJECT_NAME}' $prog_name stop To start a specific container and his depend docker compose up -d Ex: docker compose up minio-cli -d To create a new stack $prog_name config $prog_name create $prog_name start EOF } # create all containers function create_container { for cont_item in "${containers_all[@]}"; do # check if container exist. If not create it if [ $(docker ps -a | grep ${COMPOSE_PROJECT_NAME}-$cont_item | wc -l) -eq 0 ]; then echo -n "Create container $cont_item: " if docker compose create $cont_item > /dev/null 2>&1; then echo -e "${VERT}SUCCESS${NORMAL}" else echo -e "${ROUGE}ERROR${NORMAL}" fi else echo "Container $cont_item already exist" fi done } # start container function start_container { for cont_item in "${containers_to_start[@]}"; do echo -n "Start container $cont_item: " if docker compose up -d $cont_item > /dev/null 2>&1; then echo -e "${VERT}SUCCESS${NORMAL}" else echo -e "${ROUGE}ERROR${NORMAL}" fi done } #----------------------------------------------------------------- # MAIN #----------------------------------------------------------------- # read .env if exist if [ ! -f .env ]; then echo "file '.env' doesn't exist!" echo "See README.md" exit fi . .env #if [ ! -z "$1" ]; then #print_usage # exit 0 #fi case "$1" in config) echo "Create folder for persistent volume" sudo mkdir -p ${PRX_CERTS_DIR} sudo mkdir -p ${PRX_NGINX_CONF_DIR} sudo mkdir -p ${MINIO_DATA_ROOT_DIR} sudo mkdir -p ${MINIO_CONF_CLI_DIR} sudo mkdir -p ${GF_DATA_DIR} sudo mkdir -p ${PROM_CONF_DIR} sudo mkdir -p ${PROM_DATA_DIR} sudo mkdir -p ${LOKI_CONF_DIR} sudo mkdir -p ${LOKI_DATA_DIR} sudo mkdir -p ${LOKI_GEN_LOG_DIR} sudo mkdir -p ${PROMTAIL_CONF_DIR} echo "Copy configs files" sudo cp ./config/nginx/default.conf ${PRX_NGINX_CONF_DIR}/. sudo cp ./config/prometheus/prometheus.yml ${PROM_CONF_DIR}/. sudo cp ./config/loki/local-config.yaml ${LOKI_CONF_DIR}/. sudo cp ./config/promtail/config.yml ${PROMTAIL_CONF_DIR}/. ;; param) cat << EOF COMPOSE_PROJECT_NAME = ${COMPOSE_PROJECT_NAME} PRX_CERTS_DIR = ${PRX_CERTS_DIR} PRX_NGINX_CONF_DIR = ${PRX_NGINX_CONF_DIR} MINIO_DATA_ROOT_DIR = ${MINIO_DATA_ROOT_DIR} MINIO_CONF_CLI_DIR = ${MINIO_CONF_CLI_DIR} MINIO_ACCESS_KEY = ${MINIO_ACCESS_KEY} MINIO_SECRET_KEY = ${MINIO_SECRET_KEY} MINIO_REDIRECT_URL = ${MINIO_REDIRECT_URL} GF_ADMIN_USER = ${GF_ADMIN_USER} GF_ADMIN_PASS = ${GF_ADMIN_PASS} GF_DATA_DIR = ${GF_DATA_DIR} GF_ROOT_URL = ${GF_ROOT_URL} PROM_CONF_DIR = ${PROM_CONF_DIR} PROM_DATA_DIR = ${PROM_DATA_DIR} LOKI_CONF_DIR = ${LOKI_CONF_DIR} LOKI_DATA_DIR = ${LOKI_DATA_DIR} LOKI_GEN_LOG_DIR = ${LOKI_GEN_LOG_DIR} PROMTAIL_CONF_DIR = ${PROMTAIL_CONF_DIR} EOF ;; create) create_container ;; start) create_container start_container ;; stop) docker compose stop ;; down) docker compose down ;; list) echo "-------------------------------------" echo " Container list" echo "-------------------------------------" docker compose config --services | sort #for cont_item in "${containers_all[@]}"; do # echo "- $cont_item" #done ;; -h|--help|help) print_usage exit 0 ;; -v|--version|version) cat << EOF $(basename "$0") v$version (c) 1990 - $(date +%Y) by Gilles Mouchet Non-Commercial Use License – See LICENSE for details EOF exit 0 ;; *) print_usage exit 0 ;; esac