Files
home/Projects/kompose/migrate-stack-env.sh

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 "$@"