dx/dxkit/modules/env.module.sh

92 lines
2.3 KiB
Bash

#!/usr/bin/env bash
function env::on_load() {
env::defaults
env::load_globals
}
function env::artifact::path() { path::relative_to_root "$(ctx::artifact::path env)"; }
function env::artifact::resolved() { path::relative_to_root "$(ctx::artifact::path env)/${ENVIRONMENT}.resolved.env"; }
function env::project::name() { echo "${PROJECT_NAME}"; }
# ============================================
# Defaults
# ============================================
function env::defaults() {
: "${PROJECT_NAME:=$(basename "$(ctx::root)")}"
: "${APP_FRAMEWORK:=yii2-advanced}"
: "${APP_PORT:=auto:8080}"
: "${TLD:="lan"}"
: "${DB_DRIVER:=db}"
: "${DB_IMAGE:=mariadb:latest}"
: "${DB_ENGINE:=mysql}"
: "${DB_PORT:=auto}"
: "${PROXY_SERVICE:=traefik}"
: "${PROXY_NETWORK:=proxy}"
# Environment
: "${ENVIRONMENT:=dev}"
}
function env::defaults::derived() {
APP_IMAGE="${APP_IMAGE:-${PROJECT_NAME}-app}"
DB_NAME="${DB_NAME:-${PROJECT_NAME}}"
DB_HOST="${DB_HOST:-${PROJECT_NAME}-${DB_DRIVER}}"
DOMAIN="${DOMAIN:-${PROJECT_NAME}.${TLD}}"
BACKEND_DOMAIN="${BACKEND_DOMAIN:-admin.${DOMAIN}}"
}
# ============================================
function env::load_globals() {
load_file required "$(ctx::env)/globals.env";
env::defaults::derived
}
function env::load_environment() {
load_file optional "$(ctx::artifact::path env)/${ENVIRONMENT}.env"
env::defaults::derived
}
function env::load_environment_resolved() {
load_file optional "$(env::artifact::resolved)"
}
function env::load_env_files() {
set -a
env::load_globals || { set +a; exit 1; }
env::load_environment
env::load_environment_resolved
set +a
}
function env::set_env_var() {
local key="$1"
local value="$2"
local file="${3:-$(ctx::artifact::path env)/${ENVIRONMENT}.env}"
touch "$file"
if grep -q "^${key}=" "$file"; then
fs::sed_inplace "s/^${key}=.*/${key}=${value}/" "$file"
else
printf "\n%s=%s" "$key" "$value" >> "$file"
fi
}
# ============================================
# Derived
# ============================================
function env::derive() {
APP_IMAGE="${PROJECT_NAME}-app"
DOMAIN="${PROJECT_NAME}.${TLD}"
BACKEND_DOMAIN="admin-${PROJECT_NAME}.${TLD}"
DB_HOST="${PROJECT_NAME}-db"
DB_NAME="${PROJECT_NAME}"
export APP_IMAGE DOMAIN BACKEND_DOMAIN DB_HOST DB_NAME
}