1+ name : ' 🚀 Deploy NestJS API Docker App'
2+
3+ on :
4+ push :
5+ branches : [main]
6+
7+ jobs :
8+ build-and-deploy :
9+ runs-on : self-hosted
10+ name : ' 🐳 Build & Deploy'
11+
12+ steps :
13+ - name : ' 🔍 Checkout Code'
14+ uses : actions/checkout@v4
15+
16+ - name : ' 🔒 Verify SSH Secrets Exist'
17+ run : |
18+ missing=0
19+ for var in SERVER_HOST SERVER_USER SERVER_SSH_KEY; do
20+ # Use indirect expansion to check each env var
21+ if [ -z "${!var}" ]; then
22+ echo "❌ Critical error: Secret $var is missing!"
23+ missing=1
24+ else
25+ echo "✅ Secret $var is present"
26+ fi
27+ done
28+ if [ $missing -ne 0 ]; then
29+ exit 1
30+ fi
31+ env :
32+ SERVER_HOST : ${{ secrets.SERVER_HOST }}
33+ SERVER_USER : ${{ secrets.SERVER_USER }}
34+ SERVER_SSH_KEY : ${{ secrets.SERVER_SSH_KEY }}
35+
36+ - name : ' 🐳 Log in to GitHub Container Registry'
37+ uses : docker/login-action@v2
38+ with :
39+ registry : ghcr.io
40+ username : ${{ github.actor }}
41+ password : ${{ secrets.GITHUB_TOKEN }}
42+
43+ - name : ' 📦 Build & Push Docker Image'
44+ uses : docker/build-push-action@v3
45+ with :
46+ context : .
47+ push : true
48+ tags : ghcr.io/codebuilderinc/codebuilder-api:latest
49+ env :
50+ BUILDKIT_PROGRESS : plain
51+
52+ - name : ' 🚀 Deploy to Remote Server'
53+ if : github.ref == 'refs/heads/main'
54+ uses : appleboy/ssh-action@v0.1.6
55+ with :
56+ host : ${{ secrets.SERVER_HOST }}
57+ username : ${{ secrets.SERVER_USER }}
58+ key : ${{ secrets.SERVER_SSH_KEY }}
59+ script : |
60+ echo "➡️ Ensuring Docker network 'codebuilder-net' exists..."
61+ if ! docker network ls | grep -q codebuilder-net; then
62+ echo "🆕 Creating network codebuilder-net"
63+ docker network create codebuilder-net
64+ else
65+ echo "✔️ Network codebuilder-net already exists"
66+ fi
67+
68+ echo "➡️ Ensuring database container is running..."
69+ if docker ps -a --format '{{.Names}}' | grep -q '^nest-db$'; then
70+ if ! docker ps --format '{{.Names}}' | grep -q '^nest-db$'; then
71+ echo "🟡 Starting existing 'nest-db' container..."
72+ docker start nest-db
73+ else
74+ echo "✔️ Database container 'nest-db' is already running"
75+ fi
76+ else
77+ echo "🆕 Deploying fresh database container..."
78+ docker-compose -f docker-compose.nest.yml up -d db
79+ fi
80+
81+ echo "⏳ Waiting for database to be healthy on db:5432..."
82+ until nc -z db 5432; do sleep 1; done
83+ echo "✅ Database is healthy"
84+
85+ echo "➡️ Pulling latest NestJS image..."
86+ docker pull ghcr.io/codebuilderinc/codebuilder-api:latest
87+
88+ echo "🔄 Deploying NestJS API service on port 4000..."
89+ docker-compose -f docker-compose.nest.yml up -d --no-deps nest-api
90+
91+ - name : ' 🗑️ Prune Old Docker Images'
92+ if : always()
93+ run : docker image prune -af
0 commit comments