179 lines
5.0 KiB
Bash
179 lines
5.0 KiB
Bash
#!/usr/bin/env bash
|
|
|
|
set -e
|
|
|
|
: "${TRMM_USER:=tactical}"
|
|
: "${TRMM_PASS:=tactical}"
|
|
: "${POSTGRES_HOST:=tactical-postgres}"
|
|
: "${POSTGRES_PORT:=5432}"
|
|
: "${POSTGRES_USER:=tactical}"
|
|
: "${POSTGRES_PASS:=tactical}"
|
|
: "${POSTGRES_DB:=tacticalrmm}"
|
|
: "${MESH_CONTAINER:=tactical-meshcentral}"
|
|
: "${MESH_USER:=meshcentral}"
|
|
: "${MESH_PASS:=meshcentralpass}"
|
|
: "${MESH_HOST:=tactical-meshcentral}"
|
|
: "${API_HOST:=tactical-backend}"
|
|
: "${APP_HOST:=tactical-frontend}"
|
|
: "${REDIS_HOST:=tactical-redis}"
|
|
|
|
|
|
function check_tactical_ready {
|
|
sleep 15
|
|
until [ -f "${TACTICAL_READY_FILE}" ]; do
|
|
echo "waiting for init container to finish install or update..."
|
|
sleep 10
|
|
done
|
|
}
|
|
|
|
# tactical-init
|
|
if [ "$1" = 'tactical-init' ]; then
|
|
|
|
test -f "${TACTICAL_READY_FILE}" && rm "${TACTICAL_READY_FILE}"
|
|
|
|
# copy container data to volume
|
|
rsync -a --no-perms --no-owner --delete --exclude "tmp/*" --exclude "certs/*" --exclude="api/tacticalrmm/private/*" "${TACTICAL_TMP_DIR}/" "${TACTICAL_DIR}/"
|
|
|
|
mkdir -p ${TACTICAL_DIR}/tmp
|
|
mkdir -p ${TACTICAL_DIR}/api/tacticalrmm/private/exe
|
|
mkdir -p ${TACTICAL_DIR}/api/tacticalrmm/logs
|
|
|
|
until (echo > /dev/tcp/"${POSTGRES_HOST}"/"${POSTGRES_PORT}") &> /dev/null; do
|
|
echo "waiting for postgresql container to be ready..."
|
|
sleep 5
|
|
done
|
|
|
|
until (echo > /dev/tcp/"${MESH_CONTAINER}"/443) &> /dev/null; do
|
|
echo "waiting for meshcentral container to be ready..."
|
|
sleep 5
|
|
done
|
|
|
|
# configure django settings
|
|
MESH_TOKEN=$(cat ${TACTICAL_DIR}/tmp/mesh_token)
|
|
ADMINURL=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 70 | head -n 1)
|
|
DJANGO_SEKRET=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 80 | head -n 1)
|
|
|
|
localvars="$(cat << EOF
|
|
SECRET_KEY = '${DJANGO_SEKRET}'
|
|
|
|
DEBUG = False
|
|
|
|
DOCKER_BUILD = True
|
|
|
|
CERT_FILE = '/opt/tactical/certs/fullchain.pem'
|
|
KEY_FILE = '/opt/tactical/certs/privkey.pem'
|
|
|
|
EXE_DIR = '/opt/tactical/api/tacticalrmm/private/exe'
|
|
LOG_DIR = '/opt/tactical/api/tacticalrmm/private/log'
|
|
|
|
SCRIPTS_DIR = '/opt/tactical/scripts'
|
|
|
|
ALLOWED_HOSTS = ['${API_HOST}', 'tactical-backend']
|
|
|
|
ADMIN_URL = '${ADMINURL}/'
|
|
|
|
CORS_ORIGIN_WHITELIST = [
|
|
'https://${APP_HOST}'
|
|
]
|
|
|
|
DATABASES = {
|
|
'default': {
|
|
'ENGINE': 'django.db.backends.postgresql',
|
|
'NAME': '${POSTGRES_DB}',
|
|
'USER': '${POSTGRES_USER}',
|
|
'PASSWORD': '${POSTGRES_PASS}',
|
|
'HOST': '${POSTGRES_HOST}',
|
|
'PORT': '${POSTGRES_PORT}',
|
|
}
|
|
}
|
|
|
|
REST_FRAMEWORK = {
|
|
'DATETIME_FORMAT': '%b-%d-%Y - %H:%M',
|
|
|
|
'DEFAULT_PERMISSION_CLASSES': (
|
|
'rest_framework.permissions.IsAuthenticated',
|
|
),
|
|
'DEFAULT_AUTHENTICATION_CLASSES': (
|
|
'knox.auth.TokenAuthentication',
|
|
),
|
|
}
|
|
|
|
if not DEBUG:
|
|
REST_FRAMEWORK.update({
|
|
'DEFAULT_RENDERER_CLASSES': (
|
|
'rest_framework.renderers.JSONRenderer',
|
|
)
|
|
})
|
|
|
|
MESH_USERNAME = '${MESH_USER}'
|
|
MESH_SITE = 'https://${MESH_HOST}'
|
|
MESH_TOKEN_KEY = '${MESH_TOKEN}'
|
|
REDIS_HOST = '${REDIS_HOST}'
|
|
MESH_WS_URL = 'ws://${MESH_CONTAINER}:443'
|
|
ADMIN_ENABLED = False
|
|
EOF
|
|
)"
|
|
|
|
echo "${localvars}" > ${TACTICAL_DIR}/api/tacticalrmm/local_settings.py
|
|
|
|
# run migrations and init scripts
|
|
python manage.py migrate --no-input
|
|
python manage.py collectstatic --no-input
|
|
python manage.py initial_db_setup
|
|
python manage.py initial_mesh_setup
|
|
python manage.py load_chocos
|
|
python manage.py load_community_scripts
|
|
python manage.py reload_nats
|
|
|
|
# create super user
|
|
echo "from accounts.models import User; User.objects.create_superuser('${TRMM_USER}', 'admin@example.com', '${TRMM_PASS}') if not User.objects.filter(username='${TRMM_USER}').exists() else 0;" | python manage.py shell
|
|
|
|
# chown everything to tactical user
|
|
chown -R "${TACTICAL_USER}":"${TACTICAL_USER}" "${TACTICAL_DIR}"
|
|
|
|
# create install ready file
|
|
su -c "echo 'tactical-init' > ${TACTICAL_READY_FILE}" "${TACTICAL_USER}"
|
|
|
|
fi
|
|
|
|
# backend container
|
|
if [ "$1" = 'tactical-backend' ]; then
|
|
check_tactical_ready
|
|
|
|
# Prepare log files and start outputting logs to stdout
|
|
mkdir -p ${TACTICAL_DIR}/api/tacticalrmm/logs
|
|
touch ${TACTICAL_DIR}/api/tacticalrmm/logs/gunicorn.log
|
|
touch ${TACTICAL_DIR}/api/tacticalrmm/logs/gunicorn-access.log
|
|
tail -n 0 -f ${TACTICAL_DIR}/api/tacticalrmm/logs/gunicorn*.log &
|
|
|
|
export DJANGO_SETTINGS_MODULE=tacticalrmm.settings
|
|
|
|
exec gunicorn tacticalrmm.wsgi:application \
|
|
--name tactical-backend \
|
|
--bind 0.0.0.0:80 \
|
|
--workers 5 \
|
|
--log-level=info \
|
|
--log-file=${TACTICAL_DIR}/api/tacticalrmm/logs/gunicorn.log \
|
|
--access-logfile=${TACTICAL_DIR}/api/tacticalrmm/logs/gunicorn-access.log \
|
|
|
|
fi
|
|
|
|
if [ "$1" = 'tactical-celery' ]; then
|
|
check_tactical_ready
|
|
celery -A tacticalrmm worker -l info
|
|
fi
|
|
|
|
if [ "$1" = 'tactical-celerybeat' ]; then
|
|
check_tactical_ready
|
|
test -f "${TACTICAL_DIR}/api/celerybeat.pid" && rm "${TACTICAL_DIR}/api/celerybeat.pid"
|
|
celery -A tacticalrmm beat -l info
|
|
fi
|
|
|
|
# backend container
|
|
if [ "$1" = 'tactical-websockets' ]; then
|
|
check_tactical_ready
|
|
|
|
export DJANGO_SETTINGS_MODULE=tacticalrmm.settings
|
|
|
|
daphne tacticalrmm.asgi:application --port 8383 -b 0.0.0.0
|
|
fi |