name: Deploy to Production on: push: branches: - main jobs: deploy: name: Build and Deploy runs-on: ubuntu-24.04 steps: - name: Checkout code uses: actions/checkout@v4 - 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: Sync code to server run: | rsync -az --delete \ --exclude='.git' \ --exclude='node_modules' \ --exclude='.next' \ --exclude='.env*' \ ./ root@192.168.1.190:/opt/memento/ - name: Build and deploy run: | ssh root@192.168.1.190 << 'ENDSSH' set -e cd /opt/memento 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 120s for memento-web..." for i in $(seq 1 24); do STATUS=$(ssh root@192.168.1.190 "docker inspect --format='{{.State.Health.Status}}' memento-web 2>/dev/null || echo unknown") if [ "$STATUS" = "healthy" ]; then echo "OK - healthy after $((i * 5))s" exit 0 fi echo " [$((i * 5))s] $STATUS" sleep 5 done echo "Timeout! Derniers logs :" ssh root@192.168.1.190 "docker logs memento-web --tail=30" exit 1 - name: Cleanup if: always() run: ssh root@192.168.1.190 "docker image prune -f" || true