commit e2006ff020dcbfc16e2bfc1ad1be52bfcba14ab5
Author: Allen <63997543+aaw3@users.noreply.github.com>
Date:   Thu Jul 27 18:05:35 2023 -0500

    Added base directories, configs, and script

diff --git a/data/docker/compose/manage b/data/docker/compose/manage
new file mode 100755
index 0000000..d1e87d3
--- /dev/null
+++ b/data/docker/compose/manage
@@ -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
diff --git a/data/docker/default/compose/docker-compose.yml b/data/docker/default/compose/docker-compose.yml
new file mode 100644
index 0000000..8641d52
--- /dev/null
+++ b/data/docker/default/compose/docker-compose.yml
@@ -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
diff --git a/data/docker/default/compose/down b/data/docker/default/compose/down
new file mode 100755
index 0000000..655fc48
--- /dev/null
+++ b/data/docker/default/compose/down
@@ -0,0 +1,4 @@
+#!/bin/bash
+
+CURRENT_PATH="$(dirname -- "${BASH_SOURCE[0]}")"
+docker-compose -f $CURRENT_PATH/docker-compose.yml down
diff --git a/data/docker/default/compose/restart b/data/docker/default/compose/restart
new file mode 100755
index 0000000..1b28fa3
--- /dev/null
+++ b/data/docker/default/compose/restart
@@ -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
diff --git a/data/docker/default/compose/up b/data/docker/default/compose/up
new file mode 100755
index 0000000..4160011
--- /dev/null
+++ b/data/docker/default/compose/up
@@ -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
diff --git a/data/docker/default/compose/vars b/data/docker/default/compose/vars
new file mode 100644
index 0000000..e974664
--- /dev/null
+++ b/data/docker/default/compose/vars
@@ -0,0 +1,5 @@
+#!/usr/bin/env bash
+PUID=0
+PGID=1000
+
+SUBDOMAIN=""
diff --git a/data/docker/variables/compose b/data/docker/variables/compose
new file mode 100644
index 0000000..2649075
--- /dev/null
+++ b/data/docker/variables/compose
@@ -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"
+
diff --git a/data/docker/variables/compose-path-vars b/data/docker/variables/compose-path-vars
new file mode 100644
index 0000000..7e100a3
--- /dev/null
+++ b/data/docker/variables/compose-path-vars
@@ -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"