From 2c367fd6f8baa21547807786b8a4993f69c840b0 Mon Sep 17 00:00:00 2001 From: Frank John Begornia Date: Thu, 2 Apr 2026 15:01:16 +0800 Subject: [PATCH] Add deployment workflow for production environment --- .gitea/workflows/deploy.yml | 119 ++++++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 .gitea/workflows/deploy.yml diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml new file mode 100644 index 0000000..f1bb078 --- /dev/null +++ b/.gitea/workflows/deploy.yml @@ -0,0 +1,119 @@ +name: Deploy Production (qr.crewsportswear.app) + +on: + push: + branches: + - main + - master + workflow_dispatch: + +jobs: + deploy: + runs-on: ubuntu-latest + container: + image: catthehacker/ubuntu:act-latest + + steps: + - name: Checkout code + shell: sh + run: | + git clone $GITHUB_SERVER_URL/$GITHUB_REPOSITORY.git /workspace/repo + cd /workspace/repo + git checkout $GITHUB_REF_NAME + + - name: Build Docker image + shell: sh + run: | + cd /workspace/repo + docker build -t qr-code-api:latest . + docker save qr-code-api:latest | gzip > qr-code-api.tar.gz + + - name: Setup SSH + shell: sh + env: + DEPLOY_SSH_KEY: ${{ secrets.DEPLOY_SSH_KEY }} + DEPLOY_HOST: ${{ secrets.DEPLOY_HOST }} + run: | + mkdir -p ~/.ssh + chmod 700 ~/.ssh + echo "$DEPLOY_SSH_KEY" > ~/.ssh/id_ed25519 + chmod 600 ~/.ssh/id_ed25519 + ssh-keyscan -H "$DEPLOY_HOST" >> ~/.ssh/known_hosts + + - name: Upload image and compose + shell: sh + env: + DEPLOY_USER: ${{ secrets.DEPLOY_USER }} + DEPLOY_HOST: ${{ secrets.DEPLOY_HOST }} + run: | + scp -i ~/.ssh/id_ed25519 \ + /workspace/repo/qr-code-api.tar.gz \ + /workspace/repo/docker-compose.prod.yml \ + ${DEPLOY_USER}@${DEPLOY_HOST}:/tmp/ + + - name: Deploy on server + shell: sh + env: + DEPLOY_USER: ${{ secrets.DEPLOY_USER }} + DEPLOY_HOST: ${{ secrets.DEPLOY_HOST }} + run: | + ssh -i ~/.ssh/id_ed25519 $DEPLOY_USER@$DEPLOY_HOST << 'EOF' + set -e + + DEPLOY_DIR="/var/www/apps/qr-code-api" + sudo mkdir -p "$DEPLOY_DIR" + sudo chown $USER:$USER "$DEPLOY_DIR" + + echo "Loading image" + docker load < /tmp/qr-code-api.tar.gz + + echo "Removing old qr-code-api images" + docker images | grep qr-code-api | grep -v "$(docker images qr-code-api:latest -q)" | awk '{print $3}' | xargs -r docker rmi -f || true + + echo "Updating compose file" + cp /tmp/docker-compose.prod.yml "$DEPLOY_DIR/docker-compose.yml" + + cd "$DEPLOY_DIR" + + echo "Ensure networks" + docker network inspect traefik-public >/dev/null 2>&1 || \ + docker network create traefik-public + docker network inspect crew-app-net >/dev/null 2>&1 || \ + docker network create crew-app-net + + echo "Restarting service" + docker compose down || true + docker compose up -d --remove-orphans + + echo "Waiting for container startup" + sleep 10 + + if docker ps --format '{{.Names}}' | grep -q '^qr_code_api$'; then + echo "Service container is running" + else + echo "Service container is not running" + docker compose logs + exit 1 + fi + + echo "Cleanup temporary artifacts" + rm -f /tmp/qr-code-api.tar.gz /tmp/docker-compose.prod.yml + + echo "Deployment complete" + echo "Application URL: https://qr.crewsportswear.app" + EOF + + - name: Health check + shell: sh + run: | + echo "Waiting for service to be ready" + sleep 15 + + HTTP_CODE=$(curl -k -s -o /dev/null -w "%{http_code}" --max-time 30 https://qr.crewsportswear.app/health || echo "000") + + if [ "$HTTP_CODE" = "200" ]; then + echo "Health check passed (HTTP $HTTP_CODE)" + else + echo "Health check failed (HTTP $HTTP_CODE)" + exit 1 + fi \ No newline at end of file