1+ name : CD
2+
3+ on :
4+ workflow_dispatch :
5+ workflow_run :
6+ workflows : ["CI"]
7+ types :
8+ - completed
9+ branches : [ main ]
10+
11+ jobs :
12+ deploy :
13+ runs-on : ubuntu-latest
14+ if : ${{ github.event_name == 'workflow_dispatch' || github.event.workflow_run.conclusion == 'success' }}
15+
16+ steps :
17+ - uses : actions/checkout@v4
18+
19+ - name : Set up Docker Buildx
20+ uses : docker/setup-buildx-action@v3
21+
22+ - name : Login to Docker Hub
23+ uses : docker/login-action@v3
24+ with :
25+ username : ${{ secrets.DOCKERHUB_USERNAME }}
26+ password : ${{ secrets.DOCKERHUB_TOKEN }}
27+
28+ - name : Build and push Docker image
29+ uses : docker/build-push-action@v5
30+ with :
31+ context : .
32+ push : true
33+ tags : |
34+ ${{ secrets.DOCKERHUB_USERNAME }}/fairlx:latest
35+ ${{ secrets.DOCKERHUB_USERNAME }}/fairlx:${{ github.sha }}
36+ cache-from : type=registry,ref=${{ secrets.DOCKERHUB_USERNAME }}/fairlx:buildcache
37+ cache-to : type=registry,ref=${{ secrets.DOCKERHUB_USERNAME }}/fairlx:buildcache,mode=max
38+
39+ # Deploy to Digital Ocean
40+ - name : Deploy to Digital Ocean
41+ uses : appleboy/ssh-action@v1.0.3
42+ with :
43+ host : ${{ secrets.DO_HOST }}
44+ username : ${{ secrets.DO_USERNAME }}
45+ password : ${{ secrets.DO_PASSWORD }}
46+ port : ${{ secrets.DO_PORT }}
47+ script : |
48+ # Stop and remove existing container if it exists
49+ docker stop fairlx-app || true
50+ docker rm fairlx-app || true
51+
52+ # Remove old image to save space
53+ docker rmi ${{ secrets.DOCKERHUB_USERNAME }}/fairlx:latest || true
54+
55+ # Pull the latest image
56+ docker pull ${{ secrets.DOCKERHUB_USERNAME }}/fairlx:latest
57+
58+ # Run the new container
59+ docker run -d \
60+ --name fairlx-app \
61+ --restart unless-stopped \
62+ -p 3000:3000 \
63+ -e NODE_ENV=production \
64+ -e NEXT_TELEMETRY_DISABLED=1 \
65+ -e NEXT_PUBLIC_APP_URL="${{ secrets.NEXT_PUBLIC_APP_URL }}" \
66+ -e NEXT_PUBLIC_APPWRITE_ENDPOINT="${{ secrets.NEXT_PUBLIC_APPWRITE_ENDPOINT }}" \
67+ -e NEXT_PUBLIC_APPWRITE_PROJECT="${{ secrets.NEXT_PUBLIC_APPWRITE_PROJECT }}" \
68+ -e NEXT_PUBLIC_APPWRITE_DATABASE_ID="${{ secrets.NEXT_PUBLIC_APPWRITE_DATABASE_ID }}" \
69+ -e NEXT_PUBLIC_APPWRITE_WORKSPACES_ID="${{ secrets.NEXT_PUBLIC_APPWRITE_WORKSPACES_ID }}" \
70+ -e NEXT_PUBLIC_APPWRITE_MEMBERS_ID="${{ secrets.NEXT_PUBLIC_APPWRITE_MEMBERS_ID }}" \
71+ -e NEXT_PUBLIC_APPWRITE_PROJECTS_ID="${{ secrets.NEXT_PUBLIC_APPWRITE_PROJECTS_ID }}" \
72+ -e NEXT_PUBLIC_APPWRITE_TASKS_ID="${{ secrets.NEXT_PUBLIC_APPWRITE_TASKS_ID }}" \
73+ -e NEXT_PUBLIC_APPWRITE_TIME_LOGS_ID="${{ secrets.NEXT_PUBLIC_APPWRITE_TIME_LOGS_ID }}" \
74+ -e NEXT_PUBLIC_APPWRITE_CUSTOM_COLUMNS_ID="${{ secrets.NEXT_PUBLIC_APPWRITE_CUSTOM_COLUMNS_ID }}" \
75+ -e NEXT_PUBLIC_APPWRITE_DEFAULT_COLUMN_SETTINGS_ID="${{ secrets.NEXT_PUBLIC_APPWRITE_DEFAULT_COLUMN_SETTINGS_ID }}" \
76+ -e NEXT_PUBLIC_APPWRITE_IMAGES_BUCKET_ID="${{ secrets.NEXT_PUBLIC_APPWRITE_IMAGES_BUCKET_ID }}" \
77+ -e NEXT_PUBLIC_APPWRITE_ATTACHMENTS_ID="${{ secrets.NEXT_PUBLIC_APPWRITE_ATTACHMENTS_ID }}" \
78+ -e NEXT_PUBLIC_APPWRITE_ATTACHMENTS_BUCKET_ID="${{ secrets.NEXT_PUBLIC_APPWRITE_ATTACHMENTS_BUCKET_ID }}" \
79+ -e NEXT_APPWRITE_KEY="${{ secrets.NEXT_APPWRITE_KEY }}" \
80+ ${{ secrets.DOCKERHUB_USERNAME }}/fairlx:latest
81+
82+ # Clean up unused Docker images
83+ docker image prune -f
84+
85+ # Wait a moment for the container to start
86+ sleep 10
87+
88+ # Check if the container is running
89+ if docker ps | grep -q fairlx-app; then
90+ echo "Deployment successful! Container is running."
91+ else
92+ echo "Deployment failed! Container is not running."
93+ docker logs fairlx-app
94+ exit 1
95+ fi
96+
97+ - name : Deployment Status
98+ run : |
99+ echo "Deployment to Digital Ocean completed successfully!"
100+ echo "Application URL: http://${{ secrets.DO_HOST }}:3000"
101+ echo "Docker image: ${{ secrets.DOCKERHUB_USERNAME }}/fairlx:latest"
0 commit comments