diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml new file mode 100644 index 0000000..79e3a49 --- /dev/null +++ b/.gitea/workflows/deploy.yml @@ -0,0 +1,104 @@ +name: Deploy to Homelab + +on: + push: + branches: + - production-deployment + +jobs: + deploy: + name: Deploy Wordly to 192.168.1.151 + runs-on: self-hosted + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + ref: production-deployment + + - name: Copy environment file + run: | + if [ ! -f .env ]; then + echo "WARNING: .env file not found. Creating from template." + echo "You must manually set secrets in .env on the server." + cp .env.production .env + fi + + - name: Build and start services + run: | + docker compose build --no-cache backend frontend + docker compose up -d + + - name: Wait for services to be healthy + run: | + echo "Waiting for services to start..." + sleep 15 + + # Check each service + SERVICES="wordly-postgres wordly-redis wordly-backend wordly-frontend" + FAILED=0 + + for svc in $SERVICES; do + STATUS=$(docker inspect --format='{{.State.Status}}' $svc 2>/dev/null || echo "not found") + if [ "$STATUS" = "running" ]; then + echo " $svc: RUNNING" + else + echo " $svc: $STATUS (may still be starting)" + FAILED=$((FAILED + 1)) + fi + done + + # Wait more for slow services + sleep 20 + + # Final health check on backend + for i in $(seq 1 10); do + if curl -sf http://localhost:8000/health > /dev/null 2>&1; then + echo "Backend health check: OK" + break + fi + echo "Waiting for backend... attempt $i/10" + sleep 5 + done + + if ! curl -sf http://localhost:8000/health > /dev/null 2>&1; then + echo "ERROR: Backend health check failed after 50 seconds" + docker compose logs --tail=30 backend + exit 1 + fi + + - name: Cleanup old images + run: | + docker image prune -f --filter "until=48h" 2>/dev/null || true + + - name: Deploy summary + run: | + echo "=========================================" + echo " Wordly Deployment Complete" + echo "=========================================" + docker compose ps + echo "" + echo "Health: $(curl -sf http://localhost:8000/health 2>/dev/null || echo 'FAILED')" + echo "=========================================" + + # Optional: deploy monitoring stack + deploy-monitoring: + name: Deploy Monitoring (if configured) + runs-on: self-hosted + needs: deploy + if: hashFiles('docker-compose.monitoring.yml') != '' + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + ref: production-deployment + + - name: Start monitoring services + run: | + docker compose -f docker-compose.yml -f docker-compose.monitoring.yml up -d prometheus grafana node-exporter cadvisor + continue-on-error: true + + - name: Monitoring status + run: | + echo "Monitoring services:" + docker compose -f docker-compose.yml -f docker-compose.monitoring.yml ps + continue-on-error: true