@@ -83,32 +83,52 @@ jobs:
8383 SSH_HOST : ${{ secrets.SSH_HOST }}
8484 SSH_USER : ${{ secrets.SSH_USER }}
8585 SSH_PRIVATE_KEY : ${{ secrets.SSH_PRIVATE_KEY }}
86+ SSH_PASSWORD : ${{ secrets.SSH_PASSWORD }}
8687 run : |
87- for v in SSH_HOST SSH_USER SSH_PRIVATE_KEY; do
88- if [ -z "${!v}" ]; then echo "Missing secret: $v"; exit 1; fi
89- done
88+ if [ -z "$SSH_HOST" ] || [ -z "$SSH_USER" ]; then
89+ echo "Missing SSH_HOST or SSH_USER"; exit 1; fi
90+ if [ -z "$SSH_PRIVATE_KEY" ] && [ -z "$SSH_PASSWORD" ]; then
91+ echo "Provide either SSH_PRIVATE_KEY or SSH_PASSWORD"; exit 1; fi
9092
91- - name : Upload docker-compose file
93+ - name : Upload docker-compose file (key)
94+ if : ${{ secrets.SSH_PRIVATE_KEY != '' }}
9295 uses : appleboy/scp-action@v0.1.7
9396 with :
9497 host : ${{ secrets.SSH_HOST }}
9598 username : ${{ secrets.SSH_USER }}
9699 key : ${{ secrets.SSH_PRIVATE_KEY }}
100+ passphrase : ${{ secrets.SSH_PASSPHRASE }}
97101 source : " docker-compose.prod.yml"
98- target : " /opt /edgeflow/ docker-compose.yml"
102+ target : " /tmp /edgeflow- docker-compose.yml"
99103 strip_components : 0
100104
101- - name : Deploy via SSH
105+ - name : Upload docker-compose file (password)
106+ if : ${{ secrets.SSH_PRIVATE_KEY == '' && secrets.SSH_PASSWORD != '' }}
107+ uses : appleboy/scp-action@v0.1.7
108+ with :
109+ host : ${{ secrets.SSH_HOST }}
110+ username : ${{ secrets.SSH_USER }}
111+ password : ${{ secrets.SSH_PASSWORD }}
112+ source : " docker-compose.prod.yml"
113+ target : " /tmp/edgeflow-docker-compose.yml"
114+ strip_components : 0
115+
116+ - name : Deploy via SSH (key)
117+ if : ${{ secrets.SSH_PRIVATE_KEY != '' }}
102118 uses : appleboy/ssh-action@v1.0.3
103119 with :
104120 host : ${{ secrets.SSH_HOST }}
105121 username : ${{ secrets.SSH_USER }}
106122 key : ${{ secrets.SSH_PRIVATE_KEY }}
123+ passphrase : ${{ secrets.SSH_PASSPHRASE }}
107124 script : |
108125 set -euo pipefail
109126 APP_DIR=/opt/edgeflow
110127 sudo mkdir -p ${APP_DIR}
111128 cd ${APP_DIR}
129+ # Move compose file into place
130+ if [ -d docker-compose.yml ]; then sudo rm -rf docker-compose.yml; fi
131+ if [ -f /tmp/edgeflow-docker-compose.yml ]; then mv /tmp/edgeflow-docker-compose.yml docker-compose.yml; fi
112132 # Write .env with image tags
113133 cat > .env << 'EOF'
114134 BACKEND_IMAGE=${{ needs.build-and-push.outputs.backend_image }}
@@ -127,3 +147,34 @@ jobs:
127147 # Basic health checks
128148 curl -fsS http://localhost:8000/api/health || (echo 'Backend health failed' && exit 1)
129149 curl -fsS http://localhost:3000/ || (echo 'Frontend health failed' && exit 1)
150+
151+ - name : Deploy via SSH (password)
152+ if : ${{ secrets.SSH_PRIVATE_KEY == '' && secrets.SSH_PASSWORD != '' }}
153+ uses : appleboy/ssh-action@v1.0.3
154+ with :
155+ host : ${{ secrets.SSH_HOST }}
156+ username : ${{ secrets.SSH_USER }}
157+ password : ${{ secrets.SSH_PASSWORD }}
158+ script : |
159+ set -euo pipefail
160+ APP_DIR=/opt/edgeflow
161+ sudo mkdir -p ${APP_DIR}
162+ cd ${APP_DIR}
163+ # Move compose file into place
164+ if [ -d docker-compose.yml ]; then sudo rm -rf docker-compose.yml; fi
165+ if [ -f /tmp/edgeflow-docker-compose.yml ]; then mv /tmp/edgeflow-docker-compose.yml docker-compose.yml; fi
166+ # Write .env with image tags
167+ cat > .env << 'EOF'
168+ BACKEND_IMAGE=${{ needs.build-and-push.outputs.backend_image }}
169+ FRONTEND_IMAGE=${{ needs.build-and-push.outputs.frontend_image }}
170+ EOF
171+ # Login to GHCR if credentials provided
172+ if [ -n "${{ secrets.GHCR_USERNAME }}" ] && [ -n "${{ secrets.GHCR_TOKEN }}" ]; then
173+ echo "${{ secrets.GHCR_TOKEN }}" | docker login ghcr.io -u "${{ secrets.GHCR_USERNAME }}" --password-stdin
174+ fi
175+ (docker compose version || docker-compose version)
176+ (docker compose --env-file .env -f docker-compose.yml pull || docker-compose --env-file .env -f docker-compose.yml pull)
177+ (docker compose --env-file .env -f docker-compose.yml up -d || docker-compose --env-file .env -f docker-compose.yml up -d)
178+ docker image prune -f || true
179+ curl -fsS http://localhost:8000/api/health || (echo 'Backend health failed' && exit 1)
180+ curl -fsS http://localhost:3000/ || (echo 'Frontend health failed' && exit 1)
0 commit comments