20f61a0417
Build & Deploy Tippspiel / build (push) Successful in 15s
- Helmet CSP: upgrade-insecure-requests und HSTS für HTTP-Deployments deaktiviert (war die Ursache der leeren Seite - Browser versuchte JS über HTTPS zu laden) - Backend: statische Dateien werden jetzt in allen NODE_ENV-Modi serviert - Frontend: IS_DEV erkennt auch VITE_TEST_MODE=true (Build-Zeit Variable) - Dockerfile: VITE_TEST_MODE=true beim Vite-Build, NODE_ENV=development - docker-compose.yml: NODE_ENV=development, CORS_ORIGIN=* - Gitea Workflow: Auth-Token für git clone, Build via Portainer API statt lokaler Docker CLI Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
74 lines
4.0 KiB
YAML
74 lines
4.0 KiB
YAML
name: Build & Deploy Tippspiel
|
|
|
|
on:
|
|
push:
|
|
branches: [main]
|
|
|
|
jobs:
|
|
build:
|
|
runs-on: self-hosted
|
|
steps:
|
|
- name: Checkout
|
|
run: |
|
|
rm -rf workspace && mkdir workspace
|
|
GIT_TERMINAL_PROMPT=0 git clone \
|
|
--depth 1 \
|
|
--branch main \
|
|
http://x-token:${{ secrets.DEPLOY_TOKEN }}@gitea:3000/mwf975_git/tippspiel.git \
|
|
workspace
|
|
|
|
- name: Create build context
|
|
run: |
|
|
cd workspace
|
|
tar cf /tmp/tippspiel-ci.tar \
|
|
--exclude='.git' \
|
|
--exclude='node_modules' \
|
|
--exclude='*.docx' \
|
|
--exclude='prototyp_*.html' \
|
|
.
|
|
echo "Build context size: $(du -sh /tmp/tippspiel-ci.tar | cut -f1)"
|
|
|
|
- name: Build Docker Image via Portainer
|
|
run: |
|
|
echo "Starting Docker build on NAS..."
|
|
curl -s -k -X POST \
|
|
"https://192.168.1.60:9444/api/endpoints/2/docker/build?t=wm2026-tippspiel:latest&dockerfile=./Dockerfile" \
|
|
-H "X-API-Key: ${{ secrets.PORTAINER_TOKEN }}" \
|
|
-H "Content-Type: application/x-tar" \
|
|
--data-binary @/tmp/tippspiel-ci.tar \
|
|
--max-time 600 \
|
|
| grep -E '(Successfully built|Successfully tagged|error|Error)' || true
|
|
echo "Build completed."
|
|
|
|
- name: Redeploy Stack via Portainer
|
|
run: |
|
|
echo "Redeploying stack wm2026-tippspiel..."
|
|
curl -s -k -X PUT \
|
|
"https://192.168.1.60:9444/api/stacks/115?endpointId=2" \
|
|
-H "X-API-Key: ${{ secrets.PORTAINER_TOKEN }}" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"stackFileContent": "services:\n tippspiel:\n image: wm2026-tippspiel:latest\n container_name: wm2026-tippspiel\n restart: unless-stopped\n ports:\n - \"3301:3001\"\n environment:\n - NODE_ENV=development\n - PORT=3001\n - DATABASE_URL=postgresql://postgres.ggqsfnlqezgxcfqkytrr:mPlkB1cVWWHexzcgMk@aws-0-eu-west-1.pooler.supabase.com:6543/postgres\n - SUPABASE_URL=https://ggqsfnlqezgxcfqkytrr.supabase.co\n - SUPABASE_SERVICE_ROLE_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImdncXNmbmxxZXpneGNmcWt5dHJyIiwicm9sZSI6InNlcnZpY2Vfcm9sZSIsImlhdCI6MTc3NTIzNjc4NiwiZXhwIjoyMDkwODEyNzg2fQ.WVT_M73ZTs7u-MMoeodTwFMH8u5G4wq1aQw5n8ZpZ2A\n - ANTHROPIC_API_KEY=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\n - FOOTBALL_API_KEY=15ae56716ff341a6b5ee977a38727915\n - FOOTBALL_API_BASE_URL=https://api.football-data.org/v4\n - ELEVENLABS_API_KEY=sk_8eaa1dfa56d58265c08cea57b2a72b65b355c97f43f85483\n - CORS_ORIGIN=*\n - STAFFBASE_PUBLIC_KEY=dev-mode-no-key-needed\n - STAFFBASE_PLUGIN_ID=\n healthcheck:\n test: [\"CMD\", \"wget\", \"-qO-\", \"http://localhost:3001/health\"]\n interval: 30s\n timeout: 5s\n start_period: 10s\n retries: 3\n networks:\n - main-network\n\nnetworks:\n main-network:\n external: true",
|
|
"env": [],
|
|
"prune": true,
|
|
"pullImage": false
|
|
}' \
|
|
| python3 -c "import sys,json; d=json.load(sys.stdin); print('Stack redeployed:', d.get('Name'), '| Status:', d.get('Status'))" 2>/dev/null \
|
|
|| echo "Stack redeploy triggered."
|
|
echo "Deployment complete!"
|
|
|
|
- name: Verify deployment
|
|
run: |
|
|
sleep 15
|
|
STATUS=$(curl -s http://192.168.1.60:3301/health | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('status'))" 2>/dev/null || echo "unreachable")
|
|
echo "Health check: $STATUS"
|
|
if [ "$STATUS" = "ok" ]; then
|
|
echo "✅ Deployment successful! App running at http://192.168.1.60:3301"
|
|
else
|
|
echo "⚠️ Health check inconclusive (container may be restarting)"
|
|
fi
|
|
|
|
- name: Cleanup
|
|
if: always()
|
|
run: rm -rf workspace /tmp/tippspiel-ci.tar
|