name: Deploy to Production on: push: branches: - main workflow_dispatch: jobs: deploy: name: Build and Deploy runs-on: ubuntu-24.04 steps: - name: Setup SSH run: | mkdir -p ~/.ssh echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa chmod 600 ~/.ssh/id_rsa ssh-keyscan -H 192.168.1.190 >> ~/.ssh/known_hosts - name: Deploy via SSH env: APP_URL: ${{ vars.APP_URL }} ADMIN_EMAIL: ${{ vars.ADMIN_EMAIL }} run: | ssh root@192.168.1.190 bash << ENDSSH set -e cd /opt/memento echo "=== Git pull ===" git config --global --add safe.directory /opt/memento git pull origin main echo "=== Update config from Gitea vars ===" ENV_FILE="/opt/memento/.env.docker" if [ -n "$APP_URL" ]; then if grep -q "^NEXTAUTH_URL=" "\$ENV_FILE"; then sed -i "s|^NEXTAUTH_URL=.*|NEXTAUTH_URL=\"$APP_URL\"|" "\$ENV_FILE" else echo "NEXTAUTH_URL=\"$APP_URL\"" >> "\$ENV_FILE" fi echo " NEXTAUTH_URL => $APP_URL" fi if [ -n "$ADMIN_EMAIL" ]; then if grep -q "^ADMIN_EMAIL=" "\$ENV_FILE"; then sed -i "s|^ADMIN_EMAIL=.*|ADMIN_EMAIL=\"$ADMIN_EMAIL\"|" "\$ENV_FILE" else echo "ADMIN_EMAIL=\"$ADMIN_EMAIL\"" >> "\$ENV_FILE" fi echo " ADMIN_EMAIL => $ADMIN_EMAIL" fi echo "=== Building ===" docker compose build memento-note echo "=== Starting ===" docker compose up -d --remove-orphans docker compose ps ENDSSH - name: Wait for app to be healthy run: | echo "Waiting up to 180s for http://192.168.1.190 ..." for i in $(seq 1 36); do CODE=$(curl -s -o /dev/null -w "%{http_code}" --max-time 5 -L http://192.168.1.190/ || echo "000") if [ "$CODE" != "000" ] && [ "$CODE" -lt 500 ]; then echo "✅ App OK (HTTP $CODE) after $((i * 5))s" exit 0 fi echo " [$((i * 5))s] HTTP $CODE" sleep 5 done echo "Timeout! Derniers logs :" ssh root@192.168.1.190 "docker logs memento-web --tail=50" exit 1 - name: Cleanup if: always() run: ssh root@192.168.1.190 "docker image prune -f" || true