diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index eb1e53bc..946b2442 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -54,10 +54,56 @@ jobs: - name: Build run: npm run build - deploy: + build-and-push: needs: [python-quality, frontend-quality] if: github.event_name == 'push' && github.ref == 'refs/heads/main' runs-on: ubuntu-latest + permissions: + contents: read + packages: write + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Login to GHCR + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build and push backend image + uses: docker/build-push-action@v6 + with: + context: . + push: true + tags: | + ghcr.io/yangyuan-zhen/polyweather-backend:latest + ghcr.io/yangyuan-zhen/polyweather-backend:${{ github.sha }} + cache-from: type=gha + cache-to: type=gha,mode=max + + - name: Build and push frontend image + uses: docker/build-push-action@v6 + with: + context: ./frontend + push: true + tags: | + ghcr.io/yangyuan-zhen/polyweather-frontend:latest + ghcr.io/yangyuan-zhen/polyweather-frontend:${{ github.sha }} + build-args: | + NEXT_PUBLIC_SUPABASE_URL=${{ secrets.NEXT_PUBLIC_SUPABASE_URL }} + NEXT_PUBLIC_SUPABASE_ANON_KEY=${{ secrets.NEXT_PUBLIC_SUPABASE_ANON_KEY }} + NEXT_PUBLIC_SITE_URL=${{ secrets.NEXT_PUBLIC_SITE_URL || 'https://polyweather.top' }} + NEXT_PUBLIC_POLYWEATHER_API_BASE_URL=${{ secrets.NEXT_PUBLIC_POLYWEATHER_API_BASE_URL || 'https://api.polyweather.top' }} + NEXT_PUBLIC_POLYWEATHER_LOCAL_FULL_ACCESS=false + cache-from: type=gha + cache-to: type=gha,mode=max + + deploy: + needs: [build-and-push] + if: github.event_name == 'push' && github.ref == 'refs/heads/main' + runs-on: ubuntu-latest steps: - name: Deploy to VPS run: | @@ -65,10 +111,11 @@ jobs: echo "${{ secrets.VPS_SSH_KEY }}" > ~/.ssh/id_rsa chmod 600 ~/.ssh/id_rsa ssh -o StrictHostKeyChecking=accept-new ${{ secrets.VPS_USER }}@${{ secrets.VPS_HOST }} " + echo '${{ secrets.GHCR_PAT }}' | docker login ghcr.io -u yangyuan-zhen --password-stdin cd /root/PolyWeather git fetch origin main && git reset --hard origin/main - docker compose down - docker compose up -d --build + docker compose pull + docker compose up -d sleep 10 curl -s http://localhost:8000/healthz " diff --git a/docker-compose.yml b/docker-compose.yml index 5032d32b..49bde8e4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,6 +1,5 @@ services: polyweather: - build: . container_name: polyweather_bot cpus: ${POLYWEATHER_BOT_CPUS:-0.75} env_file: &id001 @@ -18,7 +17,7 @@ services: - import sqlite3; c=sqlite3.connect('/var/lib/polyweather/polyweather.db'); c.execute('SELECT 1'); c.close() timeout: 10s - image: polyweather-app:latest + image: ghcr.io/yangyuan-zhen/polyweather-backend:latest mem_limit: ${POLYWEATHER_BOT_MEM_LIMIT:-768m} memswap_limit: ${POLYWEATHER_BOT_MEMSWAP_LIMIT:-1g} pids_limit: 256 @@ -29,15 +28,6 @@ services: - ${POLYWEATHER_RUNTIME_DATA_DIR:-/var/lib/polyweather}:/app/data - ./bot.log:/app/bot.log polyweather_frontend: - build: - args: - NEXT_PUBLIC_POLYWEATHER_API_BASE_URL: https://api.polyweather.top - NEXT_PUBLIC_POLYWEATHER_LOCAL_FULL_ACCESS: 'false' - NEXT_PUBLIC_SITE_URL: https://polyweather.top - NEXT_PUBLIC_SUPABASE_ANON_KEY: '' - NEXT_PUBLIC_SUPABASE_URL: '' - context: ./frontend - dockerfile: Dockerfile container_name: polyweather_frontend environment: NEXT_PUBLIC_POLYWEATHER_API_BASE_URL: ${NEXT_PUBLIC_POLYWEATHER_API_BASE_URL:-} @@ -57,11 +47,11 @@ services: - -qO- - http://localhost:3000 timeout: 5s + image: ghcr.io/yangyuan-zhen/polyweather-frontend:latest ports: - 3001:3000 restart: unless-stopped polyweather_web: - build: . command: python web/app.py container_name: polyweather_web env_file: *id001 @@ -74,7 +64,7 @@ services: - -c - from urllib.request import urlopen; urlopen('http://localhost:8000/healthz') timeout: 5s - image: polyweather-app:latest + image: ghcr.io/yangyuan-zhen/polyweather-backend:latest ports: - 8000:8000 restart: unless-stopped @@ -83,6 +73,5 @@ services: - ${POLYWEATHER_RUNTIME_DATA_DIR:-/var/lib/polyweather}:/var/lib/polyweather - ${POLYWEATHER_RUNTIME_DATA_DIR:-/var/lib/polyweather}:/app/data x-polyweather-base: - build: . env_file: *id001 - image: polyweather-app:latest + image: ghcr.io/yangyuan-zhen/polyweather-backend:latest