177 lines
5.4 KiB
Bash
Executable File
177 lines
5.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
# ===================================================================
|
|
# Kompose Stack .env Migration Script
|
|
# ===================================================================
|
|
# This script updates all stack .env files to:
|
|
# 1. Add TRAEFIK_ENABLED=true (if not present)
|
|
# 2. Update TRAEFIK_HOST to use root .env variable
|
|
# 3. Remove sensitive secrets (move to secrets.env)
|
|
# 4. Add standardized comments
|
|
# ===================================================================
|
|
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
RESET='\033[0m'
|
|
|
|
log_info() {
|
|
echo -e "${BLUE}[INFO]${RESET} $*"
|
|
}
|
|
|
|
log_success() {
|
|
echo -e "${GREEN}[SUCCESS]${RESET} $*"
|
|
}
|
|
|
|
log_warning() {
|
|
echo -e "${YELLOW}[WARNING]${RESET} $*"
|
|
}
|
|
|
|
update_stack_env() {
|
|
local stack="$1"
|
|
local env_file="${SCRIPT_DIR}/${stack}/.env"
|
|
|
|
if [[ ! -f "${env_file}" ]]; then
|
|
log_warning "No .env file in ${stack}, skipping"
|
|
return
|
|
fi
|
|
|
|
log_info "Updating ${stack}/.env..."
|
|
|
|
local temp_file="${env_file}.new"
|
|
|
|
# Read stack name
|
|
local project_name=$(grep "^COMPOSE_PROJECT_NAME=" "${env_file}" | cut -d= -f2)
|
|
local has_traefik_enabled=false
|
|
local has_traefik_host=false
|
|
|
|
# Check if file already has TRAEFIK_ENABLED
|
|
if grep -q "^TRAEFIK_ENABLED=" "${env_file}"; then
|
|
has_traefik_enabled=true
|
|
fi
|
|
|
|
# Check if file has TRAEFIK_HOST
|
|
if grep -q "^TRAEFIK_HOST=" "${env_file}"; then
|
|
has_traefik_host=true
|
|
fi
|
|
|
|
# Start building new file
|
|
{
|
|
echo "# ================================================================="
|
|
echo "# ${stack^^} Stack Configuration"
|
|
echo "# ================================================================="
|
|
echo ""
|
|
echo "# Stack identification"
|
|
|
|
# Copy COMPOSE_PROJECT_NAME
|
|
grep "^COMPOSE_PROJECT_NAME=" "${env_file}" || echo "COMPOSE_PROJECT_NAME=${stack}"
|
|
|
|
echo ""
|
|
echo "# Docker image"
|
|
grep "^DOCKER_IMAGE=" "${env_file}" 2>/dev/null || true
|
|
|
|
# Add database if present
|
|
if grep -q "^DB_NAME=" "${env_file}"; then
|
|
echo ""
|
|
echo "# Database name"
|
|
grep "^DB_NAME=" "${env_file}"
|
|
fi
|
|
|
|
echo ""
|
|
echo "# Traefik configuration"
|
|
|
|
# Add TRAEFIK_ENABLED if not present
|
|
if ${has_traefik_enabled}; then
|
|
grep "^TRAEFIK_ENABLED=" "${env_file}"
|
|
else
|
|
echo "TRAEFIK_ENABLED=true"
|
|
fi
|
|
|
|
# Update TRAEFIK_HOST to reference root variable
|
|
if ${has_traefik_host}; then
|
|
local uppercase_stack=$(echo "${stack}" | tr '[:lower:]' '[:upper:]')
|
|
echo "TRAEFIK_HOST=\${TRAEFIK_HOST_${uppercase_stack}}"
|
|
fi
|
|
|
|
# Copy APP_PORT if present
|
|
if grep -q "^APP_PORT=" "${env_file}"; then
|
|
echo ""
|
|
echo "# Application port"
|
|
grep "^APP_PORT=" "${env_file}"
|
|
fi
|
|
|
|
# Copy other non-sensitive variables
|
|
echo ""
|
|
echo "# Additional configuration"
|
|
grep -v "^COMPOSE_PROJECT_NAME=" "${env_file}" | \
|
|
grep -v "^DOCKER_IMAGE=" | \
|
|
grep -v "^DB_NAME=" | \
|
|
grep -v "^TRAEFIK_ENABLED=" | \
|
|
grep -v "^TRAEFIK_HOST=" | \
|
|
grep -v "^APP_PORT=" | \
|
|
grep -v "^#" | \
|
|
grep -v "^$" | \
|
|
grep -v "_SECRET=" | \
|
|
grep -v "_PASSWORD=" | \
|
|
grep -v "_TOKEN=" | \
|
|
grep -v "_KEY=" || true
|
|
|
|
# Add note about secrets
|
|
echo ""
|
|
echo "# NOTE: Secrets are stored in root secrets.env file"
|
|
echo "# Available secrets for this stack:"
|
|
local uppercase_stack=$(echo "${stack}" | tr '[:lower:]' '[:upper:]')
|
|
|
|
# List stack-specific secrets from template
|
|
if [[ -f "${SCRIPT_DIR}/secrets.env.template" ]]; then
|
|
grep "^${uppercase_stack}_" "${SCRIPT_DIR}/secrets.env.template" | \
|
|
sed 's/^/# - /' || true
|
|
fi
|
|
|
|
} > "${temp_file}"
|
|
|
|
# Show diff
|
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
echo "Changes for ${stack}/.env:"
|
|
diff -u "${env_file}" "${temp_file}" || true
|
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
echo ""
|
|
|
|
# Ask for confirmation
|
|
read -p "Apply these changes? (y/N): " -n 1 -r
|
|
echo
|
|
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
|
mv "${env_file}" "${env_file}.bak"
|
|
mv "${temp_file}" "${env_file}"
|
|
log_success "Updated ${stack}/.env (backup: ${stack}/.env.bak)"
|
|
else
|
|
rm "${temp_file}"
|
|
log_info "Skipped ${stack}/.env"
|
|
fi
|
|
}
|
|
|
|
# Main migration
|
|
main() {
|
|
log_info "Starting stack .env migration..."
|
|
echo ""
|
|
|
|
# Get all stacks
|
|
local stacks=(auth auto blog chain chat code dash data dock docs home link news proxy sexy trace track vault vpn)
|
|
|
|
for stack in "${stacks[@]}"; do
|
|
if [[ -d "${SCRIPT_DIR}/${stack}" ]]; then
|
|
update_stack_env "${stack}"
|
|
echo ""
|
|
fi
|
|
done
|
|
|
|
log_success "Migration complete!"
|
|
log_info "Review the changes and test with: ./kompose.sh --list"
|
|
}
|
|
|
|
main "$@"
|