mirror of
https://github.com/hanzo-apps/templates.git
synced 2026-10-30 14:48:30 +00:00
Aggregates five OSS one-click/self-hosting catalogs into the Dokploy blueprint
shape the Hanzo PaaS consumes (meta.json array + blueprints/<id>/{template.toml,
docker-compose.yml,meta.json,logo}):
Dokploy 500 (MIT, verbatim) · Coolify 174 (Apache-2.0) · CapRover 161
(Apache-2.0) · CasaOS 85 (Apache-2.0) · Runtipi 110 (GPL-3.0)
Deduped by app identity; each source + app keeps its upstream license
(ATTRIBUTION.md). Deterministic aggregators + a hard validator (every
template.toml parses with the platform's toml lib, every compose parses as YAML,
meta.json is the expected array, and an over-HTTP fetch probe exercises all
1030) — 0 hard failures. Served natively by hanzoai/static on DOKS (no CDN/Pages/
Vercel); CI builds on the hanzo-build-linux-amd64 arc pool; operator App CR in
crs/ serves it at templates.hanzo.ai.
114 lines
3.8 KiB
TOML
114 lines
3.8 KiB
TOML
[variables]
|
|
app_release = "v1.3.1"
|
|
main_domain = "${domain}"
|
|
postgres_password = "${password:32}"
|
|
minio_password = "${password:32}"
|
|
rabbitmq_password = "${password:32}"
|
|
secret_key = "${base64:48}"
|
|
live_secret_key = "${base64:48}"
|
|
|
|
[config]
|
|
env = [
|
|
"# ===== Application =====",
|
|
"# Plane image tag deployed for every service.",
|
|
"APP_RELEASE=${app_release}",
|
|
"# Public domain Plane is served on.",
|
|
"APP_DOMAIN=${main_domain}",
|
|
"# Full external URL of the instance (used to build links).",
|
|
"WEB_URL=https://${main_domain}",
|
|
"# Browser origins allowed to call the API (CORS).",
|
|
"CORS_ALLOWED_ORIGINS=https://${main_domain}",
|
|
"# Internal URL other services use to reach the API.",
|
|
"API_BASE_URL=http://plane-api:8000",
|
|
"# Django secret key: signs sessions and tokens. Keep it secret.",
|
|
"SECRET_KEY=${secret_key}",
|
|
"# Shared secret between the API and the realtime (live) server.",
|
|
"LIVE_SERVER_SECRET_KEY=${live_secret_key}",
|
|
"",
|
|
"# ===== PostgreSQL =====",
|
|
"# Database user.",
|
|
"POSTGRES_USER=plane",
|
|
"# Database password.",
|
|
"POSTGRES_PASSWORD=${postgres_password}",
|
|
"# Database name.",
|
|
"POSTGRES_DB=plane",
|
|
"# Port PostgreSQL listens on.",
|
|
"POSTGRES_PORT=5432",
|
|
"# Host the app and libpq tools connect to.",
|
|
"PGHOST=plane-db",
|
|
"# Default database for libpq tools.",
|
|
"PGDATABASE=plane",
|
|
"# On-disk location of the database files.",
|
|
"PGDATA=/var/lib/postgresql/data",
|
|
"# Full connection string (composed from the values above).",
|
|
"DATABASE_URL=postgresql://plane:${postgres_password}@plane-db:5432/plane",
|
|
"",
|
|
"# ===== Redis / Valkey (cache) =====",
|
|
"# Redis host.",
|
|
"REDIS_HOST=plane-redis",
|
|
"# Redis port.",
|
|
"REDIS_PORT=6379",
|
|
"# Full Redis connection URL.",
|
|
"REDIS_URL=redis://plane-redis:6379/",
|
|
"",
|
|
"# ===== RabbitMQ (task queue) =====",
|
|
"# Broker host.",
|
|
"RABBITMQ_HOST=plane-mq",
|
|
"# Broker port.",
|
|
"RABBITMQ_PORT=5672",
|
|
"# Broker user.",
|
|
"RABBITMQ_USER=plane",
|
|
"# Broker password.",
|
|
"RABBITMQ_PASSWORD=${rabbitmq_password}",
|
|
"# Broker virtual host.",
|
|
"RABBITMQ_VHOST=plane",
|
|
"# Full AMQP connection string (composed from the values above).",
|
|
"AMQP_URL=amqp://plane:${rabbitmq_password}@plane-mq:5672/plane",
|
|
"",
|
|
"# ===== Object storage (MinIO / S3) =====",
|
|
"# Use the bundled MinIO (1) instead of an external S3 provider (0).",
|
|
"USE_MINIO=1",
|
|
"# AWS region; leave empty when using MinIO.",
|
|
"AWS_REGION=",
|
|
"# S3 / MinIO access key.",
|
|
"AWS_ACCESS_KEY_ID=access-key",
|
|
"# S3 / MinIO secret key.",
|
|
"AWS_SECRET_ACCESS_KEY=${minio_password}",
|
|
"# S3 / MinIO endpoint URL.",
|
|
"AWS_S3_ENDPOINT_URL=http://plane-minio:9000",
|
|
"# Bucket used to store uploads.",
|
|
"AWS_S3_BUCKET_NAME=uploads",
|
|
"# Max upload size in bytes (default 5 MiB).",
|
|
"FILE_SIZE_LIMIT=5242880",
|
|
"# Set to 1 if the S3 / MinIO endpoint is served over HTTPS.",
|
|
"MINIO_ENDPOINT_SSL=0",
|
|
"",
|
|
"# ===== Caddy proxy =====",
|
|
"# Address the in-container Caddy listens on. Required: the proxy",
|
|
"# Caddyfile has no default and an empty value crashes it on boot.",
|
|
"SITE_ADDRESS=:80",
|
|
"# Peers allowed to set X-Forwarded-For / X-Real-IP. 'private_ranges'",
|
|
"# trusts only Dokploy's private upstream (Traefik) and blocks public",
|
|
"# IP spoofing. Use a narrower CIDR if exposing the proxy directly.",
|
|
"TRUSTED_PROXIES=private_ranges",
|
|
"",
|
|
"# ===== App runtime =====",
|
|
"# Django debug mode; keep 0 in production.",
|
|
"DEBUG=0",
|
|
"# Number of Gunicorn workers for the API.",
|
|
"GUNICORN_WORKERS=1",
|
|
"# Rate limit applied to API-key requests.",
|
|
"API_KEY_RATE_LIMIT=60/minute",
|
|
"# Comma-separated IPs allowed as webhook targets; empty allows all.",
|
|
"WEBHOOK_ALLOWED_IPS=",
|
|
"# Comma-separated hosts allowed as webhook targets; empty allows all.",
|
|
"WEBHOOK_ALLOWED_HOSTS=",
|
|
]
|
|
|
|
mounts = []
|
|
|
|
[[config.domains]]
|
|
serviceName = "proxy"
|
|
port = 80
|
|
host = "${main_domain}"
|