zephyrdark 0a8d17a588
All checks were successful
Deploy to Production / deploy (push) Successful in 1m58s
fix: use relative paths for postgres data and backups to avoid root permission issues
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 23:42:23 +09:00

73 lines
2.9 KiB
YAML

name: Deploy to Production
on:
push:
branches: [master]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Docker CLI
run: |
apt-get update -qq && apt-get install -y -qq docker.io >/dev/null 2>&1
mkdir -p ~/.docker/cli-plugins
curl -fsSL "https://github.com/docker/compose/releases/latest/download/docker-compose-linux-$(uname -m)" \
-o ~/.docker/cli-plugins/docker-compose
chmod +x ~/.docker/cli-plugins/docker-compose
docker compose version
- name: Create .env.prod from secrets
run: |
cat <<EOF > .env.prod
DB_USER=${{ secrets.DB_USER }}
DB_PASSWORD=${{ secrets.DB_PASSWORD }}
DB_NAME=${{ secrets.DB_NAME }}
JWT_SECRET=${{ secrets.JWT_SECRET }}
KIS_APP_KEY=${{ secrets.KIS_APP_KEY }}
KIS_APP_SECRET=${{ secrets.KIS_APP_SECRET }}
KIS_ACCOUNT_NO=${{ secrets.KIS_ACCOUNT_NO }}
DART_API_KEY=${{ secrets.DART_API_KEY }}
CORS_ORIGINS=${{ secrets.CORS_ORIGINS }}
ADMIN_USERNAME=${{ secrets.ADMIN_USERNAME }}
ADMIN_EMAIL=${{ secrets.ADMIN_EMAIL }}
ADMIN_PASSWORD=${{ secrets.ADMIN_PASSWORD }}
EOF
- name: Backup database before deploy
run: |
mkdir -p ./data/backups
docker exec galaxis-po-db pg_dump -U ${{ secrets.DB_USER }} ${{ secrets.DB_NAME }} \
> ./data/backups/$(date +%Y%m%d_%H%M%S).sql 2>/dev/null || true
- name: Ensure data directories exist
run: |
mkdir -p ./data/postgres
mkdir -p ./data/backups
- name: Deploy with Docker Compose
run: |
docker compose --project-name galaxis-po --env-file .env.prod -f docker-compose.prod.yml down || true
docker compose --project-name galaxis-po --env-file .env.prod -f docker-compose.prod.yml build
docker compose --project-name galaxis-po --env-file .env.prod -f docker-compose.prod.yml up -d
- name: Health check
run: |
echo "Waiting for all containers to become healthy..."
for i in $(seq 1 30); do
STATUS=$(docker inspect --format='{{.State.Health.Status}}' galaxis-po-frontend 2>/dev/null || echo "missing")
if [ "$STATUS" = "healthy" ]; then
break
fi
echo " frontend: $STATUS (attempt $i/30)"
sleep 5
done
docker compose --project-name galaxis-po --env-file .env.prod -f docker-compose.prod.yml ps
docker exec galaxis-po-backend python -c "import urllib.request; urllib.request.urlopen('http://localhost:8000/health')" || { echo "Backend: FAILED"; exit 1; }
echo "Backend: OK"
docker exec galaxis-po-frontend wget -q --spider http://127.0.0.1:3000/ || { echo "Frontend: FAILED"; exit 1; }
echo "Frontend: OK"