changed to a single file program

This commit is contained in:
Llewellyn van der Merwe 2021-07-02 02:22:22 +02:00
parent a792a74864
commit cc00cdba05
Signed by: Llewellyn
GPG Key ID: EFC0C720A240551C
17 changed files with 2628 additions and 2333 deletions

View File

@ -1,58 +1,28 @@
# Easy Docker Deployment (UBUNTU ONLY)
With this script we can easily deploy docker containers of Joomla and Openssh. This combination of these tools give rise to a powerful and very secure shared development environment.
Both the installation and deployment script has **command input** options as seen in the menus below, but these command ar _not the only way_ to set these values. When the values are **omitted** you will be _asked in the terminal_ to manually enter the required values as needed. Furthermore, the use of **env variables** are also heavily used across the script. There are more than one .env file and the script will set those up for you whenever you run a task that make use of env variables the script will check if those values exist, and if they don't it will ask for them, and store them automatically for future use. That same time the output message to the terminal will show you where the specific .env file can be found.
This program has **command input** options as seen in the menus below, but these command are _not the only way_ to set these values.
When the values are **omitted** you will be _asked in the terminal_ to manually enter the required values as needed.
Furthermore, the use of **env variables** are also heavily used across the script.
There are more than one .env file and the script will set those up for you whenever you run a task that make use of env variables
the script will check if those values exist, and if they don't it will ask for them, and store them automatically for future use.
That same time the output message to the terminal will show you where the specific .env file can be found.
---
# Install
```shell
$ git clone https://git.vdm.dev/octoleo/docker-deploy.git
$ cd docker-deploy/src
$ sudo chmod +x install.sh
$ sudo ./install.sh
```
> To see the installation help menu:
```shell
$ ./install.sh -h
$ sudo curl -L "https://git.vdm.dev/api/v1/repos/octoleo/docker-deploy/raw/src/docker-deploy?access_token=xxxx" -o /usr/local/bin/docker-deploy
$ sudo chmod +x /usr/local/bin/docker-deploy
```
### Help Menu (install)
```txt
Usage: ./install.sh [OPTION...]
Options
======================================================
--src-path=<path>|--src=<path>
set path to the script source folder
example: ./install.sh --src=/home/username/Docker/src
example: ./install.sh --src-path=/home/username/Docker/src
======================================================
--repo-path=<path>|--repo=<path>
set path to the repository folder
example: ./install.sh --repo=/home/username/Docker
example: ./install.sh --repo-path=/home/username/Docker
======================================================
--project-path=<path>|--project=<path>
set path to the projects folder
example: ./install.sh --project=/home/username/Projects
example: ./install.sh --project-path=/home/username/Projects
======================================================
-f|--force
force installation
example: ./install.sh -f
example: ./install.sh --force
======================================================
--host
always update your host file
example: ./install.sh --host
======================================================
-h|--help
display this help menu
example: ./install.sh -h
example: ./install.sh --help
======================================================
docker-deploy v1.0
======================================================
```
### How to get the Access Token
Sign in to [https://git.vdm.dev/](https://git.vdm.dev/user/login) with your **GitHub** or **Gitlab** account.
Then open your [applications settings](https://git.vdm.dev/user/settings/applications) and create a new access token.
![image](https://user-images.githubusercontent.com/5607939/143513412-946843be-acd8-4973-be44-00902226f6ba.png)
The first time you use the program, it will ask for the access token again, so it can do updates in the future.
---
# Usage
@ -73,10 +43,23 @@ Usage: docker-deploy [OPTION...]
set type of task you would like to perform
example: docker-deploy --task setup
======================================================
--container <container.domain.name>
Directly enabling or disabling a container with
the type=joomla and task=enable/disable set
The container must exist, which means it was
setup previously
Used without type and task Joomla-Enable is (default)
example: docker-deploy --container "io.vdm.dev"
======================================================
--update
to update your install
example: docker-deploy --update
======================================================
--access-token <token>
to update the program you will need an access token
from https://git.vdm.dev/user/settings/applications
example: docker-deploy --access-token xxxxxxxxxxx
======================================================
--uninstall
to uninstall this script
example: docker-deploy --uninstall
@ -162,7 +145,7 @@ Usage: docker-deploy [OPTION...]
example: docker-deploy -h
example: docker-deploy --help
======================================================
docker-deploy v1.0
Docker Deploy v2.0
======================================================
```
---

View File

@ -1,121 +0,0 @@
#!/bin/bash
# check that our enabled containers path is correct
[ -e "${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/available" ] || {
echo "[error] Available containers path ${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/available does not exist."
exit 1
}
# action to delete
function askToDelete() {
# some house cleaning
PS3_old=$PS3
# set the local value
local question
local path
local target
# now set the values
question="$1"
path="$2"
target="$3"
# some defaults
echo "${question}"
# set the terminal
export PS3="[select]: "
# Start our little Menu
select yn in "Yes" "No"; do
case $yn in
Yes ) sudo rm -rf "${path}"; echo "[notice] ${target} was deleted.";;
No ) echo "[notice] ${target} was not deleted.";;
esac
break
done
# restore the default
export PS3=$PS3_old
}
# get container available for deletion
function getContainer() {
# some house cleaning
PS3_old=$PS3
# some defaults
export PS3="Please select ${VDM_CONTAINER_TYPE} container deploy files to delete: "
# Start our little Menu
select menu in $(ls "${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/available/"); do
case $REPLY in
*)
SELECTED="$menu"
;;
esac
break
done
# restore the default
export PS3=$PS3_old
# return selection
echo "$SELECTED"
}
# set the container
CONTAINER="${1:-$CONTAINER}"
[ ${#CONTAINER} -ge 1 ] && [ -e "${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/available/${CONTAINER}" ] || {
CONTAINER=$(getContainer)
# make sure value was entered
[ ${#CONTAINER} -ge 1 ] && [ -e "${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/available/${CONTAINER}" ] || exit
}
# disable
if [ -e "${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/enabled/${CONTAINER}" ]; then
# make sure the docker image is stopped
docker-compose --file "${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/enabled/${CONTAINER}/docker-compose.yml" down
# then remove soft link
rm "${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/enabled/${CONTAINER}"
fi
# remove the files with one last confirmation
askToDelete \
"Are you absolutely sure you would like to complete delete the ${VDM_CONTAINER_TYPE} ${CONTAINER} deploy files?" \
"${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/available/${CONTAINER}" \
"${CONTAINER}"
# check that our project path is correct
[ -e "${VDM_PROJECT_PATH}" ] || {
echo "[error] Project path (${VDM_PROJECT_PATH}) does not exist."
exit 1
}
# make sites available selection
function getProjectsAvailable() {
# some house cleaning
PS3_old=$PS3
# some defaults
export PS3="Please select persistent volume folder to delete: "
# Start our little Menu
select menu in $(ls "${VDM_PROJECT_PATH}"); do
case $REPLY in
*)
SELECTED="$menu"
;;
esac
break
done
# restore the default
export PS3=$PS3_old
# return selection
echo "$SELECTED"
}
# set the local values
VDM_PROJECT="${2:-$VDM_PROJECT}"
# check that we have what we need
# shellcheck disable=SC2015
[ ${#VDM_PROJECT} -ge 1 ] && [ -d "${VDM_PROJECT_PATH}/${VDM_PROJECT}" ] || {
VDM_PROJECT=$(getProjectsAvailable)
# make sure value was entered
[ ${#VDM_PROJECT} -ge 1 ] && [ -d "${VDM_PROJECT_PATH}/${VDM_PROJECT}" ] || exit
}
# remove the files with one last confirmation
askToDelete \
"Are you absolutely sure you would like to delete the ${VDM_PROJECT} persistent volume folders?" \
"${VDM_PROJECT_PATH}/${VDM_PROJECT}" \
"${VDM_PROJECT}"

View File

@ -1,43 +0,0 @@
#!/bin/bash
# check that our enabled containers path is correct
[ -e "${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/enabled" ] || {
echo "[error] Enabled containers path ${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/enabled does not exist."
exit 1
}
# get container enabled selection
function getContainerEnabled() {
# some house cleaning
PS3_old=$PS3
# some defaults
export PS3="Please select container to disable: "
# Start our little Menu
select menu in $(ls "${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/enabled/"); do
case $REPLY in
*)
SELECTED="$menu"
;;
esac
break
done
# restore the default
export PS3=$PS3_old
# return selection
echo "$SELECTED"
}
# set the container
CONTAINER="${1:-$CONTAINER}"
# check that we have what we need
# shellcheck disable=SC2015
[ ${#CONTAINER} -ge 1 ] && [ -e "${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/enabled/${CONTAINER}" ] || {
CONTAINER=$(getContainerEnabled)
# make sure value was entered
[ ${#CONTAINER} -ge 1 ] && [ -e "${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/enabled/${CONTAINER}" ] || exit
}
# make sure the docker image is stopped
docker-compose --file "${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/enabled/${CONTAINER}/docker-compose.yml" down
# then remove soft link
rm "${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/enabled/${CONTAINER}"

2598
src/docker-deploy Executable file

File diff suppressed because it is too large Load Diff

View File

@ -1,466 +0,0 @@
#!/bin/bash
# BOT name
BOT_NAME="docker-deploy v1.0"
# the src folder path (where all the script are found)
export VDM_SRC_PATH="/home/update/this/path/to/src"
# we load global environment values
# shellcheck disable=SC2015
[ -f "${VDM_SRC_PATH}/.env" ] && source "${VDM_SRC_PATH}/.env" || {
echo "${VDM_SRC_PATH}/.env file not found, please run install."
exit 1
}
# check that our repository path is correct
[ -e "${VDM_REPO_PATH}" ] || {
echo "Repository path (${VDM_REPO_PATH}) does not exist."
exit 1
}
# check that our projects path is correct
[ -e "${VDM_PROJECT_PATH}" ] || {
echo "Projects path (${VDM_PROJECT_PATH}) does not exist."
exit 1
}
# help message ʕ•ᴥ•ʔ
function show_help() {
cat <<EOF
Usage: ${0##*/:-} [OPTION...]
Options
======================================================
--type <type>
set type you would like to work with
example: ${0##*/:-} --type joomla
======================================================
--task <task>
set type of task you would like to perform
example: ${0##*/:-} --task setup
======================================================
--update
to update your install
example: ${0##*/:-} --update
======================================================
--uninstall
to uninstall this script
example: ${0##*/:-} --uninstall
======================================================
AVAILABLE FOR TO ANY CONTAINER
======================================================
-k|--key <key>
set key for the docker compose container naming
!! no spaces allowed in the key !!
example: ${0##*/:-} -k="vdm"
example: ${0##*/:-} --key="vdm"
======================================================
-e|--env-key <key>
set key for the environment variable naming
!! no spaces allowed in the key & must be UPPERCASE !!
example: ${0##*/:-} -e="VDM"
example: ${0##*/:-} --env-key="VDM"
======================================================
-d|--domain <domain.com>
set key website domain
!! must be domain.tld !!
example: ${0##*/:-} -d="vdm.dev"
example: ${0##*/:-} --domain="vdm.dev"
======================================================
AVAILABLE FOR JOOMLA CONTAINER
======================================================
-j|--joomla-version <version>
set Joomla version number
!! only number allowed !!
example: ${0##*/:-} -j=3.10
example: ${0##*/:-} --joomla-version=3.10
======================================================
-s|--sub-domain <domain.com>
set key website sub domain
!! no spaces allowed in the sub domain !!
example: ${0##*/:-} -s="jcb"
example: ${0##*/:-} --sub-domain="jcb"
======================================================
AVAILABLE FOR OPENSSH CONTAINER
======================================================
-u|--username <username>
set username of the container
example: ${0##*/:-} -u="ubuntu"
example: ${0##*/:-} --username="ubuntu"
======================================================
--uid <id>
set container user id
example: ${0##*/:-} --uid=1000
======================================================
--gid <id>
set container user group id
example: ${0##*/:-} --gid=1000
======================================================
-p|--port <port>
set ssh port to use
!! do not use 22 !!
example: ${0##*/:-} -p=2239
example: ${0##*/:-} --port=2239
======================================================
--ssh-dir <dir>
set ssh directory name found in the .ssh dir
of this repo for the container keys
This directory has separate files for
each public key allowed to access
the container
example: ${0##*/:-} --ssh-dir="teamname"
======================================================
--sudo
switch to add the container user to the
sudo group of the container
example: ${0##*/:-} --sudo
======================================================
-t|--time-zone <time/zone>
set time zone of the container
!! must valid time zone !!
example: ${0##*/:-} -t="Africa/Windhoek"
example: ${0##*/:-} --time-zone="Africa/Windhoek"
======================================================
HELP ʕ•ᴥ•ʔ
======================================================
-h|--help
display this help menu
example: ${0##*/:-} -h
example: ${0##*/:-} --help
======================================================
${BOT_NAME}
======================================================
EOF
}
# check if we have options
while :; do
case $1 in
-h | --help)
show_help # Display a usage synopsis.
exit
;;
--update)
VDM_CONTAINER_TYPE="update"
shift
;;
--uninstall)
VDM_CONTAINER_TYPE="uninstall"
shift
;;
--type) # Takes an option argument; ensure it has been specified.
if [ "$2" ]; then
VDM_CONTAINER_TYPE=$2
shift
else
echo '[error] "--type" requires a non-empty option argument.'
exit 17
fi
;;
--type=?*)
VDM_CONTAINER_TYPE=${1#*=} # Delete everything up to "=" and assign the remainder.
;;
--type=) # Handle the case of an empty --src-path=
echo '[error] "--type=" requires a non-empty option argument.'
exit 17
;;
--task) # Takes an option argument; ensure it has been specified.
if [ "$2" ]; then
VDM_TASK=$2
shift
else
echo '[error] "--task" requires a non-empty option argument.'
exit 17
fi
;;
--task=?*)
VDM_TASK=${1#*=} # Delete everything up to "=" and assign the remainder.
;;
--task=) # Handle the case of an empty --src-path=
echo '[error] "--task=" requires a non-empty option argument.'
exit 17
;;
-j | --joomla-version) # Takes an option argument; ensure it has been specified.
if [ "$2" ]; then
export VDM_JV=$2
shift
else
echo '[error] "--joomla-version" requires a non-empty option argument.'
exit 17
fi
;;
-j=?* | --joomla-version=?*)
export VDM_JV=${1#*=} # Delete everything up to "=" and assign the remainder.
;;
-j= | --joomla-version=) # Handle the case of an empty --joomla-version=
echo '[error] "--joomla-version=" requires a non-empty option argument.'
exit 17
;;
-k | --key) # Takes an option argument; ensure it has been specified.
if [ "$2" ]; then
export VDM_KEY=$2
shift
else
echo '[error] "--key" requires a non-empty option argument.'
exit 17
fi
;;
-k=?* | --key=?*)
export VDM_KEY=${1#*=} # Delete everything up to "=" and assign the remainder.
;;
-k= | --key=) # Handle the case of an empty --key=
echo '[error] "--key=" requires a non-empty option argument.'
exit 17
;;
-e | --env-key) # Takes an option argument; ensure it has been specified.
if [ "$2" ]; then
export VDM_ENV_KEY=$2
shift
else
echo '[error] "--env-key" requires a non-empty option argument.'
exit 17
fi
;;
-e=?* | --env-key=?*)
export VDM_ENV_KEY=${1#*=} # Delete everything up to "=" and assign the remainder.
;;
-e= | --env-key=) # Handle the case of an empty --env-key=
echo '[error] "--env-key=" requires a non-empty option argument.'
exit 17
;;
-d | --domain) # Takes an option argument; ensure it has been specified.
if [ "$2" ]; then
export VDM_DOMAIN=$2
shift
else
echo '[error] "--domain" requires a non-empty option argument.'
exit 17
fi
;;
-d=?* | --domain=?*)
export VDM_DOMAIN=${1#*=} # Delete everything up to "=" and assign the remainder.
;;
-d= | --domain=) # Handle the case of an empty --domain=
echo '[error] "--domain=" requires a non-empty option argument.'
exit 17
;;
-s | --sub-domain) # Takes an option argument; ensure it has been specified.
if [ "$2" ]; then
export VDM_SUBDOMAIN=$2
shift
else
echo '[error] "--sub-domain" requires a non-empty option argument.'
exit 17
fi
;;
-s=?* | --sub-domain=?*)
export VDM_SUBDOMAIN=${1#*=} # Delete everything up to "=" and assign the remainder.
;;
-s= | --sub-domain=) # Handle the case of an empty --sub-domain=
echo '[error] "--sub-domain=" requires a non-empty option argument.'
exit 17
;;
--sudo)
export VDM_SUDO_ACCESS=true
shift
;;
-u | --username) # Takes an option argument; ensure it has been specified.
if [ "$2" ]; then
export VDM_USER_NAME=$2
shift
else
echo '[error] "--username" requires a non-empty option argument.'
exit 17
fi
;;
-u=?* | --username=?*)
export VDM_USER_NAME=${1#*=} # Delete everything up to "=" and assign the remainder.
;;
-u= | --username=) # Handle the case of an empty --username=
echo '[error] "--username=" requires a non-empty option argument.'
exit 17
;;
--uid) # Takes an option argument; ensure it has been specified.
if [ "$2" ]; then
export VDM_PUID=$2
shift
else
echo '[error] "--uid" requires a non-empty option argument.'
exit 17
fi
;;
--uid=?*)
export VDM_PUID=${1#*=} # Delete everything up to "=" and assign the remainder.
;;
--uid=) # Handle the case of an empty --uid=
echo '[error] "--uid=" requires a non-empty option argument.'
exit 17
;;
--gid) # Takes an option argument; ensure it has been specified.
if [ "$2" ]; then
export VDM_PGID=$2
shift
else
echo '[error] "--gid" requires a non-empty option argument.'
exit 17
fi
;;
--gid=?*)
export VDM_PGID=${1#*=} # Delete everything up to "=" and assign the remainder.
;;
--gid=) # Handle the case of an empty --gid=
echo '[error] "--gid=" requires a non-empty option argument.'
exit 17
;;
-p | --port) # Takes an option argument; ensure it has been specified.
if [ "$2" ]; then
export VDM_PORT=$2
shift
else
echo '[error] "--port" requires a non-empty option argument.'
exit 17
fi
;;
-p=?* | --port=?*)
export VDM_PORT=${1#*=} # Delete everything up to "=" and assign the remainder.
;;
-p= | --port=) # Handle the case of an empty --port=
echo '[error] "--port=" requires a non-empty option argument.'
exit 17
;;
--ssh-dir) # Takes an option argument; ensure it has been specified.
if [ "$2" ]; then
export VDM_PUBLIC_KEY_DIR=$2
shift
else
echo '[error] "--ssh-dir" requires a non-empty option argument.'
exit 17
fi
;;
--ssh-dir=?*)
export VDM_PUBLIC_KEY_DIR=${1#*=} # Delete everything up to "=" and assign the remainder.
;;
-ssh-dir=) # Handle the case of an empty --ssh-dir=
echo '[error] "--ssh-dir=" requires a non-empty option argument.'
exit 17
;;
-t | --time-zone) # Takes an option argument; ensure it has been specified.
if [ "$2" ]; then
export VDM_TZ=$2
shift
else
echo '[error] "--time-zone" requires a non-empty option argument.'
exit 17
fi
;;
-t=?* | --time-zone=?*)
export VDM_TZ=${1#*=} # Delete everything up to "=" and assign the remainder.
;;
-t= | --time-zone=) # Handle the case of an empty --time-zone=
echo '[error] "--time-zone=" requires a non-empty option argument.'
exit 17
;;
*) # Default case: No more options, so break out of the loop.
break ;;
esac
shift
done
# get container type
function getContainerType() {
# some house cleaning
PS3_old=$PS3
# some defaults
export PS3="Please select the type: "
# Start our little Menu
select menu in "joomla" "openssh" "traefik" "portainer" "update" "uninstall"; do
case $REPLY in
*)
SELECTED="$menu"
;;
esac
break
done
# restore the default
export PS3=$PS3_old
# return selection
echo "$SELECTED"
}
# check that we have what we need
[ ${#VDM_CONTAINER_TYPE} -ge 1 ] || {
VDM_CONTAINER_TYPE=$(getContainerType)
# make sure value was entered
[ ${#VDM_CONTAINER_TYPE} -ge 1 ] || {
echo "[error] Wrong type selected"
exit 1
}
}
export VDM_CONTAINER_TYPE
# get task type
function getTaskType() {
# some house cleaning
PS3_old=$PS3
# build the selection based on the VDM_CONTAINER_TYPE
case "$VDM_CONTAINER_TYPE" in
"joomla")
options=("setup" "enable" "disable" "up" "down" "fix")
shift
;;
"openssh")
options=("setup" "enable" "disable" "up" "down")
shift
;;
*)
echo "[error] Wrong type selected (${VDM_CONTAINER_TYPE})"
exit 1
;;
esac
# some defaults
export PS3="Please select the kind of task to perform on ${VDM_CONTAINER_TYPE}: "
# Start our little Menu
select menu in "${options[@]}"; do
case $REPLY in
*)
SELECTED="$menu"
;;
esac
break
done
# restore the default
export PS3=$PS3_old
# return selection
echo "$SELECTED"
}
case "$VDM_CONTAINER_TYPE" in
"traefik")
VDM_TASK="setup-traefik"
;;
"portainer")
VDM_TASK="setup-portainer"
;;
"update")
VDM_TASK="install"
;;
"uninstall")
VDM_TASK="uninstall"
;;
esac
# check that we have what we need
[ ${#VDM_TASK} -ge 1 ] || {
VDM_TASK=$(getTaskType)
# make sure value was entered
[ ${#VDM_TASK} -ge 1 ] || {
echo "[error] Wrong task type selected for ${VDM_CONTAINER_TYPE}"
exit 1
}
}
# run that task type script
# shellcheck disable=SC1090
source "${VDM_SRC_PATH}/${VDM_TASK}.sh"
exit 0

View File

@ -1,18 +0,0 @@
#!/bin/bash
# check that our enabled containers path is correct
[ -e "${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/enabled" ] || {
echo "[error] Enabled containers path ${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/enabled does not exist. This means no container is enabled."
exit 1
}
# the main function
main() {
# get all zip files
for yml in "${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/enabled/"*/*.yml; do
docker-compose --file "${yml}" down
done
}
# run main
main

View File

@ -1,63 +0,0 @@
#!/bin/bash
# check that our repository path is correct
[ -e "${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/available/" ] || {
echo "[error] The path ${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/available/ does not exist, first run setup."
exit 1
}
# check that our projects path is correct
[ -e "${VDM_PROJECT_PATH}" ] || {
echo "[error] Projects path (${VDM_PROJECT_PATH}) does not exist."
exit 1
}
# get container available selection
function getContainerAvailable() {
# some house cleaning
PS3_old=$PS3
# some defaults
export PS3="Please select container to enable: "
# Start our little Menu
select menu in $(ls "${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/available/"); do
case $REPLY in
*)
SELECTED="$menu"
;;
esac
break
done
# restore the default
export PS3=$PS3_old
# return selection
echo "$SELECTED"
}
# set the container
CONTAINER="${1:-$CONTAINER}"
# check that we have what we need
# shellcheck disable=SC2015
[ ${#CONTAINER} -ge 1 ] && [ -d "${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/available/${CONTAINER}" ] || {
CONTAINER=$(getContainerAvailable)
# make sure value was entered
[ ${#CONTAINER} -ge 1 ] && [ -d "${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/available/${CONTAINER}" ] || exit
}
# create the folder as needed
mkdir -p "${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/enabled/"
# create the soft link
[ -e "${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/enabled/${CONTAINER}" ] || ln -s "${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/available/${CONTAINER}" "${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/enabled/${CONTAINER}"
# check if image has its own env file also
ENV_FILE=''
# shellcheck disable=SC2015
[ -f "${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/enabled/${CONTAINER}/.env" ] && ENV_FILE="${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/enabled/${CONTAINER}/.env" || {
[ -f "${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/.env" ] && ENV_FILE="${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/.env"
}
# make sure the docker image is started
# shellcheck disable=SC2015
[ ${#ENV_FILE} -ge 1 ] && docker-compose --env-file "${ENV_FILE}" --file "${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/enabled/${CONTAINER}/docker-compose.yml" up -d || {
docker-compose --file "${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/enabled/${CONTAINER}/docker-compose.yml" up -d
}
# show env path used
echo "[notice] EVN PATH: ${ENV_FILE}"

View File

@ -1,81 +0,0 @@
#!/bin/bash
# check that our project path is correct
[ -e "${VDM_PROJECT_PATH}" ] || {
echo "[error] Project path (${VDM_PROJECT_PATH}) does not exist."
exit 1
}
# make sites available selection
function getProjectsAvailable() {
# some house cleaning
PS3_old=$PS3
# some defaults
export PS3="Please select project to fix: "
# Start our little Menu
select menu in $(ls "${VDM_PROJECT_PATH}"); do
case $REPLY in
*)
SELECTED="$menu"
;;
esac
break
done
# restore the default
export PS3=$PS3_old
# return selection
echo "$SELECTED"
}
# set the local values
VDM_PROJECT="${1:-$VDM_PROJECT}"
# check that we have what we need
# shellcheck disable=SC2015
[ ${#VDM_PROJECT} -ge 1 ] && [ -d "${VDM_PROJECT_PATH}/${VDM_PROJECT}" ] || {
VDM_PROJECT=$(getProjectsAvailable)
# make sure value was entered
[ ${#VDM_PROJECT} -ge 1 ] && [ -d "${VDM_PROJECT_PATH}/${VDM_PROJECT}" ] || exit
}
### Fix the folder ownership of Joomla folders
#
echo "[notice] Fix the folder ownership of ${VDM_PROJECT} Joomla folders"
#
sudo chown -R www-data:www-data "${VDM_PROJECT_PATH}/${VDM_PROJECT}/joomla"
### Fix the folder permissions for the Joomla websites
#
echo "[notice] Fix the file and folder permissions for the ${VDM_PROJECT} Joomla website"
#
# Change the file permissions
sudo find "${VDM_PROJECT_PATH}/${VDM_PROJECT}/joomla" -type f -exec chmod 644 {} \;
sudo find "${VDM_PROJECT_PATH}/${VDM_PROJECT}/joomla/configuration.php" -type f -exec chmod 444 {} \;
[ -f "${VDM_PROJECT_PATH}/${VDM_PROJECT}/joomla/.htaccess" ] &&
sudo find "${VDM_PROJECT_PATH}/${VDM_PROJECT}/joomla/.htaccess" -type f -exec chmod 400 {} \;
[ -f "${VDM_PROJECT_PATH}/${VDM_PROJECT}/joomla/php.ini" ] &&
sudo find "${VDM_PROJECT_PATH}/${VDM_PROJECT}/joomla/php.ini" -type f -exec chmod 400 {} \;
# Change the folder permissions
sudo find /"home/${USER}/Projects/${VDM_PROJECT}/joomla" -type d -exec chmod 755 {} \;
# Change the image folder permissions
# chmod 707 "${VDM_PROJECT_PATH}/${VDM_PROJECT}/joomla/images"
# chmod 707 "${VDM_PROJECT_PATH}/${VDM_PROJECT}/joomla/images/stories"
### Fix the folder permissions so the active user (1000) can access the files
#
echo "[notice] Fix the folder permissions of ${VDM_PROJECT} joomla so user:1000 can access them"
#
sudo setfacl -R -m u:1000:rwx "${VDM_PROJECT_PATH}/${VDM_PROJECT}/joomla"
### Fix the folder ownership of database folders
#
echo "[notice] Fix the folder ownership of ${VDM_PROJECT} database folders"
#
sudo chown -R systemd-coredump:systemd-coredump "${VDM_PROJECT_PATH}/${VDM_PROJECT}/db"
### Fix the folder permissions for the database files
#
echo "[notice] Fix the file and folder permissions for the ${VDM_PROJECT} database files"
#
# Change the file permissions
sudo find "${VDM_PROJECT_PATH}/${VDM_PROJECT}/db" -type f -exec chmod 660 {} \;
sudo find "${VDM_PROJECT_PATH}/${VDM_PROJECT}/db" -type d -exec chmod 700 {} \;

View File

@ -1,13 +0,0 @@
#!/bin/bash
# check if we should add to host file
if $VDM_UPDATE_HOST; then
# check if already in host file
if grep -q "${1:-$VDM_SUBDOMAIN}.${2:-$VDM_DOMAIN}" /etc/hosts; then
echo "[notice] ${USER^}, ${1:-$VDM_SUBDOMAIN}.${2:-$VDM_DOMAIN} is already in the /etc/hosts file."
else
# just a notice for now
echo "[notice] ${USER^}, you should add ${1:-$VDM_SUBDOMAIN}.${2:-$VDM_DOMAIN} to the /etc/hosts file."
# sudo echo "127.0.0.1 ${VDM_SUBDOMAIN}.${VDM_DOMAIN}" >> /etc/hosts
fi
fi

View File

@ -1,258 +0,0 @@
#!/bin/bash
# BOT name
BOT_NAME="docker-deploy v1.0"
# only install/setup docker once
command -v docker >/dev/null 2>&1 || {
# remove old docker
sudo apt-get remove docker docker-engine docker.io containerd runc
# add docker repo
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# make sure we have dependencies installed
sudo apt-get update
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
# now install docker
sudo apt-get install docker-ce docker-ce-cli containerd.io
# start docker
sudo systemctl enable docker.service
# persist docker
udo systemctl enable containerd.service
# make sure the user is in the docker group
sudo groupadd docker
sudo usermod -aG docker "$USER"
}
# only install docker-compose once
command -v docker-compose >/dev/null 2>&1 || {
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
}
# get script path
VDM_SRC_PATH="${BASH_SOURCE%/*}"
if [[ ! -d "$VDM_SRC_PATH" || "$VDM_SRC_PATH" == '.' ]]; then VDM_SRC_PATH="$PWD"; fi
# some globals
VDM_FORCE_INSTALL=false
VDM_UPDATE_HOST=false
# help message ʕ•ᴥ•ʔ
function show_help() {
cat <<EOF
Usage: ${0##*/:-} [OPTION...]
Options
======================================================
--src-path=<path>|--src=<path>
set path to the script source folder
example: ${0##*/:-} --src=/home/$USER/Docker/src
example: ${0##*/:-} --src-path=/home/$USER/Docker/src
======================================================
--repo-path=<path>|--repo=<path>
set path to the repository folder
example: ${0##*/:-} --repo=/home/$USER/Docker
example: ${0##*/:-} --repo-path=/home/$USER/Docker
======================================================
--project-path=<path>|--project=<path>
set path to the projects folder
example: ${0##*/:-} --project=/home/$USER/Projects
example: ${0##*/:-} --project-path=/home/$USER/Projects
======================================================
-f|--force
force installation
example: ${0##*/:-} -f
example: ${0##*/:-} --force
======================================================
--host
always update your host file
example: ${0##*/:-} --host
======================================================
-h|--help
display this help menu
example: ${0##*/:-} -h
example: ${0##*/:-} --help
======================================================
${BOT_NAME}
======================================================
EOF
}
# check if we have options
while :; do
case $1 in
-h | --help)
show_help # Display a usage synopsis.
exit
;;
-f | --force)
VDM_FORCE_INSTALL=true
shift
;;
--host)
VDM_UPDATE_HOST=true
shift
;;
--src-path | --src) # Takes an option argument; ensure it has been specified.
if [ "$2" ]; then
VDM_SRC_PATH=$2
shift
else
echo '[error] "--src-path" requires a non-empty option argument.'
exit 17
fi
;;
--src-path=?* | --src=?*)
VDM_SRC_PATH=${1#*=} # Delete everything up to "=" and assign the remainder.
;;
--src-path= | --src=) # Handle the case of an empty --src-path=
echo '[error] "--src-path=" requires a non-empty option argument.'
exit 17
;;
--repo-path | --repo) # Takes an option argument; ensure it has been specified.
if [ "$2" ]; then
VDM_REPO_PATH=$2
shift
else
echo '[error] "--repo-path" requires a non-empty option argument.'
exit 17
fi
;;
--repo-path=?* | --repo=?*)
VDM_REPO_PATH=${1#*=} # Delete everything up to "=" and assign the remainder.
;;
--repo-path= | --repo=) # Handle the case of an empty --repo-path=
echo '[error] "--repo-path=" requires a non-empty option argument.'
exit 17
;;
--project-path | --project) # Takes an option argument; ensure it has been specified.
if [ "$2" ]; then
VDM_PROJECT_PATH=$2
shift
else
echo '[error] "--project-path" requires a non-empty option argument.'
exit 17
fi
;;
--project-path=?* | --project=?*)
VDM_PROJECT_PATH=${1#*=} # Delete everything up to "=" and assign the remainder.
;;
--project-path= | --project=) # Handle the case of an empty --project-path=
echo '[error] "---project-path=" requires a non-empty option argument.'
exit 17
;;
*) # Default case: No more options, so break out of the loop.
break ;;
esac
shift
done
# make source path available to other scripts
export VDM_SRC_PATH="${VDM_SRC_PATH}"
# now we get the repository path
[ -e "${VDM_REPO_PATH}" ] || {
echo "[notice] The repository full path is where the container .yml files will live."
echo -n "[enter:${VDM_SRC_PATH%/src}] Repository Full Path: "
read -r VDM_REPO_PATH
# make sure it exist
# shellcheck disable=SC2015
[ ${#VDM_REPO_PATH} -ge 1 ] && [ -d "${VDM_REPO_PATH}" ] || {
# we set the default
VDM_REPO_PATH="${VDM_SRC_PATH%/src}"
## check if this exist
[ -d "${VDM_REPO_PATH}" ] || {
echo "[error] Repository path (${VDM_REPO_PATH}) does not exist."
exit 1
}
}
}
# we set the repo path (easy)
grep -q "VDM_REPO_PATH=\"${VDM_REPO_PATH}\"" "${VDM_SRC_PATH}/.env" || echo "export VDM_REPO_PATH=\"${VDM_REPO_PATH}\"" >"${VDM_SRC_PATH}/.env"
export VDM_REPO_PATH="${VDM_REPO_PATH}"
grep -q "VDM_UPDATE_HOST=${VDM_UPDATE_HOST}" "${VDM_SRC_PATH}/.env" || echo "export VDM_UPDATE_HOST=${VDM_UPDATE_HOST}" >>"${VDM_SRC_PATH}/.env"
export VDM_UPDATE_HOST
# notice about the repo path
echo "[notice] $VDM_REPO_PATH was set as the repository path in ${VDM_SRC_PATH}/.env"
# now we must set the Projects path
[ -e "${VDM_PROJECT_PATH}" ] || {
echo -n "[enter:/home/${USER}/Projects] Projects Full Path: "
read -r VDM_PROJECT_PATH
# make sure it exist
# shellcheck disable=SC2015
[ ${#VDM_PROJECT_PATH} -ge 1 ] && [ -d "${VDM_PROJECT_PATH}" ] || {
# we set the default
VDM_PROJECT_PATH="/home/${USER}/Projects"
## check if this exist
[ -d "${VDM_PROJECT_PATH}" ] || {
echo "[error] Project path (${VDM_PROJECT_PATH}) does not exist."
exit 1
}
}
}
# we set the projects path (easy)
grep -q "VDM_PROJECT_PATH=\"${VDM_PROJECT_PATH}\"" "${VDM_SRC_PATH}/.env" || echo "export VDM_PROJECT_PATH=\"${VDM_PROJECT_PATH}\"" >>"${VDM_SRC_PATH}/.env"
export VDM_PROJECT_PATH="${VDM_PROJECT_PATH}"
# notice about the projects path
echo "[notice] $VDM_PROJECT_PATH was set as the project path in ${VDM_SRC_PATH}/.env"
# now we set the docker-deploy script in the executable path of this user
if [ ! $VDM_FORCE_INSTALL ]; then
[ -f /usr/local/bin/docker-deploy ] && {
echo "[error] /usr/local/bin/docker-deploy already exist! you can force installation:"
echo "[fix] $ ${0##*/:-} -f"
exit 1
}
sudo cp "${VDM_SRC_PATH}/docker-deploy.sh" /usr/local/bin/docker-deploy
else
sudo cp -f "${VDM_SRC_PATH}/docker-deploy.sh" /usr/local/bin/docker-deploy
fi
# we need to add helper for our docker-deploy script to find the .env file
sudo sed -i -e "s|/home/update/this/path/to/src|${VDM_SRC_PATH}|g" /usr/local/bin/docker-deploy
# notice of the src path
echo "[notice] ${VDM_SRC_PATH} is the src path to all scripts, and should not be deleted."
# we first make sure run is executable
echo "[sudo] making the /usr/local/bin/docker-deploy script executable"
sudo chmod +x "/usr/local/bin/docker-deploy"
# Note: If the command docker-deploy fails after installation, check your path.
# You can also create a symbolic link to /usr/bin or any other directory in your path.
# For example:
# $ sudo ln -s /usr/local/bin/docker-deploy /usr/bin/docker-deploy
# we load global environment values
# shellcheck disable=SC2015
[ -f "${VDM_SRC_PATH}/.env" ] && source "${VDM_SRC_PATH}/.env"
# check if we should setup traefik
echo -n "[enter:y] Setup Traefik (y/n): "
read -r VDM_SETUP_TRAEFIK
# make sure value was entered
if [ "${VDM_SETUP_TRAEFIK,,}" != 'n' ]; then
# run that task type script
# shellcheck disable=SC1090
source "${VDM_SRC_PATH}/setup-traefik.sh"
fi
# check if we should setup portainer
echo -n "[enter:y] Setup Portainer (y/n): "
read -r VDM_SETUP_PORTAINER
# make sure value was entered
if [ "${VDM_SETUP_PORTAINER,,}" != 'n' ]; then
# run that task type script
# shellcheck disable=SC1090
source "${VDM_SRC_PATH}/setup-portainer.sh"
fi
exit 0

View File

@ -1,354 +0,0 @@
#!/bin/bash
# BOT name
BOT_NAME="docker-deploy v1.0"
# check that our repository path is correct
[ -e "${VDM_REPO_PATH}" ] || {
echo "[error] Repository path (${VDM_REPO_PATH}) does not exist."
exit 1
}
# check that our projects path is correct
[ -e "${VDM_PROJECT_PATH}" ] || {
echo "[error] Projects path (${VDM_PROJECT_PATH}) does not exist."
exit 1
}
# be sure to create the container type path
# shellcheck disable=SC2174
mkdir -p -m 700 "${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}"
# check if we have global env file
# shellcheck disable=SC1090
# shellcheck disable=SC2015
[ -f "${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/.env" ] && source "${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/.env" || {
touch "${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/.env"
chmod 600 "${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/.env"
}
# we must get a random key
function getPass() {
# simple basic random
# shellcheck disable=SC2046
echo $(tr -dc 'A-HJ-NP-Za-km-z2-9' </dev/urandom | dd bs="${1:-128}" count=1 status=none)
}
# help message ʕ•ᴥ•ʔ
function show_help() {
cat <<EOF
Usage: ${0##*/:-} [OPTION...]
Options
======================================================
-j|--joomla-version <version>
set Joomla version number
!! only number allowed !!
example: ${0##*/:-} -j=3.10
example: ${0##*/:-} --joomla-version=3.10
======================================================
-k|--key <key>
set key for the docker compose container naming
!! no spaces allowed in the key !!
example: ${0##*/:-} -k="vdm"
example: ${0##*/:-} --key="vdm"
======================================================
-e|--env-key <key>
set key for the environment variable naming
!! no spaces allowed in the key & must be UPPERCASE !!
example: ${0##*/:-} -e="VDM"
example: ${0##*/:-} --env-key="VDM"
======================================================
-d|--domain <domain.com>
set key website domain
!! must be domain.tld !!
example: ${0##*/:-} -d="vdm.dev"
example: ${0##*/:-} --domain="vdm.dev"
======================================================
-s|--sub-domain <domain.com>
set key website sub domain
!! no spaces allowed in the sub domain !!
example: ${0##*/:-} -s="jcb"
example: ${0##*/:-} --sub-domain="jcb"
======================================================
-h|--help
display this help menu
example: ${0##*/:-} -h
example: ${0##*/:-} --help
======================================================
${BOT_NAME}
======================================================
EOF
}
# set the local values
while :; do
case $1 in
-h | --help)
show_help # Display a usage synopsis.
exit
;;
-j | --joomla-version) # Takes an option argument; ensure it has been specified.
if [ "$2" ]; then
VDM_JV=$2
shift
else
echo '[error] "--joomla-version" requires a non-empty option argument.'
exit 17
fi
;;
-j=?* | --joomla-version=?*)
VDM_JV=${1#*=} # Delete everything up to "=" and assign the remainder.
;;
-j= | --joomla-version=) # Handle the case of an empty --joomla-version=
echo '[error] "--joomla-version=" requires a non-empty option argument.'
exit 17
;;
-k | --key) # Takes an option argument; ensure it has been specified.
if [ "$2" ]; then
VDM_KEY=$2
shift
else
echo '[error] "--key" requires a non-empty option argument.'
exit 17
fi
;;
-k=?* | --key=?*)
VDM_KEY=${1#*=} # Delete everything up to "=" and assign the remainder.
;;
-k= | --key=) # Handle the case of an empty --key=
echo '[error] "--key=" requires a non-empty option argument.'
exit 17
;;
-e | --env-key) # Takes an option argument; ensure it has been specified.
if [ "$2" ]; then
VDM_ENV_KEY=$2
shift
else
echo '[error] "--env-key" requires a non-empty option argument.'
exit 17
fi
;;
-e=?* | --env-key=?*)
VDM_ENV_KEY=${1#*=} # Delete everything up to "=" and assign the remainder.
;;
-e= | --env-key=) # Handle the case of an empty --env-key=
echo '[error] "--env-key=" requires a non-empty option argument.'
exit 17
;;
-d | --domain) # Takes an option argument; ensure it has been specified.
if [ "$2" ]; then
VDM_DOMAIN=$2
shift
else
echo '[error] "--domain" requires a non-empty option argument.'
exit 17
fi
;;
-d=?* | --domain=?*)
VDM_DOMAIN=${1#*=} # Delete everything up to "=" and assign the remainder.
;;
-d= | --domain=) # Handle the case of an empty --domain=
echo '[error] "--domain=" requires a non-empty option argument.'
exit 17
;;
-s | --sub-domain) # Takes an option argument; ensure it has been specified.
if [ "$2" ]; then
VDM_SUBDOMAIN=$2
shift
else
echo '[error] "--sub-domain" requires a non-empty option argument.'
exit 17
fi
;;
-s=?* | --sub-domain=?*)
VDM_SUBDOMAIN=${1#*=} # Delete everything up to "=" and assign the remainder.
;;
-s= | --sub-domain=) # Handle the case of an empty --sub-domain=
echo '[error] "--sub-domain=" requires a non-empty option argument.'
exit 17
;;
*) # Default case: No more options, so break out of the loop.
break ;;
esac
shift
done
# check that we have what we need
[ ${#VDM_JV} -ge 1 ] || {
echo -n "[enter] Joomla Version: "
read -r VDM_JV
# make sure value was entered
[ ${#VDM_JV} -ge 1 ] || exit
}
[ ${#VDM_KEY} -ge 1 ] || {
echo -n "[enter] key: "
read -r VDM_KEY
# make sure value was entered
[ ${#VDM_KEY} -ge 1 ] || exit
}
[ ${#VDM_ENV_KEY} -ge 1 ] || {
echo -n "[enter:A] env key: "
read -r VDM_ENV_KEY
# make sure value was entered
[ ${#VDM_ENV_KEY} -ge 1 ] || VDM_ENV_KEY="A"
}
[ ${#VDM_SUBDOMAIN} -ge 1 ] || {
echo -n "[enter:${VDM_KEY}] Sub-domain: "
read -r VDM_SUBDOMAIN
# make sure value was entered
[ ${#VDM_SUBDOMAIN} -ge 1 ] || VDM_SUBDOMAIN=${VDM_KEY}
}
[ ${#VDM_DOMAIN} -ge 1 ] || {
VDM_DOMAIN="vdm.dev"
}
# check the security switch
REMOVE_SECURE=''
ENTRY_POINT="websecure"
# setup letsencrypt stuff
if [ "${VDM_SECURE,,}" == 'y' ]; then
# we add this switch to the env values
grep -q "VDM_SECURE=\"y\"" "${VDM_SRC_PATH}/.env" || echo "export VDM_SECURE=\"y\"" >>"${VDM_SRC_PATH}/.env"
else
# we add this switch to the env values
grep -q "VDM_SECURE=\"n\"" "${VDM_SRC_PATH}/.env" || echo "export VDM_SECURE=\"n\"" >>"${VDM_SRC_PATH}/.env"
# remove secure from build
REMOVE_SECURE="#"
ENTRY_POINT="web"
fi
# check if env is already set
# shellcheck disable=SC2015
[ -f "${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/.env" ] && grep -q "VDM_${VDM_ENV_KEY}_DB=" "${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/.env" || {
# add a space or create the file
[ -f "${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/.env" ] && echo '' >>"${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/.env"
# get the database name needed
echo -n "[enter:vdm_io] Database name: "
read -r vdm_database_name
# make sure value was entered
[ ${#vdm_database_name} -ge 1 ] || vdm_database_name="vdm_io"
# add to env
echo "VDM_${VDM_ENV_KEY}_DB=\"${vdm_database_name}\"" >>"${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/.env"
# get the database user name needed
echo -n "[enter:vdm_user] Database user: "
read -r vdm_database_user
# make sure value was entered
[ ${#vdm_database_user} -ge 1 ] || vdm_database_user="vdm_user"
# add to env
echo "VDM_${VDM_ENV_KEY}_DB_USER=\"${vdm_database_user}\"" >>"${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/.env"
# get the database user name needed
echo -n "[enter:random] Database user password: "
read -r vdm_database_pass
# make sure value was entered
[ ${#vdm_database_pass} -ge 1 ] || vdm_database_pass=$(getPass 20)
# add to env
echo "VDM_${VDM_ENV_KEY}_DB_PASS=\"${vdm_database_pass}\"" >>"${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/.env"
# get the database user name needed
echo -n "[enter:random] Database root password: "
read -r vdm_database_rootpass
# make sure value was entered
[ ${#vdm_database_rootpass} -ge 1 ] || vdm_database_rootpass=$(getPass 40)
# add to env
echo "VDM_${VDM_ENV_KEY}_DB_ROOT=\"${vdm_database_rootpass}\"" >>"${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/.env"
# add the projects path
grep -q "VDM_PROJECT_PATH=" "${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/.env" || {
# add to env
echo "VDM_PROJECT_PATH=\"${VDM_PROJECT_PATH}\"" >>"${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/.env"
}
}
# build function
function buildContainer() {
# we build the yml file
cat <<EOF
version: '2'
services:
mariadb_${VDM_KEY}:
image: mariadb:latest
container_name: mariadb_${VDM_KEY}
restart: unless-stopped
environment:
- MARIADB_DATABASE=\${VDM_${VDM_ENV_KEY}_DB}
- MARIADB_USER=\${VDM_${VDM_ENV_KEY}_DB_USER}
- MARIADB_PASSWORD=\${VDM_${VDM_ENV_KEY}_DB_PASS}
- MARIADB_ROOT_PASSWORD=\${VDM_${VDM_ENV_KEY}_DB_ROOT}
volumes:
- "\${VDM_PROJECT_PATH}/${VDM_KEY}/db:/var/lib/mysql"
networks:
- traefik
joomla_${VDM_KEY}:
image: joomla:${VDM_JV}
container_name: joomla_${VDM_KEY}
restart: unless-stopped
environment:
- JOOMLA_DB_HOST=mariadb_${VDM_KEY}:3306
- JOOMLA_DB_NAME=\${VDM_${VDM_ENV_KEY}_DB}
- JOOMLA_DB_USER=\${VDM_${VDM_ENV_KEY}_DB_USER}
- JOOMLA_DB_PASSWORD=\${VDM_${VDM_ENV_KEY}_DB_PASS}
depends_on:
- mariadb_${VDM_KEY}
volumes:
- "\${VDM_PROJECT_PATH}/${VDM_KEY}/joomla:/var/www/html"
networks:
- traefik
labels:
# joomla
- "traefik.enable=true"
- "traefik.http.routers.joomla_${VDM_KEY}.rule=Host(\`${VDM_SUBDOMAIN}.${VDM_DOMAIN}\`)"
- "traefik.http.routers.joomla_${VDM_KEY}.entrypoints=${ENTRY_POINT}"
${REMOVE_SECURE} - "traefik.http.routers.joomla_${VDM_KEY}.tls.certresolver=vdmresolver"
- "traefik.http.routers.joomla_${VDM_KEY}.service=joomla_${VDM_KEY}"
- "traefik.http.services.joomla_${VDM_KEY}.loadbalancer.server.port=80"
phpmyadmin_${VDM_KEY}:
image: phpmyadmin/phpmyadmin
container_name: phpmyadmin_${VDM_KEY}
restart: unless-stopped
environment:
PMA_HOST: mariadb_${VDM_KEY}
PMA_PORT: 3306
UPLOAD_LIMIT: 300M
depends_on:
- mariadb_${VDM_KEY}
networks:
- traefik
labels:
# phpmyadmin
- "traefik.enable=true"
- "traefik.http.routers.phpmyadmin_${VDM_KEY}.rule=Host(\`${VDM_SUBDOMAIN}db.${VDM_DOMAIN}\`)"
- "traefik.http.routers.phpmyadmin_${VDM_KEY}.entrypoints=${ENTRY_POINT}"
${REMOVE_SECURE} - "traefik.http.routers.phpmyadmin_${VDM_KEY}.tls.certresolver=vdmresolver"
- "traefik.http.routers.phpmyadmin_${VDM_KEY}.service=phpmyadmin_${VDM_KEY}"
- "traefik.http.services.phpmyadmin_${VDM_KEY}.loadbalancer.server.port=80"
networks:
traefik:
external:
name: traefik_webgateway
EOF
}
# set host file if needed
source "${VDM_SRC_PATH}/host.sh"
# create the directory if it does not yet already exist
# shellcheck disable=SC2174
mkdir -p -m 700 "${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/available/${VDM_SUBDOMAIN}.${VDM_DOMAIN}"
# place this docker composer file in its place
buildContainer >"${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/available/${VDM_SUBDOMAIN}.${VDM_DOMAIN}/docker-compose.yml"
# set permissions
chmod 600 "${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/available/${VDM_SUBDOMAIN}.${VDM_DOMAIN}/docker-compose.yml"
# saved the file
echo "[save] ${VDM_CONTAINER_TYPE}:docker-compose.yml"
# some house cleaning
PS3_old=$PS3
# ask if we should right now enable the container
echo "[question] Would you like to enable this new ${VDM_CONTAINER_TYPE} container?"
# set the terminal
export PS3="[select]: "
# shellcheck disable=SC1090
select yn in "Yes" "No"; do
case $yn in
Yes ) source "${VDM_SRC_PATH}/enable.sh" "${VDM_SUBDOMAIN}.${VDM_DOMAIN}";;
esac
break
done
# restore the default
export PS3=$PS3_old
echo "[setup] Completed!"

View File

@ -1,455 +0,0 @@
#!/bin/bash
# check that our repository path is correct
[ -e "${VDM_REPO_PATH}" ] || {
echo "[error] Repository path (${VDM_REPO_PATH}) does not exist."
exit 1
}
# check that our projects path is correct
[ -e "${VDM_PROJECT_PATH}" ] || {
echo "[error] Projects path (${VDM_PROJECT_PATH}) does not exist."
exit 1
}
# be sure to create the container type path
# shellcheck disable=SC2174
mkdir -p -m 700 "${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}"
# be sure to .ssh path exist
# shellcheck disable=SC2174
mkdir -p -m 700 "${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/.ssh"
# check if we have global env file
# shellcheck disable=SC1090
# shellcheck disable=SC2015
[ -f "${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/.env" ] && source "${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/.env" || {
touch "${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/.env"
chmod 600 "${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/.env"
}
# help message ʕ•ᴥ•ʔ
function show_help() {
cat <<EOF
Usage: ${0##*/:-} [OPTION...]
Options
======================================================
-u|--username <username>
set username of the container
example: ${0##*/:-} -u="ubuntu"
example: ${0##*/:-} --username="ubuntu"
======================================================
--uid <id>
set container user id
example: ${0##*/:-} --uid=1000
======================================================
--gid <id>
set container user group id
example: ${0##*/:-} --gid=1000
======================================================
-p|--port <port>
set ssh port to use
!! do not use 22 !!
example: ${0##*/:-} -p=2239
example: ${0##*/:-} --port=2239
======================================================
--ssh-dir <dir>
set ssh directory name found in the .ssh dir
of this repo for the container keys
This directory has separate files for
each public key allowed to access
the container
example: ${0##*/:-} --ssh-dir="teamname"
======================================================
--sudo
switch to add the container user to the
sudo group of the container
example: ${0##*/:-} --sudo
======================================================
-k|--key <key>
set key for the docker compose container naming
!! no spaces allowed in the key !!
example: ${0##*/:-} -k="vdm"
example: ${0##*/:-} --key="vdm"
======================================================
-e|--env-key <key>
set key for the environment variable naming
!! no spaces allowed in the key & must be UPPERCASE !!
example: ${0##*/:-} -e="VDM"
example: ${0##*/:-} --env-key="VDM"
======================================================
-d|--domain <domain.com>
set key website domain
!! must be domain.tld !!
example: ${0##*/:-} -d="vdm.dev"
example: ${0##*/:-} --domain="vdm.dev"
======================================================
-t|--time-zone <time/zone>
set time zone of the container
!! must valid time zone !!
example: ${0##*/:-} -t="Africa/Windhoek"
example: ${0##*/:-} --time-zone="Africa/Windhoek"
======================================================
-h|--help
display this help menu
example: ${0##*/:-} -h
example: ${0##*/:-} --help
======================================================
${BOT_NAME}
======================================================
EOF
}
# set the local values
while :; do
case $1 in
-h | --help)
show_help # Display a usage synopsis.
exit
;;
--sudo)
VDM_SUDO_ACCESS=true
shift
;;
-u | --username) # Takes an option argument; ensure it has been specified.
if [ "$2" ]; then
VDM_USER_NAME=$2
shift
else
echo '[error] "--username" requires a non-empty option argument.'
exit 17
fi
;;
-u=?* | --username=?*)
VDM_USER_NAME=${1#*=} # Delete everything up to "=" and assign the remainder.
;;
-u= | --username=) # Handle the case of an empty --username=
echo '[error] "--username=" requires a non-empty option argument.'
exit 17
;;
--uid) # Takes an option argument; ensure it has been specified.
if [ "$2" ]; then
VDM_PUID=$2
shift
else
echo '[error] "--uid" requires a non-empty option argument.'
exit 17
fi
;;
--uid=?*)
VDM_PUID=${1#*=} # Delete everything up to "=" and assign the remainder.
;;
--uid=) # Handle the case of an empty --uid=
echo '[error] "--uid=" requires a non-empty option argument.'
exit 17
;;
--gid) # Takes an option argument; ensure it has been specified.
if [ "$2" ]; then
VDM_PGID=$2
shift
else
echo '[error] "--gid" requires a non-empty option argument.'
exit 17
fi
;;
--gid=?*)
VDM_PGID=${1#*=} # Delete everything up to "=" and assign the remainder.
;;
--gid=) # Handle the case of an empty --gid=
echo '[error] "--gid=" requires a non-empty option argument.'
exit 17
;;
-p | --port) # Takes an option argument; ensure it has been specified.
if [ "$2" ]; then
VDM_PORT=$2
shift
else
echo '[error] "--port" requires a non-empty option argument.'
exit 17
fi
;;
-p=?* | --port=?*)
VDM_PORT=${1#*=} # Delete everything up to "=" and assign the remainder.
;;
-p= | --port=) # Handle the case of an empty --port=
echo '[error] "--port=" requires a non-empty option argument.'
exit 17
;;
--ssh-dir) # Takes an option argument; ensure it has been specified.
if [ "$2" ]; then
VDM_PUBLIC_KEY_DIR=$2
shift
else
echo '[error] "--ssh-dir" requires a non-empty option argument.'
exit 17
fi
;;
--ssh-dir=?*)
VDM_PUBLIC_KEY_DIR=${1#*=} # Delete everything up to "=" and assign the remainder.
;;
-ssh-dir=) # Handle the case of an empty --ssh-dir=
echo '[error] "--ssh-dir=" requires a non-empty option argument.'
exit 17
;;
-k | --key) # Takes an option argument; ensure it has been specified.
if [ "$2" ]; then
VDM_KEY=$2
shift
else
echo '[error] "--key" requires a non-empty option argument.'
exit 17
fi
;;
-k=?* | --key=?*)
VDM_KEY=${1#*=} # Delete everything up to "=" and assign the remainder.
;;
-k= | --key=) # Handle the case of an empty --key=
echo '[error] "--key=" requires a non-empty option argument.'
exit 17
;;
-e | --env-key) # Takes an option argument; ensure it has been specified.
if [ "$2" ]; then
VDM_ENV_KEY=$2
shift
else
echo '[error] "--env-key" requires a non-empty option argument.'
exit 17
fi
;;
-e=?* | --env-key=?*)
VDM_ENV_KEY=${1#*=} # Delete everything up to "=" and assign the remainder.
;;
-e= | --env-key=) # Handle the case of an empty --env-key=
echo '[error] "--env-key=" requires a non-empty option argument.'
exit 17
;;
-d | --domain) # Takes an option argument; ensure it has been specified.
if [ "$2" ]; then
VDM_DOMAIN=$2
shift
else
echo '[error] "--domain" requires a non-empty option argument.'
exit 17
fi
;;
-d=?* | --domain=?*)
VDM_DOMAIN=${1#*=} # Delete everything up to "=" and assign the remainder.
;;
-d= | --domain=) # Handle the case of an empty --domain=
echo '[error] "--domain=" requires a non-empty option argument.'
exit 17
;;
-t | --time-zone) # Takes an option argument; ensure it has been specified.
if [ "$2" ]; then
VDM_TZ=$2
shift
else
echo '[error] "--time-zone" requires a non-empty option argument.'
exit 17
fi
;;
-t=?* | --time-zone=?*)
VDM_TZ=${1#*=} # Delete everything up to "=" and assign the remainder.
;;
-t= | --time-zone=) # Handle the case of an empty --time-zone=
echo '[error] "--time-zone=" requires a non-empty option argument.'
exit 17
;;
*) # Default case: No more options, so break out of the loop.
break ;;
esac
shift
done
# check that we have what we need
[ ${#VDM_PORT} -ge 1 ] || {
echo -n "[enter] SSH Port: "
read -r VDM_PORT
# make sure value was entered
[ ${#VDM_PORT} -ge 1 ] || exit
}
[ ${#VDM_USER_NAME} -ge 1 ] || {
echo -n "[enter:ubuntu] UserName: "
read -r VDM_USER_NAME
}
[ ${#VDM_KEY} -ge 1 ] || {
echo -n "[enter:${VDM_USER_NAME:-ubuntu}] key: "
read -r VDM_KEY
# make sure value was entered
[ ${#VDM_KEY} -ge 1 ] || VDM_KEY="${VDM_USER_NAME:-ubuntu}"
}
[ ${#VDM_ENV_KEY} -ge 1 ] || {
echo -n "[enter:A] env key: "
read -r VDM_ENV_KEY
# make sure value was entered
[ ${#VDM_ENV_KEY} -ge 1 ] || VDM_ENV_KEY="A"
}
# we must get the global public key path
VDM_ENV_PUBLIC_KEY_GLOBAL_DIR="VDM_${VDM_ENV_KEY^^}_PUBLIC_KEY_GLOBAL_DIR"
VDM_PUBLIC_KEY_GLOBAL_DIR=${!VDM_ENV_PUBLIC_KEY_GLOBAL_DIR}
# shellcheck disable=SC2015
[ ${#VDM_PUBLIC_KEY_GLOBAL_DIR} -ge 1 ] && [ -d "${VDM_PUBLIC_KEY_GLOBAL_DIR}" ] || {
VDM_PUBLIC_KEY_GLOBAL_DIR="${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/.ssh"
# make sure value was entered
[ ${#VDM_PUBLIC_KEY_GLOBAL_DIR} -ge 1 ] && [ -d "${VDM_PUBLIC_KEY_GLOBAL_DIR}" ] || exit
# add to env file
echo "${VDM_ENV_PUBLIC_KEY_GLOBAL_DIR}=${VDM_PUBLIC_KEY_GLOBAL_DIR}" >>"${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/.env"
}
# get available public dir
function getPublicKeyDir() {
# some house cleaning
PS3_old=$PS3
# some defaults
export PS3="[select] Public ssh key directory: "
# we start the selection array
local SELECTED
# Start our little Menu
select public_dir in $(ls "${VDM_PUBLIC_KEY_GLOBAL_DIR}"); do
case $REPLY in
*)
SELECTED="${public_dir}"
;;
esac
break
done
# restore the default
export PS3=$PS3_old
# return selection
echo "${SELECTED}"
}
[ ${#VDM_PUBLIC_KEY_DIR} -ge 1 ] || {
VDM_PUBLIC_KEY_DIR=$(getPublicKeyDir)
# make sure value was entered
[ ${#VDM_PUBLIC_KEY_DIR} -ge 1 ] && [ -d "${VDM_PUBLIC_KEY_GLOBAL_DIR}/${VDM_PUBLIC_KEY_DIR}" ] || exit
}
# set the global key env string for the ssh keys
VDM_ENV_PUBLIC_KEY_U_DIR="VDM_${VDM_ENV_KEY^^}_PUBLIC_KEY_${VDM_PUBLIC_KEY_DIR^^}_DIR"
VDM_PUBLIC_KEY_U_DIR=${!VDM_ENV_PUBLIC_KEY_U_DIR}
# check if env is already set
# shellcheck disable=SC2015
[ -f "${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/.env" ] && grep -q "${VDM_ENV_PUBLIC_KEY_U_DIR}=" "${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/.env" || {
# add to env if not exist
[ ${#VDM_PUBLIC_KEY_U_DIR} -ge 1 ] && [ -d "${VDM_PUBLIC_KEY_U_DIR}" ] || {
echo "${VDM_ENV_PUBLIC_KEY_U_DIR}=${VDM_PUBLIC_KEY_GLOBAL_DIR}/${VDM_PUBLIC_KEY_DIR}" >>"${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/.env"
}
}
# we must get the project path
VDM_ENV_PROJECT_DIR="VDM_${VDM_ENV_KEY^^}_PROJECT_DIR"
VDM_PROJECT_DIR=${!VDM_ENV_PROJECT_DIR}
# shellcheck disable=SC2015
[ ${#VDM_PROJECT_DIR} -ge 1 ] && [ -d "${VDM_PROJECT_DIR}" ] || {
VDM_PROJECT_DIR="${VDM_PROJECT_PATH}"
# make sure value was entered
[ ${#VDM_PROJECT_DIR} -ge 1 ] && [ -d "${VDM_PROJECT_DIR}" ] || exit
# add to env file
echo "VDM_${VDM_ENV_KEY^^}_PROJECT_DIR=${VDM_PROJECT_DIR}" >>"${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/.env"
}
# return volume line
function getVolumeLine() {
# get the projects to mount
local line="$1"
# return line
cat <<EOF
- ${line}
EOF
}
# get available mounting projects
function getMountingProjects() {
# some house cleaning
PS3_old=$PS3
# some defaults
# some defaults
export PS3="[select] Projects to mount: "
# some buckets
FINISHED="n"
SELECTED=$(getVolumeLine "\${${VDM_ENV_PUBLIC_KEY_U_DIR}}:/config/ssh_public_keys")
until [ "${FINISHED}" = "y" ]; do
# Start our little Menu
select key in $(ls "${VDM_PROJECT_DIR}"); do
case $REPLY in
q | quit)
FINISHED="y"
;;
*)
SELECTED+=$(getVolumeLine "\${VDM_${VDM_ENV_KEY^^}_PROJECT_DIR}/${key}/joomla:/app/${key}")
FINISHED="n"
;;
esac
break
done
done
# restore the default
export PS3=$PS3_old
# return selection
echo "${SELECTED}"
}
# now load the projects
[ ${#VDM_MOUNT_PROJECTS} -ge 1 ] || {
echo "[enter] q to quit selecting"
# get the projects to mount
VDM_MOUNT_PROJECTS=$(getMountingProjects)
# get the mounting options
[ ${#VDM_MOUNT_PROJECTS} -ge 1 ] || exit 1
}
# all values loaded notice
echo "[All value loaded]"
# build function
function buildContainer() {
# get the projects to mount
local mount_projects="$1"
# we build the yml file
# we use 33 as this is the www-data ID
cat <<EOF
version: "2.1"
services:
openssh-server-${VDM_KEY}:
image: lscr.io/linuxserver/openssh-server
container_name: openssh-server-${VDM_KEY}
restart: unless-stopped
hostname: ${VDM_DOMAIN:-vdm.dev}
environment:
- PUID=${VDM_PUID:-33}
- PGID=${VDM_PGID:-33}
- TZ=${VDM_TZ:-Africa/Windhoek}
- PUBLIC_KEY_DIR=/config/ssh_public_keys
- SUDO_ACCESS=${VDM_SUDO_ACCESS:-false}
- USER_NAME=${VDM_USER_NAME:-ubuntu}
volumes:${mount_projects}
ports:
- ${VDM_PORT}:2222
networks:
- openssh
networks:
openssh:
external:
name: openssh_gateway
EOF
}
# create the directory if it does not yet already exist
# shellcheck disable=SC2174
mkdir -p -m 700 "${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/available/${VDM_USER_NAME:-ubuntu}.${VDM_DOMAIN:-vdm.dev}"
# place this docker composer file in its place
buildContainer "${VDM_MOUNT_PROJECTS}" >"${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/available/${VDM_USER_NAME:-ubuntu}.${VDM_DOMAIN:-vdm.dev}/docker-compose.yml"
# set permissions
chmod 600 "${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/available/${VDM_USER_NAME:-ubuntu}.${VDM_DOMAIN:-vdm.dev}/docker-compose.yml"
# saved the file
echo "[save] ${VDM_CONTAINER_TYPE}:docker-compose.yml"
# some house cleaning
PS3_old=$PS3
# ask if we should right now enable the container
echo "[question] Would you like to enable this new ${VDM_CONTAINER_TYPE} container?"
# set the terminal
export PS3="[select]: "
# shellcheck disable=SC1090
select yn in "Yes" "No"; do
case $yn in
Yes ) source "${VDM_SRC_PATH}/enable.sh" "${VDM_USER_NAME:-ubuntu}.${VDM_DOMAIN:-vdm.dev}";;
esac
break
done
# restore the default
export PS3=$PS3_old
echo "[setup] Completed!"

View File

@ -1,119 +0,0 @@
#!/bin/bash
# check that our source path is correct
[ -e "${VDM_SRC_PATH}" ] || {
echo "[error] Source path (${VDM_SRC_PATH}) does not exist."
exit 1
}
# check that our repository path is correct
[ -e "${VDM_REPO_PATH}" ] || {
echo "[error] Repository path (${VDM_REPO_PATH}) does not exist."
exit 1
}
# check that our projects path is correct
[ -e "${VDM_PROJECT_PATH}" ] || {
echo "[error] Projects path (${VDM_PROJECT_PATH}) does not exist."
exit 1
}
# be sure to create the container type path for traefik (just one container really)
# shellcheck disable=SC2174
mkdir -p -m 700 "${VDM_REPO_PATH}/traefik"
# check if we have global env file
[ -f "${VDM_REPO_PATH}/portainer/.env" ] && source "${VDM_REPO_PATH}/portainer/.env"
# set the local values
REMOVE_SECURE=''
ENTRY_POINT="websecure"
# check that we have what we need
if [ "${VDM_SECURE,,}" != 'y' ] && [ "${VDM_SECURE,,}" != 'n' ]; then
echo -n "[enter] Use letsencrypt (y/n): "
read -r VDM_SECURE
# make sure value was entered
if [ "${VDM_SECURE,,}" != 'y' ] && [ "${VDM_SECURE,,}" != 'n' ]; then
echo "[error] you must choose y or n"
exit 1
fi
fi
# get the domain if not set
[ ${#VDM_DOMAIN} -ge 1 ] || {
echo -n "[enter:localhost] Domain: "
read -r VDM_DOMAIN
# make sure value was entered
[ ${#VDM_DOMAIN} -ge 1 ] || exit
# we add the domain to the env (may have the VDM_DOMAIN value, but not the same domain)
grep -q "VDM_DOMAIN=\"${VDM_DOMAIN}\"" "${VDM_SRC_PATH}/.env" || echo "export VDM_DOMAIN=\"${VDM_DOMAIN}\"" >>"${VDM_SRC_PATH}/.env"
}
# setup letsencrypt stuff
if [ "${VDM_SECURE,,}" == 'y' ]; then
# we add this switch to the env values
grep -q "VDM_SECURE=\"y\"" "${VDM_SRC_PATH}/.env" || echo "export VDM_SECURE=\"y\"" >>"${VDM_SRC_PATH}/.env"
else
# we add this switch to the env values
grep -q "VDM_SECURE=\"n\"" "${VDM_SRC_PATH}/.env" || echo "export VDM_SECURE=\"n\"" >>"${VDM_SRC_PATH}/.env"
# remove secure from build
REMOVE_SECURE="#"
ENTRY_POINT="web"
fi
# build function
function buildContainer() {
# we build the yml file
cat <<EOF
version: "3.3"
services:
portainer:
image: portainer/portainer-ce:latest
container_name: portainer
command: -H unix:///var/run/docker.sock
restart: always
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- portainer_data:/data
labels:
# Frontend
- "traefik.enable=true"
- "traefik.http.routers.portainer.rule=Host(\`port.${VDM_DOMAIN}\`)"
- "traefik.http.routers.portainer.entrypoints=${ENTRY_POINT}"
${REMOVE_SECURE} - "traefik.http.routers.portainer.tls.certresolver=vdmresolver"
- "traefik.http.routers.portainer.service=portainer"
- "traefik.http.services.portainer.loadbalancer.server.port=9000"
# Edge
# - "traefik.http.routers.portaineredge.rule=Host(\`edge.${VDM_DOMAIN}\`)"
# - "traefik.http.routers.portaineredge.entrypoints=${ENTRY_POINT}"
# - "traefik.http.routers.portaineredge.tls.certresolver=vdmresolver"
# - "traefik.http.routers.portaineredge.service=portaineredge"
# - "traefik.http.services.portaineredge.loadbalancer.server.port=8000"
networks:
- traefik
volumes:
portainer_data:
networks:
traefik:
external:
name: traefik_webgateway
EOF
}
# set host file if needed
source "${VDM_SRC_PATH}/host.sh" "port"
## create the directory if it does not yet already exist
# shellcheck disable=SC2174
mkdir -p -m 700 "${VDM_REPO_PATH}/portainer"
## place this docker composer file in its place
buildContainer >"${VDM_REPO_PATH}/portainer/docker-compose.yml"
## set permissions
chmod 600 "${VDM_REPO_PATH}/portainer/docker-compose.yml"
[ -f "${VDM_REPO_PATH}/portainer/.env" ] && chmod 600 "${VDM_REPO_PATH}/portainer/.env" &&
ENV_FILE="${VDM_REPO_PATH}/portainer/.env" || ENV_FILE="${VDM_REPO_PATH}/src/.env"
## saved the file
echo "[saved] portainer:docker-compose.yml"
echo "[setup] Completed!"
# now start the container
docker-compose --env-file "${ENV_FILE}" --file "${VDM_REPO_PATH}/portainer/docker-compose.yml" up -d

View File

@ -1,140 +0,0 @@
#!/bin/bash
# check that our source path is correct
[ -e "${VDM_SRC_PATH}" ] || {
echo "[error] Source path (${VDM_SRC_PATH}) does not exist."
exit 1
}
# check that our repository path is correct
[ -e "${VDM_REPO_PATH}" ] || {
echo "[error] Repository path (${VDM_REPO_PATH}) does not exist."
exit 1
}
# check that our projects path is correct
[ -e "${VDM_PROJECT_PATH}" ] || {
echo "[error] Projects path (${VDM_PROJECT_PATH}) does not exist."
exit 1
}
# be sure to create the container type path for traefik (just one container really)
# shellcheck disable=SC2174
mkdir -p -m 700 "${VDM_REPO_PATH}/traefik"
# check if we have global env file
[ -f "${VDM_REPO_PATH}/traefik/.env" ] && source "${VDM_REPO_PATH}/traefik/.env"
# set the local values
REMOVE_SECURE=''
HTTP_SCHEME="https"
# check that we have what we need
if [ "${VDM_SECURE,,}" != 'y' ] && [ "${VDM_SECURE,,}" != 'n' ]; then
echo -n "[enter] Use letsencrypt (y/n): "
read -r VDM_SECURE
# make sure value was entered
if [ "${VDM_SECURE,,}" != 'y' ] && [ "${VDM_SECURE,,}" != 'n' ]; then
echo "[error] you must choose y or n"
exit 1
fi
fi
# get the domain if not set
[ ${#VDM_DOMAIN} -ge 1 ] || {
echo -n "[enter:localhost] Domain: "
read -r VDM_DOMAIN
# make sure value was entered
[ ${#VDM_DOMAIN} -ge 1 ] || exit
# we add the domain to the env (may have the VDM_DOMAIN value, but not the same domain)
grep -q "VDM_DOMAIN=\"${VDM_DOMAIN}\"" "${VDM_SRC_PATH}/.env" || echo "export VDM_DOMAIN=\"${VDM_DOMAIN}\"" >>"${VDM_SRC_PATH}/.env"
}
# setup letsencrypt stuff
if [ "${VDM_SECURE,,}" == 'y' ]; then
# we add this switch to the env values
grep -q "VDM_SECURE=\"y\"" "${VDM_SRC_PATH}/.env" || echo "export VDM_SECURE=\"y\"" >>"${VDM_SRC_PATH}/.env"
# get the email if not set
[ ${#VDM_SECURE_EMAIL} -ge 1 ] || {
echo -n "[enter] Email: "
read -r VDM_SECURE_EMAIL
# make sure value was entered
[ ${#VDM_SECURE_EMAIL} -ge 1 ] || exit
}
else
# we add this switch to the env values
grep -q "VDM_SECURE=\"n\"" "${VDM_SRC_PATH}/.env" || echo "export VDM_SECURE=\"n\"" >>"${VDM_SRC_PATH}/.env"
# remove secure from build
REMOVE_SECURE="#"
HTTP_SCHEME="http"
fi
# build function
function buildContainer() {
# we build the yml file
cat <<EOF
version: "3.3"
services:
traefik:
container_name: traefik
image: "traefik:latest"
command:
- --entrypoints.web.address=:80
- --entrypoints.websecure.address=:443
# - --api.dashboard=true
# - --api.insecure=true
- --providers.docker
- --log.level=INFO
${REMOVE_SECURE} - --certificatesresolvers.vdmresolver.acme.httpchallenge=true
${REMOVE_SECURE} - --certificatesresolvers.vdmresolver.acme.keytype=RSA4096
${REMOVE_SECURE} - --certificatesresolvers.vdmresolver.acme.email=${VDM_SECURE_EMAIL:-user@demo.com}
${REMOVE_SECURE} - --certificatesresolvers.vdmresolver.acme.storage=/acme.json
${REMOVE_SECURE} - --certificatesresolvers.vdmresolver.acme.httpchallenge.entrypoint=web
# - --providers.file.directory=/conf
# - --providers.file.watch=true
restart: unless-stopped
ports:
- "80:80"
- "443:443"
# - "8080:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
# - "\${VDM_PROJECT_PATH}/traefik/conf:/conf"
${REMOVE_SECURE} - "\${VDM_PROJECT_PATH}/traefik/acme.json:/acme.json"
- "\${VDM_PROJECT_PATH}/traefik/errors:/errors"
labels:
# settings for all containers
- "traefik.http.routers.http-catchall.rule=hostregexp(\`{host:.+}\`)"
- "traefik.http.routers.http-catchall.entrypoints=web"
- "traefik.http.routers.http-catchall.middlewares=redirect-to-me"
- "traefik.http.middlewares.redirect-to-me.redirectscheme.scheme=${HTTP_SCHEME}"
networks:
- traefik
networks:
traefik:
external:
name: traefik_webgateway
EOF
}
## create the directory if it does not yet already exist
# shellcheck disable=SC2174
mkdir -p -m 700 "${VDM_REPO_PATH}/traefik"
## place this docker composer file in its place
buildContainer >"${VDM_REPO_PATH}/traefik/docker-compose.yml"
## set permissions
chmod 600 "${VDM_REPO_PATH}/traefik/docker-compose.yml"
[ -f "${VDM_REPO_PATH}/traefik/.env" ] && chmod 600 "${VDM_REPO_PATH}/traefik/.env" &&
ENV_FILE="${VDM_REPO_PATH}/traefik/.env" || ENV_FILE="${VDM_REPO_PATH}/src/.env"
## saved the file
echo "[saved] traefik:docker-compose.yml"
echo "[setup] Completed!"
# we create the networks
docker network inspect traefik_webgateway >/dev/null 2>&1 ||
docker network create traefik_webgateway
docker network inspect openssh_gateway >/dev/null 2>&1 ||
docker network create openssh_gateway
# make sure port 80 is not used by apache
command -v apache2 >/dev/null 2>&1 && [[ $(service apache2 status) == *"active (running)"* ]] && {
sudo systemctl stop apache2.service
sudo systemctl disable apache2.service
}
# now start the container
docker-compose --env-file "${ENV_FILE}" --file "${VDM_REPO_PATH}/traefik/docker-compose.yml" up -d

View File

@ -1,51 +0,0 @@
#!/bin/bash
# check that our repository path is correct
[ -e "${VDM_SRC_PATH}" ] || {
echo "[error] Source path (${VDM_SRC_PATH}) does not exist."
exit 1
}
# check that our projects path is correct
[ -e "${VDM_PROJECT_PATH}" ] || {
echo "[error] Projects path (${VDM_PROJECT_PATH}) does not exist."
exit 1
}
# get container type
function getContainerType() {
# some house cleaning
PS3_old=$PS3
# some defaults
export PS3="Please select the kind of container to setup: "
# Start our little Menu (only these two for now)
select menu in "joomla" "openssh"; do
case $REPLY in
*)
SELECTED="$menu"
;;
esac
break
done
# restore the default
export PS3=$PS3_old
# return selection
echo "$SELECTED"
}
# set the local values
VDM_CONTAINER_TYPE="${1:-$VDM_CONTAINER_TYPE}"
# check that we have what we need
[ ${#VDM_CONTAINER_TYPE} -ge 1 ] || {
VDM_CONTAINER_TYPE=$(getContainerType)
# make sure value was entered
[ ${#VDM_CONTAINER_TYPE} -ge 1 ] || {
echo "[error] Wrong container type selected"
exit 1
}
}
export VDM_CONTAINER_TYPE
# run that container setup script
# shellcheck disable=SC1090
source "${VDM_SRC_PATH}/setup-${VDM_CONTAINER_TYPE}.sh"

View File

@ -1,77 +0,0 @@
#!/bin/bash
# BOT name
BOT_NAME="docker-deploy v1.0"
# we load global environment values
# shellcheck disable=SC2015
[ -f "${VDM_SRC_PATH}/.env" ] && source "${VDM_SRC_PATH}/.env" || {
echo "${VDM_SRC_PATH}/.env file not found, please run install."
exit 1
}
# take down all containers
# shellcheck disable=SC1090
# ----------------------------------------------------- MULTI CONTAINERS
# check if we have possible joomla containers
if [ -e "${VDM_REPO_PATH}/joomla/enabled" ]; then
echo -n "[enter:y] Take down Joomla containers [y/n]: "
read -r VDM_DOWN_JOOMLA
# set the default if empty
VDM_DOWN_JOOMLA="${VDM_DOWN_JOOMLA:-y}"
# make sure it exist
if [ "${VDM_DOWN_JOOMLA,,}" != 'n' ]; then
export VDM_CONTAINER_TYPE="joomla"
source "${VDM_SRC_PATH}/down.sh"
fi
# remove all enabled
rm -fr "${VDM_REPO_PATH}/joomla/enabled"
fi
# check if we have possible openssh containers
if [ -e "${VDM_REPO_PATH}/openssh/enabled" ]; then
echo -n "[enter:y] Take down Openssh containers [y/n]: "
read -r VDM_DOWN_OPENSSH
# set the default if empty
VDM_DOWN_OPENSSH="${VDM_DOWN_OPENSSH:-y}"
# make sure it exist
if [ "${VDM_DOWN_OPENSSH,,}" != 'n' ]; then
export VDM_CONTAINER_TYPE="openssh"
source "${VDM_SRC_PATH}/down.sh"
fi
# remove all enabled
rm -fr "${VDM_REPO_PATH}/openssh/enabled"
fi
# ----------------------------------------------------- SINGLE CONTAINER
# check if we have possible portainer container
if [ -f "${VDM_REPO_PATH}/portainer/docker-compose.yml" ]; then
echo -n "[enter:y] Take down Portainer container [y/n]: "
read -r VDM_DOWN_PORTAINER
# set the default if empty
VDM_DOWN_PORTAINER="${VDM_DOWN_PORTAINER:-y}"
# make sure it exist
if [ "${VDM_DOWN_PORTAINER,,}" != 'n' ]; then
docker-compose --file "${VDM_REPO_PATH}/portainer/docker-compose.yml" down
fi
# we just have one yml file here (so dont remove it for now)
# rm -fr "${VDM_REPO_PATH}/portainer"
fi
# check if we have possible traefik container
if [ -f "${VDM_REPO_PATH}/traefik/docker-compose.yml" ]; then
echo -n "[enter:y] Take down Traefik container [y/n]: "
read -r VDM_DOWN_TRAEFIK
# set the default if empty
VDM_DOWN_TRAEFIK="${VDM_DOWN_TRAEFIK:-y}"
# make sure it exist
if [ "${VDM_DOWN_TRAEFIK,,}" != 'n' ]; then
docker-compose --file "${VDM_REPO_PATH}/traefik/docker-compose.yml" down
fi
# we just have one yml file here (so dont remove it for now)
# rm -fr "${VDM_REPO_PATH}/traefik"
fi
# ----------------------------------------------------- REMOVE SCRIPT
# now remove the docker-deploy script
sudo rm /usr/local/bin/docker-deploy
echo "[notice] ${BOT_NAME} has been uninstalled."
exit 0

View File

@ -1,27 +0,0 @@
#!/bin/bash
# check that our repository path is correct
[ -e "${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/enabled" ] || {
echo "[error] Repository path (${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/enabled) does not exist, first enable some containers."
exit 1
}
# check that our projects path is correct
[ -e "${VDM_PROJECT_PATH}" ] || {
echo "[error] Projects path (${VDM_PROJECT_PATH}) does not exist."
exit 1
}
# the main function
main() {
# get all zip files
for yml in "${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/enabled/"*/*.yml; do
# get the vdm_container value
vdm_container="${yml%/docker-compose.yml}"
# check if image has its own env file also
[ -f "${vdm_container}/.env" ] && ENV_FILE="${vdm_container}/.env" || ENV_FILE="${VDM_REPO_PATH}/${VDM_CONTAINER_TYPE}/.env"
docker-compose --env-file "${ENV_FILE}" --file "${yml}" up -d
done
}
# run main
main