snatching amp's walkthrough for my own purposes mwhahaha traverse.dunkirk.sh/diagram/6121f05c-a5ef-4ecf-8ffc-02534c5e767c

feat: add deploy workflow

dunkirk.sh 12a46941 31de3417

verified
+66
+66
.github/workflows/deploy-traverse.yaml
··· 1 + name: Deploy Traverse 2 + 3 + on: 4 + push: 5 + branches: 6 + - main 7 + workflow_dispatch: 8 + 9 + jobs: 10 + deploy: 11 + runs-on: ubuntu-latest 12 + steps: 13 + - uses: actions/checkout@v3 14 + 15 + - name: Setup Tailscale 16 + uses: tailscale/github-action@v3 17 + with: 18 + oauth-client-id: ${{ secrets.TS_OAUTH_CLIENT_ID }} 19 + oauth-secret: ${{ secrets.TS_OAUTH_SECRET }} 20 + tags: tag:ci 21 + use-cache: "true" 22 + 23 + - name: Configure SSH 24 + run: | 25 + mkdir -p ~/.ssh 26 + echo "StrictHostKeyChecking no" >> ~/.ssh/config 27 + 28 + - name: Deploy to server 29 + run: | 30 + ssh traverse@terebithia << 'EOF' 31 + cd /var/lib/traverse/app 32 + git fetch --all 33 + git reset --hard origin/main 34 + bun install 35 + sudo /run/current-system/sw/bin/systemctl restart traverse.service 36 + EOF 37 + 38 + - name: Wait for service to start 39 + run: sleep 10 40 + 41 + - name: Health check 42 + run: | 43 + HEALTH_URL="https://traverse.dunkirk.sh" 44 + MAX_RETRIES=6 45 + RETRY_DELAY=5 46 + 47 + for i in $(seq 1 $MAX_RETRIES); do 48 + echo "Health check attempt $i/$MAX_RETRIES..." 49 + 50 + HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" "$HEALTH_URL" || echo "000") 51 + 52 + if [ "$HTTP_CODE" = "200" ]; then 53 + echo "✅ Service is healthy" 54 + exit 0 55 + fi 56 + 57 + echo "❌ Health check failed with HTTP $HTTP_CODE" 58 + 59 + if [ $i -lt $MAX_RETRIES ]; then 60 + echo "Retrying in ${RETRY_DELAY}s..." 61 + sleep $RETRY_DELAY 62 + fi 63 + done 64 + 65 + echo "❌ Health check failed after $MAX_RETRIES attempts" 66 + exit 1