name: Docker Image CI on: push: branches: - main tags: - '*' jobs: docker-releases: runs-on: ubuntu-latest env: RELEASE_VERSION: ${{ github.ref_name }} steps: - name: Checkout uses: actions/checkout@v4 - name: Set up QEMU uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Login to GitHub Container Registry if: startsWith(github.ref, 'refs/tags/') uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Build (and push on tag) uses: docker/build-push-action@v6.9.0 with: context: . push: ${{ startsWith(github.ref, 'refs/tags/') }} tags: | ghcr.io/zeecka/aperisolve:${{ env.RELEASE_VERSION }} ghcr.io/zeecka/aperisolve:latest deploy: runs-on: ubuntu-latest needs: docker-releases if: startsWith(github.ref, 'refs/tags/') environment: prod steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Wait for image propagation run: | echo "Waiting 120 seconds for image to propagate in registry..." sleep 120 - name: Deploy to production server uses: appleboy/ssh-action@v1.0.3 with: host: ${{ secrets.PROD_SSH_HOST }} username: ${{ secrets.PROD_SSH_USER }} key: ${{ secrets.PROD_SSH_KEY }} command_timeout: 30m script: | set -e cd /root/AperiSolve git pull cat .env.example | grep -v '^PROJECT_VERSION=' > .env cat <> .env WEB_APP_PORT=${{ vars.WEB_APP_PORT }} MAX_CONTENT_LENGTH=${{ vars.MAX_CONTENT_LENGTH }} MAX_PENDING_TIME=${{ vars.MAX_PENDING_TIME }} MAX_STORE_TIME=${{ vars.MAX_STORE_TIME }} CLEAR_AT_RESTART=${{ vars.CLEAR_AT_RESTART }} SKIP_IHDR_FILL=${{ vars.SKIP_IHDR_FILL }} REMOVAL_MIN_AGE_SECONDS=${{ vars.REMOVAL_MIN_AGE_SECONDS }} GOOGLE_ADS_TXT=${{ vars.GOOGLE_ADS_TXT }} CUSTOM_EXTERNAL_SCRIPT=${{ vars.CUSTOM_EXTERNAL_SCRIPT }} FLASK_DEBUG=${{ vars.FLASK_DEBUG }} RQ_DASHBOARD_REDIS_URL=${{ vars.RQ_DASHBOARD_REDIS_URL }} POSTGRES_DB=${{ secrets.POSTGRES_DB }} POSTGRES_USER=${{ secrets.POSTGRES_USER }} POSTGRES_PASSWORD=${{ secrets.POSTGRES_PASSWORD }} DB_URI=${{ secrets.DATABASE_URL }} SENTRY_DSN=${{ secrets.SENTRY_DSN }} SENTRY_TRACES_SAMPLE_RATE=${{ vars.SENTRY_TRACES_SAMPLE_RATE }} SENTRY_PROFILES_SAMPLE_RATE=${{ vars.SENTRY_PROFILES_SAMPLE_RATE }} SENTRY_RELEASE=${{ github.ref_name }} SENTRY_ENVIRONMENT=${{ vars.SENTRY_ENVIRONMENT }} EOF docker compose pull docker compose down -v docker compose up -d docker image prune -f