diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index d667a4b..cb755a2 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -91,70 +91,195 @@ jobs: IMAGE_TAG: ${{ github.sha }} run: | - set -euo pipefail + set -Eeuo pipefail - mkdir -p ~/.ssh - - printf '%s\n' "$DEPLOY_SSH_KEY" > ~/.ssh/deploy_key - chmod 600 ~/.ssh/deploy_key - - ssh-keyscan \ + trap 'echo "ERROR: command failed at line $LINENO: $BASH_COMMAND" >&2' ERR + + echo "==> Preparing SSH" + echo "DEPLOY_HOST=${DEPLOY_HOST:-}" + echo "DEPLOY_PORT=${DEPLOY_PORT:-22}" + echo "DEPLOY_USER=${DEPLOY_USER:-}" + echo "DEPLOY_PATH=${DEPLOY_PATH:-}" + echo "IMAGE_TAG=${IMAGE_TAG:-}" + + echo "==> Checking required variables" + + required_vars=( + DEPLOY_HOST + DEPLOY_USER + DEPLOY_PATH + DEPLOY_SSH_KEY + POSTGRES_PASSWORD + BETTER_AUTH_SECRET + BETTER_AUTH_URL + RESEND_API_KEY + RESERVATIONS_FROM_EMAIL + STAFF_SEED_EMAIL + STAFF_SEED_PASSWORD + IMAGE_TAG + ) + + for var in "${required_vars[@]}"; do + if [[ -z "${!var:-}" ]]; then + echo "ERROR: $var is missing or empty" >&2 + exit 1 + fi + echo " OK: $var is set" + done + + echo "==> Creating ~/.ssh" + mkdir -p ~/.ssh + + echo "==> Writing deployment SSH key" + printf '%s\n' "$DEPLOY_SSH_KEY" > ~/.ssh/deploy_key + chmod 600 ~/.ssh/deploy_key + + echo "==> Scanning SSH host key" + ssh-keyscan \ -p "${DEPLOY_PORT:-22}" \ -H "$DEPLOY_HOST" \ >> ~/.ssh/known_hosts - - echo "Creating deployment directory if needed..." - - ssh \ + + echo "==> SSH host key added" + + echo "==> Testing SSH connection" + ssh \ -i ~/.ssh/deploy_key \ -p "${DEPLOY_PORT:-22}" \ "$DEPLOY_USER@$DEPLOY_HOST" \ - "mkdir -p '$DEPLOY_PATH'" - - echo "Uploading compose file..." - - scp \ + "echo 'SSH connection successful'; echo \"Remote host: \$(hostname)\"; echo \"Remote user: \$(whoami)\"" + + echo "==> Creating deployment directory if needed..." + ssh \ + -i ~/.ssh/deploy_key \ + -p "${DEPLOY_PORT:-22}" \ + "$DEPLOY_USER@$DEPLOY_HOST" \ + "mkdir -pv '$DEPLOY_PATH'" + + echo "==> Verifying deployment directory..." + ssh \ + -i ~/.ssh/deploy_key \ + -p "${DEPLOY_PORT:-22}" \ + "$DEPLOY_USER@$DEPLOY_HOST" \ + "ls -ld '$DEPLOY_PATH'" + + echo "==> Uploading compose file..." + echo " Local file: docker-compose.prod.yml" + echo " Remote file: $DEPLOY_PATH/docker-compose.yml" + + scp \ + -v \ -i ~/.ssh/deploy_key \ -P "${DEPLOY_PORT:-22}" \ docker-compose.prod.yml \ "$DEPLOY_USER@$DEPLOY_HOST:$DEPLOY_PATH/docker-compose.yml" - - echo "Deploying..." - - ssh \ + + echo "==> Verifying uploaded compose file..." + ssh \ + -i ~/.ssh/deploy_key \ + -p "${DEPLOY_PORT:-22}" \ + "$DEPLOY_USER@$DEPLOY_HOST" \ + "ls -lh '$DEPLOY_PATH/docker-compose.yml'" + + echo "==> Starting deployment..." + + ssh \ + -v \ -i ~/.ssh/deploy_key \ -p "${DEPLOY_PORT:-22}" \ "$DEPLOY_USER@$DEPLOY_HOST" \ "POSTGRES_PASSWORD=$(printf '%q' "$POSTGRES_PASSWORD") \ - BETTER_AUTH_SECRET=$(printf '%q' "$BETTER_AUTH_SECRET") \ - BETTER_AUTH_URL=$(printf '%q' "$BETTER_AUTH_URL") \ - RESEND_API_KEY=$(printf '%q' "$RESEND_API_KEY") \ - RESERVATIONS_FROM_EMAIL=$(printf '%q' "$RESERVATIONS_FROM_EMAIL") \ - STAFF_SEED_EMAIL=$(printf '%q' "$STAFF_SEED_EMAIL") \ - STAFF_SEED_PASSWORD=$(printf '%q' "$STAFF_SEED_PASSWORD") \ - IMAGE_TAG=$(printf '%q' "$IMAGE_TAG") \ - bash -c ' - set -euo pipefail - - cd \"$DEPLOY_PATH\" - - echo \"Pulling images...\" - docker compose pull - - echo \"Starting PostgreSQL...\" - docker compose up -d postgres - - echo "Running database migrations..." - docker compose run --rm app npx drizzle-kit migrate - - echo "Seeding database..." - docker compose run --rm app npm run db:seed + BETTER_AUTH_SECRET=$(printf '%q' "$BETTER_AUTH_SECRET") \ + BETTER_AUTH_URL=$(printf '%q' "$BETTER_AUTH_URL") \ + RESEND_API_KEY=$(printf '%q' "$RESEND_API_KEY") \ + RESERVATIONS_FROM_EMAIL=$(printf '%q' "$RESERVATIONS_FROM_EMAIL") \ + STAFF_SEED_EMAIL=$(printf '%q' "$STAFF_SEED_EMAIL") \ + STAFF_SEED_PASSWORD=$(printf '%q' "$STAFF_SEED_PASSWORD") \ + IMAGE_TAG=$(printf '%q' "$IMAGE_TAG") \ + DEPLOY_PATH=$(printf '%q' "$DEPLOY_PATH") \ + bash -c ' + set -Eeuo pipefail - echo "Starting application..." - docker compose up -d + trap '\''echo "ERROR: remote command failed at line $LINENO: $BASH_COMMAND" >&2'\'' + + echo "========================================" + echo "REMOTE DEPLOYMENT" + echo "========================================" + + echo "==> Environment" + echo " DEPLOY_PATH=\$DEPLOY_PATH" + echo " IMAGE_TAG=\$IMAGE_TAG" + echo " DEPLOY_USER=\$(whoami)" + echo " HOST=\$(hostname)" + echo " PWD=\$(pwd)" + + echo "==> Checking required commands" + + command -v docker + echo " Docker: \$(docker --version)" + + docker compose version + echo " Docker Compose: OK" + + echo "==> Changing directory" + cd \"\$DEPLOY_PATH\" - echo \"Cleaning unused images...\" - docker image prune -f - - echo \"Deployment complete.\" - '" + echo " Current directory: \$(pwd)" + + echo "==> Listing deployment directory" + ls -lah + + echo "==> Validating Docker Compose configuration" + docker compose config + + echo "==> Docker Compose configuration is valid" + + echo "==> Pulling images..." + docker compose pull + + echo "==> Image pull completed" + + echo "==> Current containers before deployment" + docker compose ps + + echo "==> Starting PostgreSQL..." + docker compose up -d postgres + + echo "==> PostgreSQL start command completed" + + echo "==> PostgreSQL status" + docker compose ps postgres + + echo "==> PostgreSQL logs (last 50 lines)" + docker compose logs --tail=50 postgres || true + + echo "==> Running database migrations..." + docker compose run --rm app npx drizzle-kit migrate + + echo "==> Database migrations completed" + + echo "==> Seeding database..." + docker compose run --rm app npm run db:seed + + echo "==> Database seeding completed" + + echo "==> Starting application..." + docker compose up -d + + echo "==> Application startup completed" + + echo "==> Current container status" + docker compose ps + + echo "==> Recent application logs" + docker compose logs --tail=100 app || true + + echo "==> Cleaning unused images..." + docker image prune -f + + echo "========================================" + echo "DEPLOYMENT COMPLETE" + echo "========================================" + '" + + echo "==> Deployment finished successfully"