Added base directories, configs, and script
This commit is contained in:
299
data/docker/compose/manage
Executable file
299
data/docker/compose/manage
Executable file
@ -0,0 +1,299 @@
|
||||
#!/bin/bash
|
||||
# Note: all up scripts use set -a to export all variables created, set +a can be used to then turn off this effect
|
||||
|
||||
trap exiting EXIT #Print done when program exits
|
||||
|
||||
export VARIABLES_DIR=${PWD%/*}/variables/compose
|
||||
source $VARIABLES_DIR
|
||||
source $PATH_VARS_DIR
|
||||
export RUN_PULL_CONTAINER=N
|
||||
export CREATE_VOLUME_DIR=N
|
||||
export CREATE_VOLUME_DIR_ONLY=N
|
||||
|
||||
COMMAND=$1
|
||||
CONTAINERS=""
|
||||
|
||||
BASE_DIR=$PWD
|
||||
|
||||
all () {
|
||||
ALL=$(ls -d */ | sed 's/\/$//') #Using -d and */ to get just directories, sed removes the trailing backslash if there is one
|
||||
} #This method only works for one worded variables as all spaces will split variables!
|
||||
|
||||
# If running comamnds, put all commands into an array
|
||||
if [[ "$1" == "run" ]]; then
|
||||
# PROGRAMS=$(echo "${@:3}" | tr ';' '\n')
|
||||
mapfile -t PROGRAMS < <(echo "${@:3}" | tr ';' '\n') # This uses an array which allows for spaces!
|
||||
fi
|
||||
|
||||
# If wanting to run the specified command under all containers, put all containers in a list, otherwise use user specified
|
||||
if [[ "$2" == "ALL" ]]; then
|
||||
all
|
||||
CONTAINERS=$ALL
|
||||
else
|
||||
CONTAINERS=$(echo "$2" | tr '|' '\n') #This method only works for one worded variables as all spaces will split variables!
|
||||
fi
|
||||
|
||||
# Pull if run or restart has the -P or --pull option as the 3rd arg or later (shouldn't be before 3rd)
|
||||
if [[ "$1" == "up" || "$1" == "restart" ]]; then
|
||||
for arg in "${@:3}"
|
||||
do
|
||||
if [[ "$arg" == "-P" || "$arg" == "--pull" ]]; then
|
||||
RUN_PULL_CONTAINER=Y
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
# if -V or --volume is passed, create a volume directory along with a compose directory for the service being created
|
||||
if [[ "$1" == "create" ]]; then
|
||||
for arg in "${@:3}"
|
||||
do
|
||||
if [[ "$arg" == "-V" || "$arg" == "--volume" ]]; then
|
||||
CREATE_VOLUME_DIR=Y
|
||||
fi
|
||||
|
||||
if [[ "$arg" == "--volume-only" ]]; then
|
||||
CREATE_VOLUME_DIR_ONLY=Y
|
||||
CREATE_VOLUME_DIR=Y
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
|
||||
process () {
|
||||
if [[ -z "$1" ]]; then # There will be a trailing empty command in the array
|
||||
return;
|
||||
fi
|
||||
exe="${1/\[CONTAINER\]/"$2"}"
|
||||
#exe=$(echo "$1" | sed "s/\[CONTAINER\]/$2/g") # This works too, but using shorter method instead
|
||||
echo "Running under \"$2\":"
|
||||
echo "* $exe *"
|
||||
bash -c "$exe" # Actually must use bash -c, otherwises running something like echo hi > test.txt will print everything instead of echoing it
|
||||
}
|
||||
|
||||
# might be completely redundant to have a separate function for each, but allows for overrides. Also having a restart script for more customizability as well as I cannot easily keep track of what processes are in background, so having a restart script will manage all that for each service
|
||||
|
||||
up () {
|
||||
for container in $CONTAINERS; do
|
||||
$PWD/$container/up &
|
||||
done
|
||||
}
|
||||
|
||||
down () {
|
||||
for container in $CONTAINERS; do
|
||||
$PWD/$container/down &
|
||||
done
|
||||
}
|
||||
|
||||
restart () {
|
||||
for container in $CONTAINERS; do
|
||||
$PWD/$container/restart &
|
||||
done
|
||||
}
|
||||
|
||||
run () {
|
||||
for container in $CONTAINERS; do
|
||||
cd $BASE_DIR
|
||||
cd $container
|
||||
# echo "before loop"
|
||||
#for program in $PROGRAMS; do
|
||||
# echo "before prog"
|
||||
#echo "$program"
|
||||
#PROGRAMS=$(echo "${@:3}" | tr ';' '\n')
|
||||
#echo $PROGRAMS
|
||||
echo "$container:"
|
||||
for i in "${PROGRAMS[@]}"; do
|
||||
process "$i" $container
|
||||
done
|
||||
# echo "after prog"
|
||||
#done
|
||||
# echo "after loop"
|
||||
done
|
||||
}
|
||||
|
||||
#manage-var() {
|
||||
# VAR="PATH_VAR_$2"
|
||||
# VAR=${!VAR}
|
||||
# if [ -z "$VAR" ]
|
||||
# then
|
||||
# prt-var
|
||||
# exit 0
|
||||
# fi
|
||||
# return $VAR
|
||||
#}
|
||||
|
||||
ed-cmp () {
|
||||
for container in $CONTAINERS; do
|
||||
nano $PWD/$container/$3
|
||||
done
|
||||
}
|
||||
|
||||
ed-vol () {
|
||||
for container in $CONTAINERS; do
|
||||
nano $VOLUMES_DIR/$container/$3
|
||||
done
|
||||
}
|
||||
|
||||
ed-var () {
|
||||
VAR="PATH_VAR_$2"
|
||||
VAR=${!VAR}
|
||||
if [ -z "$VAR" ]
|
||||
then
|
||||
prt-var
|
||||
return 0
|
||||
fi
|
||||
nano $VAR$3
|
||||
}
|
||||
|
||||
ls-cmp () {
|
||||
for container in $CONTAINERS; do
|
||||
ls -al $PWD/$container/$3
|
||||
done
|
||||
}
|
||||
|
||||
ls-vol () {
|
||||
for container in $CONTAINERS; do
|
||||
ls -al $VOLUMES_DIR/$container/$3
|
||||
done
|
||||
}
|
||||
|
||||
ls-var () {
|
||||
VAR="PATH_VAR_$2"
|
||||
VAR=${!VAR}
|
||||
if [ -z "$VAR" ]
|
||||
then
|
||||
prt-var
|
||||
return 0
|
||||
fi
|
||||
ls $VAR$3
|
||||
}
|
||||
|
||||
prt-var () {
|
||||
cat $PATH_VARS_DIR
|
||||
}
|
||||
|
||||
create () {
|
||||
for container in $CONTAINERS; do
|
||||
if [[ ! -d "$container" && "$CREATE_VOLUME_DIR_ONLY" != "Y" ]]; then
|
||||
mkdir $container
|
||||
export SERVICE_NAME="$container"
|
||||
envsubst '${SERVICE_NAME}' < /data/docker/default/compose/docker-compose.yml > $container/docker-compose.yml
|
||||
cp $DEFAULT_DIR/compose/vars $container
|
||||
cd $container
|
||||
ln -s ../../default/compose/up .
|
||||
ln -s ../../default/compose/restart .
|
||||
ln -s ../../default/compose/down .
|
||||
cd ..
|
||||
sudo chown "$CREATE_OWNER:$CREATE_GROUP" $container -R
|
||||
sudo chmod "$CREATE_PERMISSION" $container -R
|
||||
sudo chmod +X $container
|
||||
elif [[ "$CREATE_VOLUME_DIR_ONLY" != "Y" ]]; then
|
||||
echo "Cannot create \"$container,\" it already exists."
|
||||
fi
|
||||
|
||||
if [[ "$CREATE_VOLUME_DIR" == "Y" ]]; then
|
||||
if [[ ! -d "$VOLUMES_DIR/$container" ]]; then
|
||||
mkdir $VOLUMES_DIR/$container
|
||||
sudo chown "$CREATE_OWNER:$CREATE_GROUP" $VOLUMES_DIR/$container
|
||||
sudo chmod "$CREATE_PERMISSION" $VOLUMES_DIR/$container
|
||||
sudo chmod +X $VOLUMES_DIR/$container
|
||||
else
|
||||
echo "Cannot create \"$container\" volume, it already exists."
|
||||
fi
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
|
||||
help () {
|
||||
echo Local Docker-Compose Manager
|
||||
echo "Syntax: ./manage [command] [container] [additional parameters]"
|
||||
echo "Container Paremeter:"
|
||||
echo " * Single: <traefik>"
|
||||
echo " * Multiple: <traefik|authelia|dashy>"
|
||||
echo " * All: <ALL>"
|
||||
echo "Command Parameter:"
|
||||
echo " * Runs in the directory of the container's docker compose (one level deep from this manage script)"
|
||||
echo " * Must be wrapped in quotes or escape semicolons to run multiple commands per container."
|
||||
echo "Available Commands: command, parameters"
|
||||
echo " up [container]"
|
||||
echo " down [container] -P/--pull"
|
||||
echo " restart [container] -P/--pull"
|
||||
echo " run [container] [command]"
|
||||
echo " ed-cmp [container] [extra path]"
|
||||
echo " ed-vol [container] [extra path]"
|
||||
echo " ed-var [container] [extra path]"
|
||||
echo " ls-cmp [container] [extra path]"
|
||||
echo " ls-vol [container] [extra path]"
|
||||
echo " ls-var [container] [extra path]"
|
||||
echo " prt-var [container]"
|
||||
echo " create [container] -V/--volume --volume-only"
|
||||
}
|
||||
|
||||
case $COMMAND in
|
||||
|
||||
up)
|
||||
up
|
||||
;;
|
||||
|
||||
down)
|
||||
down
|
||||
;;
|
||||
|
||||
restart)
|
||||
restart
|
||||
;;
|
||||
|
||||
run)
|
||||
run "$@" #I originally just had this as $@, without quotes, which separated all of the variables and caused massive issues
|
||||
;;
|
||||
|
||||
help)
|
||||
help;;
|
||||
--help)
|
||||
help
|
||||
;;
|
||||
|
||||
ed-cmp)
|
||||
ed-cmp "$@"
|
||||
;;
|
||||
|
||||
ed-vol)
|
||||
ed-vol "$@"
|
||||
;;
|
||||
|
||||
ed-var)
|
||||
ed-var "$@"
|
||||
;;
|
||||
|
||||
ls-cmp)
|
||||
ls-cmp "$@"
|
||||
;;
|
||||
|
||||
ls-vol)
|
||||
ls-vol "$@"
|
||||
;;
|
||||
|
||||
ls-var)
|
||||
ls-var "$@"
|
||||
;;
|
||||
|
||||
prt-var)
|
||||
prt-var "$@"
|
||||
;;
|
||||
|
||||
create)
|
||||
create "$@"
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "No such command '$COMMAND'"
|
||||
help
|
||||
;;
|
||||
esac
|
||||
|
||||
exiting () {
|
||||
echo "done"
|
||||
}
|
||||
|
||||
|
||||
wait #Wait for all background processes to end
|
27
data/docker/default/compose/docker-compose.yml
Normal file
27
data/docker/default/compose/docker-compose.yml
Normal file
@ -0,0 +1,27 @@
|
||||
version: '3'
|
||||
|
||||
services:
|
||||
$SERVICE_NAME:
|
||||
user: "${PUID}:${PGID}"
|
||||
container_name: $SERVICE_NAME
|
||||
restart: unless-stopped
|
||||
image: USER/IMAGE:latest
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.routers.$SERVICE_NAME.entryPoints=https"
|
||||
- "traefik.http.routers.$SERVICE_NAME.rule=Host(`$SUBDOMAIN.$DEFAULT_DOMAIN`)"
|
||||
- "traefik.http.routers.$SERVICE_NAME.tls=true"
|
||||
- "traefik.http.routers.$SERVICE_NAME.service="
|
||||
- "traefik.http.services.$SERVICE_NAME.loadbalancer.server.port=80"
|
||||
- "traefik.docker.network=proxy"
|
||||
- "traefik.http.routers.$SERVICE_NAME.middlewares=authelia@docker" # Authelia Auth Support
|
||||
networks:
|
||||
- proxy
|
||||
volumes:
|
||||
- /data/docker/volumes/$SERVICE_NAME/data:/data
|
||||
environment:
|
||||
- TZ=America/Chicago
|
||||
|
||||
networks:
|
||||
proxy:
|
||||
external: true
|
4
data/docker/default/compose/down
Executable file
4
data/docker/default/compose/down
Executable file
@ -0,0 +1,4 @@
|
||||
#!/bin/bash
|
||||
|
||||
CURRENT_PATH="$(dirname -- "${BASH_SOURCE[0]}")"
|
||||
docker-compose -f $CURRENT_PATH/docker-compose.yml down
|
12
data/docker/default/compose/restart
Executable file
12
data/docker/default/compose/restart
Executable file
@ -0,0 +1,12 @@
|
||||
#!/bin/bash
|
||||
set -a #exports all variables and sourced variables
|
||||
CURRENT_PATH="$(dirname -- "${BASH_SOURCE[0]}")"
|
||||
source $VARIABLES_DIR
|
||||
source $CURRENT_PATH/vars
|
||||
|
||||
if [[ "$RUN_PULL_CONTAINER" == "Y" ]]; then
|
||||
docker-compose -f $CURRENT_PATH/docker-compose.yml pull
|
||||
fi
|
||||
|
||||
docker-compose -f $CURRENT_PATH/docker-compose.yml down
|
||||
docker-compose -f $CURRENT_PATH/docker-compose.yml up -d
|
11
data/docker/default/compose/up
Executable file
11
data/docker/default/compose/up
Executable file
@ -0,0 +1,11 @@
|
||||
#!/bin/bash
|
||||
set -a #exports all variables and sourced variables
|
||||
CURRENT_PATH="$(dirname -- "${BASH_SOURCE[0]}")"
|
||||
source $VARIABLES_DIR
|
||||
source $CURRENT_PATH/vars
|
||||
|
||||
if [[ "$RUN_PULL_CONTAINER" == "Y" ]]; then
|
||||
docker-compose -f $CURRENT_PATH/docker-compose.yml pull
|
||||
fi
|
||||
|
||||
docker-compose -f $CURRENT_PATH/docker-compose.yml up -d
|
5
data/docker/default/compose/vars
Normal file
5
data/docker/default/compose/vars
Normal file
@ -0,0 +1,5 @@
|
||||
#!/usr/bin/env bash
|
||||
PUID=0
|
||||
PGID=1000
|
||||
|
||||
SUBDOMAIN=""
|
10
data/docker/variables/compose
Normal file
10
data/docker/variables/compose
Normal file
@ -0,0 +1,10 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
VOLUMES_DIR=${PWD%/*}/volumes
|
||||
DEFAULT_DOMAIN="bigalcubed.duckdns.org"
|
||||
PATH_VARS_DIR=${PWD%/*}/variables/compose-path-vars
|
||||
DEFAULT_DIR=${PWD%/*}/default
|
||||
CREATE_OWNER="admin"
|
||||
CREATE_GROUP="admin"
|
||||
CREATE_PERMISSION="660"
|
||||
|
5
data/docker/variables/compose-path-vars
Normal file
5
data/docker/variables/compose-path-vars
Normal file
@ -0,0 +1,5 @@
|
||||
#!/usr/bin/env bash
|
||||
# Do not include "PATH_VAR_" in the manage command
|
||||
PATH_VAR_auth="../volumes/authelia/config"
|
||||
PATH_VAR_auth_conf="../volumes/authelia/config/configuration.yml"
|
||||
PATH_VAR_auth_conf_users="../volumes/authelia/config/users_database.yml"
|
Reference in New Issue
Block a user