litestar-org/litestar-skills/litestar-deployment
Claude Code and agent skill by litestar-org/litestar-skills
- community
Checking that the SKILL.md file is still in the repository.
Use when working with Dockerfile, compose, Railway, Cloud Run, GKE, systemd, Kubernetes, Terraform, deploy scripts, or granian/litestar run at runtime. Not for packaging artifacts.
Install
npx vskill@latest install litestar-org/litestar-skills/litestar-deploymentSKILL.md
Litestar Deployment
Production deployment patterns for Litestar ASGI applications across Docker, Railway, Kubernetes/GKE, Cloud Run, and systemd. Covers multi-stage Dockerfiles, distroless images, asset pipelines, worker containers, and health-check integration.
All deployment paths use Granian (via litestar-granian) as the ASGI server, uv for Python package management, and Bun for frontend asset builds.
Build vs. deploy split: this skill is about running Litestar artifacts in production. For producing those artifacts — wheel bundling with embedded Vite assets, PyApp onefile binaries, GitHub Actions CI/release pipelines — see litestar-build.
Code Style Rules
from __future__ import annotationsis allowed in consumer-app modules (Dockerfiles, deploy scripts, settings).- All Python samples use PEP 604 unions (
T | None). - Granian over uvicorn in every CMD/entrypoint. Use
litestar run(which delegates to Granian whenlitestar-granianis installed). - Environment-driven configuration via
@dataclasssettings — never hardcode secrets or connection strings. - Shell scripts follow Google Shell Style Guide (set -euo pipefail, quoted variables).
Quick Reference
| Target | Reference | Key File | |
|---|---|---|---|
| Litestar App & Cloud IAP | references/litestar-app.md | asgi.py, IAP middleware | |
| Docker (standard multi-stage) | references/docker-standard.md | Dockerfile | |
| Docker (distroless production) | references/docker-distroless.md | Dockerfile.distroless | |
Background worker container (litestar-saq / litestar-queues) | references/docker-workers.md | Dockerfile.worker | |
| Docker Compose (app + infra) | references/docker-compose.md | docker-compose.yml | |
| Railway | references/railway.md | railway.app.json | |
| Kubernetes / GKE | references/kubernetes.md | deploy.py, templates/ | |
| Cloud Run (Services & Jobs) | references/cloud-run.md | service.yaml | |
| systemd native | references/systemd.md | litestar.service |
Dockerfile CMD (all variants)
Environment variables (required in every target)
<workflow>
Workflow
Step 1: Choose deployment target
Docker Compose for local/staging. Railway for rapid PaaS. GKE/K8s for production at scale. Cloud Run for serverless containers (and Cloud Run Jobs for litestar-queues one-shot tasks). systemd for bare-metal.
Step 2: Write the Dockerfile
Start from Dockerfile.distroless for production (preferred). Use standard multi-stage for environments that need a shell. Use Dockerfile.dev for local Docker development. Always pin ARG PYTHON_VERSION=3.13.
Step 3: Build frontend assets inside Docker
Copy Bun lockfiles first (layer caching), install JS deps, then bun run build and uv run litestar assets build (or uv run app assets build when a custom [project.scripts] CLI entry point is defined). Assets must be in the wheel before uv build --wheel --clear.
Step 4: Create separate worker image (Match-Your-Stack)
Background workers use the same build stages as the web image but a different CMD, no exposed HTTP port, and a longer termination grace period (120s):
- `litestar-saq`: run
litestar workers run(orapp workers run) withSAQ_USE_SERVER_LIFESPAN=false. - `litestar-queues`: run
litestar queues run --max-concurrency 10 --drain-timeout 30.0for persistent task queues (SQLSpec, Advanced Alchemy, Redis/Valkey),litestar queues run-consumer --backend <kafka|pubsub|rabbitmq|sqs>for stream consumers,CloudTasksExecutionConfig(WorkerConfig(placement="external")) for zero-worker serverless push delivery on Cloud Run Services, orlitestar queues run-taskinside isolated Cloud Run Jobs (CloudRunExecutionConfig).
Step 5: Set up CI/CD
Build images in CI, push to registry, deploy via railway up, gcloud run deploy, or kubectl apply. Tag images with git SHA for production — never deploy latest to prod.
Step 6: Configure health checks and monitoring
Expose /health on the API container. K8s uses startupProbe + livenessProbe + readinessProbe on /health:8000. Cloud Run and Railway use the same endpoint for readiness.
</workflow>
<guardrails>
Guardrails
- Distroless for production, slim for dev. Distroless (
gcr.io/distroless/cc-debian12:nonroot) has no shell, no apt, minimal CVE surface. Use slim only when you need a shell for debugging. - Non-root user (UID 65532). Match the distroless
nonrootuser. Create withuseradd --system --uid 65532in standard images. - uv for all package installs. No pip, no pip-tools.
uv sync --frozen --no-devin builder,uv pip installwheel in runner. - UV_COMPILE_BYTECODE=1. Pre-compile .pyc in the builder — saves 200-500ms cold-start in containers.
- UV_LINK_MODE=copy. Hardlinks break on overlay filesystems. Always copy.
- Tini as PID 1. Containers need an init process for signal forwarding and zombie reaping.
ENTRYPOINT ["tini", "--"]. - Granian signal supervision (`STOPSIGNAL SIGINT`).
litestar-granianv0.16+ runs Granian in a supervised process group that forwardsSIGINT,SIGTERM, andSIGHUPand enforces--workers-kill-timeout(default 5s, plus a 5s parent deadline; pass--workers-kill-timeout 30in production). KeepingSTOPSIGNAL SIGINTensures clean shutdown across both standalone Granian andlitestar run. - Multi-architecture support. Use
docker buildxwith--platform linux/amd64,linux/arm64. Distroless Dockerfile handles arch-specific lib paths viaTARGETARCH. - Asset build inside Docker. Vite/Bun builds run in the builder stage. Never mount host
node_modulesinto production images. - Health check endpoints. Every API container must expose
/health. K8s probes hit this path. Cloud Run and Railway use it for readiness. - LITESTAR_APP env var. Both Litestar CLI and Granian read this for app discovery. Set it in Dockerfile and override per-environment.
- Never run as root.
USER nonrootin Dockerfile.runAsNonRoot: truein K8s pod security context. - Pin Python version.
ARG PYTHON_VERSION=3.13at the top. Never usepython:latest. - Separate worker containers from web containers.
litestar-saq(litestar workers run) andlitestar-queues(litestar queues run/run-consumer) poll queues or brokers, not HTTP. They need a dedicated CMD, separate scaling, and no exposed port. - Match-your-stack migration CLI commands.
advanced-alchemyregisterslitestar database(litestar database upgrade --no-promptoralchemy --config <path> upgrade --no-prompt), whereassqlspec(SQLSpecPlugin) registerslitestar db(litestar db upgrade --no-promptorsqlspec upgrade --no-prompt). Never passlitestar databaseto asqlspec-backed app. - Proxy header trust behind load balancers.
LITESTAR_TRUSTED_PROXIESconfigureslitestar-vite'sProxyHeadersMiddleware. For API-only Granian deployments withoutlitestar-vite, registerpartial(wrap_asgi_with_proxy_headers, trusted_hosts=["*"])fromgranian.utils.proxiesinLitestar(middleware=[...]). - Build-time env vars to prevent connection attempts. Set
DATABASE_POOL_DISABLED=true,SAQ_USE_SERVER_LIFESPAN=false,SAQ_WEB_ENABLED=falseduring build to prevent the app from trying to connect to databases during asset compilation.
</guardrails>
<validation>
Validation Checkpoint
Before shipping a Litestar deployment, verify:
- [ ] Dockerfile uses multi-stage build (python-base -> builder -> runner)
- [ ]
ARG PYTHON_VERSIONis pinned (notlatest) - [ ]
COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/present - [ ]
UV_COMPILE_BYTECODE=1andUV_LINK_MODE=copyset in builder - [ ] Frontend assets built inside Docker (not copied from host)
- [ ]
uv buildcreates wheel; runner installs wheel (not editable) - [ ] Runner uses non-root user (UID 65532)
- [ ]
ENTRYPOINT ["tini", "--"]set - [ ]
STOPSIGNAL SIGINTset (for Granian graceful shutdown) - [ ]
LITESTAR_APPenv var set - [ ]
/healthendpoint exists and is used by probes/readiness checks - [ ] Background worker (
litestar-saqorlitestar-queues) is a separate container/job with dedicated CMD and no EXPOSE - [ ] No secrets in Dockerfile (use env vars or mounted secrets)
- [ ] Production image is distroless or has documented justification for slim
- [ ] Docker Compose
depends_onusescondition: service_healthy
</validation>
<example>
Example
See references/docker-distroless.md for a complete 4-stage distroless Dockerfile with multi-arch support, Vite asset build, and non-root execution.
For a full local stack (app + worker + migrator + PostgreSQL + Valkey), see references/docker-compose.md.
For Kubernetes production deployment with HPA, Ingress, and GKE Workload Identity, see references/kubernetes.md.
</example>
References Index
- Litestar App Deployment & Cloud IAP — Granian CLI flags, proxy headers, and Cloud IAP JWT authentication
- Docker Standard Multi-Stage — slim-based Dockerfile with cache mounts
- Docker Distroless (Production) — preferred production image
- Docker Workers (`litestar-saq` & `litestar-queues`) — background task and consumer containers
- Docker Compose — full local/staging stack
- Railway — PaaS deployment with PostgreSQL/Redis provisioning
- Kubernetes / GKE — Deployment, Service, HPA, Ingress
- Cloud Run — serverless container and Cloud Run Job deployment
- systemd Native — bare-metal service unit
Official References
- <https://docs.litestar.dev/latest/usage/cli.html> — Litestar CLI and
litestar run - <https://docs.litestar.dev/latest/topics/deployment/index.html> — Official deployment guide
- <https://docs.railway.com/> — Railway platform docs
- <https://cloud.google.com/run/docs> — Cloud Run documentation
- <https://cloud.google.com/kubernetes-engine/docs> — GKE documentation
- <https://www.freedesktop.org/software/systemd/man/systemd.service.html> — systemd service units
- <https://github.com/GoogleContainerTools/distroless> — Distroless container images
Cross-References
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 95 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingskills/litestar-deployment/SKILL.md
Popularity
- 7-day trend score
- 0
Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/litestar-org/litestar-skills/litestar-deployment)