#!/usr/bin/env sh set -eu DB_TARGET="${1:-sqlite}" STACK_NAME="${STACK_NAME:-ksef_app}" COMPOSE_FILE="${COMPOSE_FILE:-docker-compose.yml}" SSL_DIR="${SSL_DIR:-./deploy/caddy/ssl}" if [ -f .env ]; then set -a . ./.env set +a fi APP_DOMAIN="${APP_DOMAIN:-localhost}" APP_EXTERNAL_SCHEME="${APP_EXTERNAL_SCHEME:-https}" EXPOSE_PORT="${EXPOSE_PORT:-8785}" CERT_FILE="${CERT_FILE:-${SSL_DIR}/server.crt}" KEY_FILE="${KEY_FILE:-${SSL_DIR}/server.key}" log() { printf '%s\n' "$*" } need_cmd() { command -v "$1" >/dev/null 2>&1 || { printf 'Brak wymaganego polecenia: %s\n' "$1" >&2 exit 1 } } need_cmd docker need_cmd openssl mkdir -p "$SSL_DIR" case "$DB_TARGET" in sqlite) export DB_ENGINE=sqlite export DB_HOST="" export DB_PORT="" COMPOSE_PROFILES="" mkdir -p ./db/sqlite DB_PATH_INFO="./db/sqlite/app.db" ;; pgsql|postgres|postgresql) export DB_ENGINE=pgsql export DB_HOST="${DB_HOST:-postgres}" export DB_PORT="${DB_PORT:-5432}" COMPOSE_PROFILES="pgsql" mkdir -p ./db/pgsql DB_PATH_INFO="./db/pgsql" ;; mysql) export DB_ENGINE=mysql export DB_HOST="${DB_HOST:-mysql}" export DB_PORT="${DB_PORT:-3306}" COMPOSE_PROFILES="mysql" mkdir -p ./db/mysql DB_PATH_INFO="./db/mysql" ;; *) printf 'Nieznany typ bazy: %s\n' "$DB_TARGET" >&2 printf 'Użycie: ./deploy_docker.sh [sqlite|pgsql|mysql]\n' >&2 exit 1 ;; esac if [ ! -f "$CERT_FILE" ] || [ ! -f "$KEY_FILE" ]; then log "Nie znaleziono certyfikatu SSL w katalogu ${SSL_DIR}, tworzę self-signed cert..." rm -f "$CERT_FILE" "$KEY_FILE" openssl req -x509 -nodes -newkey rsa:4096 -sha256 -days 825 \ -keyout "$KEY_FILE" \ -out "$CERT_FILE" \ -subj "/CN=${APP_DOMAIN}" \ -addext "subjectAltName=DNS:${APP_DOMAIN},DNS:localhost,IP:127.0.0.1" chmod 600 "$KEY_FILE" chmod 644 "$CERT_FILE" else log "Znaleziono istniejący certyfikat SSL w katalogu ${SSL_DIR}." fi log "Wybrany silnik bazy: ${DB_ENGINE}" if [ -n "$COMPOSE_PROFILES" ]; then export COMPOSE_PROFILES log "Aktywne profile Compose: ${COMPOSE_PROFILES}" else unset COMPOSE_PROFILES || true log "Brak aktywnych profili Compose" fi log "Pobieram najnowsze obrazy dla projektu ${STACK_NAME}..." docker compose -p "$STACK_NAME" -f "$COMPOSE_FILE" pull log "Zatrzymuję aktualny stack projektu ${STACK_NAME}..." docker compose -p "$STACK_NAME" -f "$COMPOSE_FILE" stop || true log "Usuwam kontenery i osierocone zasoby tylko dla projektu ${STACK_NAME}..." docker compose -p "$STACK_NAME" -f "$COMPOSE_FILE" down --remove-orphans || true log "Buduję obrazy projektu ${STACK_NAME} bez cache..." docker compose -p "$STACK_NAME" -f "$COMPOSE_FILE" build --no-cache log "Uruchamiam stack ${STACK_NAME}..." docker compose -p "$STACK_NAME" -f "$COMPOSE_FILE" up -d APP_URL="${APP_EXTERNAL_SCHEME}://${APP_DOMAIN}" if [ -n "${EXPOSE_PORT:-}" ]; then APP_URL="${APP_URL}:${EXPOSE_PORT}" fi log "Deployment zakończony." log "Adres aplikacji: ${APP_URL}" log "Port zewnętrzny: ${EXPOSE_PORT}" log "Silnik bazy: ${DB_ENGINE}" log "Ścieżka danych bazy: ${DB_PATH_INFO}"