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.
Generates optimized multi-stage Dockerfiles and docker-compose configs for containerizing Node.js, Python, Go, Rust apps with health checks, volumes, and non-root security.
Dockerizes full-stack apps with multi-stage builds, configures docker-compose, CI/CD pipelines via GitHub Actions, nginx/Traefik reverse proxy, SSL/TLS with certbot, and multi-environment deploys with rollback strategies.
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.
When deploying source code to Zeabur, you must generate a Dockerfile. This skill covers how to analyze a project and produce a correct, deployable Dockerfile.
Before generating a Dockerfile, read the key project files:
| Language | Files to read |
|---|---|
| Node.js | package.json, lockfile (package-lock.json / yarn.lock / pnpm-lock.yaml) |
| Python | requirements.txt, Pipfile, pyproject.toml |
| Go | go.mod |
| Rust | Cargo.toml |
| PHP | composer.json |
| Ruby | Gemfile |
| Java | pom.xml, build.gradle |
| .NET | *.csproj, *.sln |
| Elixir | mix.exs |
Also check for:
Dockerfile or docker-compose.ymlvite.config.js, webpack.config.js, next.config.js, etc.).env.example for required environment variablesWhat NOT to read — skip these to save tokens:
From the prerequisite files, determine:
ENV or ARG instructions (unless required by the framework — see language-specific sections)LABEL "language"="<lang>" — possible values: nodejs, python, go, static, ruby, java, php, rust, dotnet, elixir, swift, bunLABEL "framework"="<framework>" only for actual web frameworks (see list below)COPY . . before running any install/build commandsWORKDIR /src unless the user specifies otherwiseEXPOSE for the port the app listens onzeabur/caddy-static)Frameworks (use LABEL "framework"="..."):
vite, create-react-app, next.js, remix, nuxt.js, umi, nest.js, hexo, vitepress, astro, sli.dev, docusaurus, nitropack, hono, medusa, svelte, flask, django, fastapi, spring-boot, laravel, thinkphp, rails, aspnet, blazorwasm, elysia, baojs
Never label as framework (these are packages/libraries):
If unsure whether something is a framework or package, do NOT add the framework label.
zeabur/caddy-staticFor pure static websites (Vite, Astro static, Docusaurus, plain HTML), use zeabur/caddy-static:
FROM node:22-slim AS build
LABEL "language"="nodejs"
LABEL "framework"="vite"
WORKDIR /src
COPY . .
RUN npm install
RUN npm run build
FROM zeabur/caddy-static
COPY --from=build /src/dist /usr/share/caddy
Rules for zeabur/caddy-static:
/usr/share/caddyCMD or ENTRYPOINT — the image handles it8080LABEL "language"="nodejs" (not "static")node:22-slim| Lockfile | Package manager | Install command |
|---|---|---|
package-lock.json | npm | npm install |
yarn.lock | yarn | yarn install |
pnpm-lock.yaml | pnpm | RUN npm install -g pnpm && pnpm install |
npm, use npm install. Do NOT use npm ci or flags like --only=production, --omit=dev, --frozen-lockfile.zeabur/caddy-static to serve.Next.js — Zeabur injects PORT=8080 into the container, so Next.js production mode listens on 8080 by default. No extra config needed.
FROM node:22-slim
LABEL "language"="nodejs"
LABEL "framework"="next.js"
WORKDIR /src
COPY . .
RUN npm install
RUN npm run build
EXPOSE 8080
CMD ["npm", "start"]
Svelte / SvelteKit — Use node:22 (not alpine, not slim). Set ENV PORT=8080. Single-stage build — do NOT use zeabur/caddy-static. Do NOT use cross-env ADAPTER=static or adapter-specific build commands.
FROM node:22
LABEL "language"="nodejs"
LABEL "framework"="svelte"
ENV PORT=8080
WORKDIR /src
RUN npm install -g pnpm@9
COPY . .
RUN pnpm install
RUN pnpm build
EXPOSE 8080
CMD ["pnpm", "start"]
python:3.10Flask — Find the WSGI entry first. For example, if main.py contains app = Flask(__name__), the entry is main:app.
FROM python:3.10
LABEL "language"="python"
LABEL "framework"="flask"
WORKDIR /src
COPY . .
RUN pip install -r requirements.txt gunicorn
EXPOSE 8080
CMD ["gunicorn", "--bind", "0.0.0.0:8080", "main:app"]
FastAPI — Choose the start method based on what exists:
fastapi-cli is in requirements.txt → fastapi runif __name__ == "__main__": exists in a .py file → python <file>.pyuvicorn main:app --host 0.0.0.0 --port 8080 (install uvicorn if missing)FROM python:3.10
LABEL "language"="python"
LABEL "framework"="fastapi"
WORKDIR /src
COPY . .
RUN pip install -r requirements.txt
EXPOSE 8080
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8080"]
Generic Python — If WSGI might be applicable, use gunicorn. If unsure, just use python <file>.py.
FROM golang:1.23 AS build
WORKDIR /src
COPY . .
RUN go build -o /app .
FROM debian:bookworm-slim
LABEL "language"="go"
COPY --from=build /app /app
EXPOSE 8080
CMD ["/app"]
Uses NGINX + PHP-FPM. Adjust PHP version and extensions as needed.
FROM php:8.3-fpm
LABEL "language"="php"
WORKDIR /var/www
ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/
RUN chmod +x /usr/local/bin/install-php-extensions && sync
RUN apt update && apt install -y cron curl gettext git grep libicu-dev nginx pkg-config unzip && rm -rf /var/lib/apt/lists/*
RUN install-php-extensions @composer apcu bcmath gd intl mysqli opcache pcntl pdo_mysql sysvsem zip
RUN cat <<'NGINX' > /etc/nginx/sites-enabled/default
server {
listen 8080;
root /var/www;
index index.php index.html;
charset utf-8;
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ /\.(?!well-known).* { deny all; }
error_log /dev/stderr;
access_log /dev/stderr;
}
NGINX
RUN chown -R www-data:www-data /var/www
COPY --chown=www-data:www-data . /var/www
USER www-data
RUN if [ -f composer.json ]; then composer install --optimize-autoloader --classmap-authoritative --no-dev; fi && if [ -f package.json ]; then npm install; fi
USER root
EXPOSE 8080
CMD ["sh", "-c", "php-fpm -D && nginx -g 'daemon off;'"]
For Laravel, add optimization after composer install:
RUN php artisan config:cache && php artisan route:cache && php artisan view:cache
language, framework) if missingAfter generating the Dockerfile, deploy with:
npx zeabur@latest deploy --project-id <project-id> --json
For redeployment (must pass service ID to avoid creating duplicates):
npx zeabur@latest deploy --project-id <project-id> --service-id <service-id> --json
Use the zeabur-deploy skill for the full deployment workflow.
If the build or runtime fails:
zeabur-deployment-logs skillRUN install stepEXPOSE matches what the app listens on; check with zeabur-port-mismatch skillCMD matches the project's actual entry pointzeabur/caddy-static if the app produces static output--service-id to update the existing service