name: Deploy Backend on: # push: # branches: [ main ] # paths: # - 'backend/**' # - 'Dockerfile' # - '.github/workflows/deploy_backend.yml' workflow_dispatch: env: IMAGE_NAME: license-manager-backend CONTAINER_NAME: license-manager jobs: deploy: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Set up Go uses: actions/setup-go@v4 with: go-version: '1.23' - name: Build and test backend run: | cd backend go mod tidy go mod verify go test ./... go build -ldflags="-s -w" -o license-manager cmd/main.go - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Build Docker image run: | docker build -f Dockerfile.backend -t ${{ env.IMAGE_NAME }}:latest . docker save ${{ env.IMAGE_NAME }}:latest > backend-image.tar - name: Copy files to server uses: appleboy/scp-action@v0.1.7 with: host: ${{ secrets.HOST_PI }} username: pi password: ${{ secrets.PASS_PI }} port: 22 source: "backend-image.tar" target: "/home/pi/license-manager/" - name: Deploy to server uses: appleboy/ssh-action@v1.0.3 with: host: ${{ secrets.HOST_PI }} username: pi password: ${{ secrets.PASS_PI }} port: 22 script: | cd /home/pi/license-manager # Stop and remove existing container docker stop ${{ env.CONTAINER_NAME }} || true docker rm ${{ env.CONTAINER_NAME }} || true # Load new image docker load < backend-image.tar # Remove old image docker rmi ${{ env.IMAGE_NAME }}:old || true docker tag ${{ env.IMAGE_NAME }}:latest ${{ env.IMAGE_NAME }}:old || true # Run new container with host network docker run -d \ --name ${{ env.CONTAINER_NAME }} \ --restart unless-stopped \ --network host \ -v /home/pi/license-manager/logs:/app/logs \ ${{ env.IMAGE_NAME }}:latest # Clean up rm -f backend-image.tar docker image prune -f # Check deployment status sleep 5 if docker ps | grep -q ${{ env.CONTAINER_NAME }}; then echo "✅ Deployment successful! Container is running." docker logs --tail 10 ${{ env.CONTAINER_NAME }} else echo "❌ Deployment failed! Container is not running." docker logs ${{ env.CONTAINER_NAME }} exit 1 fi - name: Health check run: | sleep 10 response=$(curl -s -o /dev/null -w "%{http_code}" http://${{ secrets.HOST_PI }}:18888/health || echo "000") if [ "$response" = "200" ]; then echo "✅ Health check passed! Service is responding." else echo "⚠️ Health check returned status: $response" echo "Service may still be starting up..." fi