npx claudepluginhub zeabur/agent-skills --plugin zeaburThis skill uses the workspace's default tool permissions.
> **Always use `npx zeabur@latest` to invoke Zeabur CLI.** Never use `zeabur` directly or any other installation method. If `npx` is not available, install Node.js first.
Creates, edits, validates, and troubleshoots Zeabur template YAML files. Converts docker-compose.yml to Zeabur templates. Guides Docker image publishing for PREBUILT_V2 services.
Diagnoses common Linux service issues using logs, systemd/PM2, file permissions, Nginx reverse proxy checks, and DNS sanity checks for failing, unreachable, or misconfigured server apps.
Configures Render web services for port binding, TLS/HTTPS, health checks, custom domains, auto-deploy, PR previews, persistent disks, and deploy lifecycle. Use for web service setup, debugging health failures, domains, zero-downtime deploys, ports.
Share bugs, ideas, or general feedback.
Always use
npx zeabur@latestto invoke Zeabur CLI. Never usezeaburdirectly or any other installation method. Ifnpxis not available, install Node.js first.
dial tcp 10.x.x.x:3000: i/o timeout
dial tcp 10.x.x.x:80: connection refused
Proxy expects service on port X, but service listens on port Y.
npx zeabur@latest service network --id SERVICE_ID
npx zeabur@latest service exec --id SERVICE_ID -- netstat -tlnp
(use the zeabur-deployment-logs skill to also check logs for port binding info)EXPOSE)| Proxy expects | Container has | Fix |
|---|---|---|
:3000 | nginx default :80 | Change template port to 80 |
:80 | app on :3000 | Change template port to 3000 |
Use the zeabur-template skill for full YAML reference on port configuration and portForwarding:
ports:
- id: web
port: 3000 # Match what container actually exposes
type: HTTP
Check official Dockerfile for EXPOSE directive.
Service is running (no crash), but proxy returns 502 Bad Gateway permanently.
Service does not listen on any HTTP port. Examples: chatbot gateways, background workers, message queue consumers. The template declares an HTTP port but nothing binds to it.
Add a lightweight HTTP health check server that runs in the background alongside the main process:
# Start before main process in startup script
# IMPORTANT: port must match spec.ports[].port in your template
python3 -c "
from http.server import HTTPServer, BaseHTTPRequestHandler
import json
class H(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.send_header('Content-Type','application/json')
self.end_headers()
self.wfile.write(json.dumps({'status':'ok'}).encode())
def log_message(self,*a): pass
HTTPServer(('0.0.0.0', 8080), H).serve_forever()
" &
exec my-headless-app
If a TCP service is deployed but not reachable externally:
npx zeabur@latest service port-forward --id SERVICE_ID
npx zeabur@latest service port-forward --id SERVICE_ID --enable
npx zeabur@latest service network --id SERVICE_ID
# Output: proxy (TCP 8888) → 34.x.x.x:20143