Documentation
¶
Overview ¶
Package catalog holds Levelrail's own curated set of one-click service templates (ADR 015). Every Template's name, slogan, and Compose body here is written fresh for this platform: none of it is copied or lightly-rewritten from any other project's own dataset. Image tags are real, versioned tags for each well-known open-source project; where a specific tag's exact string couldn't be verified against a live registry in this environment, that entry says so in its own comment.
Index ¶
Constants ¶
This section is empty.
Variables ¶
var Templates = []Template{
{
ID: "n8n",
Name: "n8n",
Slogan: "Build automations and connect your tools with a visual, node-based workflow editor.",
Category: "Automation",
DocumentationURL: "https://docs.n8n.io",
Compose: `services:
n8n:
image: n8nio/n8n:1.62.1
ports: ["5678:5678"]
environment:
N8N_ENCRYPTION_KEY: $SERVICE_HEX_64_ENCRYPTIONKEY
N8N_HOST: "0.0.0.0"
N8N_PORT: "5678"
volumes:
- n8n_data:/home/node/.n8n
`,
},
{
ID: "uptime-kuma",
Name: "Uptime Kuma",
Slogan: "A self-hosted uptime monitor with a clean dashboard for HTTP, TCP, DNS, and ping checks.",
Category: "Monitoring",
DocumentationURL: "https://github.com/louislam/uptime-kuma/wiki",
Compose: `services:
uptime-kuma:
image: louislam/uptime-kuma:1.23.13
ports: ["3001:3001"]
volumes:
- uptime_kuma_data:/app/data
`,
},
{
ID: "minio",
Name: "MinIO",
Slogan: "S3-compatible object storage you run yourself, with a built-in web console.",
Category: "Storage",
DocumentationURL: "https://min.io/docs/minio/linux/index.html",
Compose: `services:
minio:
image: minio/minio:RELEASE.2024-10-13T13-34-11Z
command: ["server", "/data", "--console-address", ":9001"]
ports: ["9000:9000", "9001:9001"]
environment:
MINIO_ROOT_USER: $SERVICE_USER_ROOT
MINIO_ROOT_PASSWORD: $SERVICE_PASSWORD_ROOT
volumes:
- minio_data:/data
`,
},
{
ID: "metabase",
Name: "Metabase",
Slogan: "Ask questions of your data and share dashboards, no SQL required.",
Category: "Analytics",
DocumentationURL: "https://www.metabase.com/docs/latest/",
Compose: `services:
metabase:
image: metabase/metabase:v0.50.8
ports: ["3000:3000"]
environment:
MB_DB_FILE: /metabase-data/metabase.db
volumes:
- metabase_data:/metabase-data
`,
},
{
ID: "grafana",
Name: "Grafana",
Slogan: "Dashboards and exploration for metrics, logs, and traces from any data source.",
Category: "Monitoring",
DocumentationURL: "https://grafana.com/docs/grafana/latest/",
Compose: `services:
grafana:
image: grafana/grafana:11.2.0
ports: ["3000:3000"]
environment:
GF_SECURITY_ADMIN_PASSWORD: $SERVICE_PASSWORD_ADMIN
volumes:
- grafana_data:/var/lib/grafana
`,
},
{
ID: "prometheus",
Name: "Prometheus",
Slogan: "A metrics time-series database and alerting engine built for pull-based scraping.",
Category: "Monitoring",
DocumentationURL: "https://prometheus.io/docs/introduction/overview/",
Compose: `services:
prometheus:
image: prom/prometheus:v2.54.1
ports: ["9090:9090"]
volumes:
- prometheus_data:/prometheus
`,
},
{
ID: "portainer",
Name: "Portainer",
Slogan: "A web UI for managing containers, images, volumes, and networks.",
Category: "Infrastructure",
DocumentationURL: "https://docs.portainer.io",
Compose: `services:
portainer:
image: portainer/portainer-ce:2.21.0
ports: ["9443:9443"]
volumes:
- portainer_data:/data
`,
},
{
ID: "vaultwarden",
Name: "Vaultwarden",
Slogan: "A lightweight, self-hosted password manager server compatible with the Bitwarden clients.",
Category: "Security",
DocumentationURL: "https://github.com/dani-garcia/vaultwarden/wiki",
Compose: `services:
vaultwarden:
image: vaultwarden/server:1.32.1
ports: ["8080:80"]
environment:
ADMIN_TOKEN: $SERVICE_HEX_64_ADMINTOKEN
volumes:
- vaultwarden_data:/data
`,
},
{
ID: "vikunja",
Name: "Vikunja",
Slogan: "An open-source task and project manager for teams that outgrew sticky notes.",
Category: "Productivity",
DocumentationURL: "https://vikunja.io/docs/",
Compose: `services:
vikunja:
image: vikunja/vikunja:0.24.1
ports: ["3456:3456"]
environment:
VIKUNJA_SERVICE_JWTSECRET: $SERVICE_HEX_64_JWTSECRET
VIKUNJA_DATABASE_TYPE: sqlite
volumes:
- vikunja_data:/app/vikunja/files
`,
},
{
ID: "outline",
Name: "Outline",
Slogan: "A fast, structured team wiki and knowledge base with real-time collaborative editing.",
Category: "Productivity",
DocumentationURL: "https://docs.getoutline.com",
Compose: `services:
outline:
image: outlinewiki/outline:0.79.0
ports: ["3000:3000"]
environment:
SECRET_KEY: $SERVICE_HEX_64_SECRETKEY
UTILS_SECRET: $SERVICE_HEX_64_UTILSSECRET
DATABASE_URL: postgres://outline:$SERVICE_PASSWORD_DB@db:5432/outline
REDIS_URL: redis://redis:6379
URL: ${SERVICE_FQDN_OUTLINE:-http://localhost:3000}
FORCE_HTTPS: "false"
volumes:
- outline_data:/var/lib/outline/data
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: outline
POSTGRES_PASSWORD: $SERVICE_PASSWORD_DB
POSTGRES_DB: outline
volumes:
- outline_db_data:/var/lib/postgresql/data
redis:
image: redis:7-alpine
volumes:
- outline_redis_data:/data
`,
},
{
ID: "wordpress",
Name: "WordPress",
Slogan: "The world's most widely used content management system, self-hosted with its own database.",
Category: "Applications",
DocumentationURL: "https://wordpress.org/documentation/",
Compose: `services:
wordpress:
image: wordpress:6.6-apache
ports: ["8080:80"]
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: $SERVICE_PASSWORD_DB
WORDPRESS_DB_NAME: wordpress
volumes:
- wordpress_data:/var/www/html
db:
image: mysql:8.4
environment:
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: $SERVICE_PASSWORD_DB
MYSQL_ROOT_PASSWORD: $SERVICE_PASSWORD_MYSQLROOT
volumes:
- wordpress_db_data:/var/lib/mysql
`,
},
{
ID: "nextcloud",
Name: "Nextcloud",
Slogan: "Self-hosted file sync, sharing, and collaboration, a full private alternative to consumer cloud drives.",
Category: "Applications",
DocumentationURL: "https://docs.nextcloud.com",
Compose: `services:
nextcloud:
image: nextcloud:29.0.4-apache
ports: ["8080:80"]
environment:
NEXTCLOUD_ADMIN_USER: $SERVICE_USER_ADMIN
NEXTCLOUD_ADMIN_PASSWORD: $SERVICE_PASSWORD_ADMIN
volumes:
- nextcloud_data:/var/www/html
`,
},
{
ID: "umami",
Name: "Umami",
Slogan: "Simple, privacy-focused website analytics without tracking cookies or ad-tech.",
Category: "Analytics",
DocumentationURL: "https://umami.is/docs",
Compose: `services:
umami:
image: ghcr.io/umami-software/umami:postgresql-v2.15.0
ports: ["3000:3000"]
environment:
DATABASE_TYPE: postgresql
DATABASE_URL: postgresql://umami:$SERVICE_PASSWORD_DB@db:5432/umami
APP_SECRET: $SERVICE_HEX_64_APPSECRET
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: umami
POSTGRES_PASSWORD: $SERVICE_PASSWORD_DB
POSTGRES_DB: umami
volumes:
- umami_db_data:/var/lib/postgresql/data
`,
},
{
ID: "code-server",
Name: "code-server",
Slogan: "Run VS Code in the browser, on your own hardware, from any device with a tab open.",
Category: "Developer Tools",
DocumentationURL: "https://coder.com/docs/code-server",
Compose: `services:
code-server:
image: codercom/code-server:4.93.1
ports: ["8080:8080"]
environment:
PASSWORD: $SERVICE_PASSWORD_CODE
volumes:
- code_server_data:/home/coder/project
`,
},
{
ID: "homepage",
Name: "Homepage",
Slogan: "A fast, static, highly customizable start page for all your self-hosted services.",
Category: "Dashboard",
DocumentationURL: "https://gethomepage.dev/latest/",
Compose: `services:
homepage:
image: ghcr.io/gethomepage/homepage:v0.10.4
ports: ["3000:3000"]
volumes:
- homepage_config:/app/config
`,
},
{
ID: "ghost",
Name: "Ghost",
Slogan: "A fast, modern publishing platform for blogs and newsletters, with built-in memberships.",
Category: "Applications",
DocumentationURL: "https://ghost.org/docs/",
Compose: `services:
ghost:
image: ghost:5
ports: ["2368:2368"]
environment:
database__client: mysql
database__connection__host: db
database__connection__user: ghost
database__connection__password: $SERVICE_PASSWORD_DB
database__connection__database: ghost
url: ${SERVICE_FQDN_GHOST:-http://localhost:2368}
volumes:
- ghost_data:/var/lib/ghost/content
db:
image: mysql:8.4
environment:
MYSQL_DATABASE: ghost
MYSQL_USER: ghost
MYSQL_PASSWORD: $SERVICE_PASSWORD_DB
MYSQL_ROOT_PASSWORD: $SERVICE_PASSWORD_MYSQLROOT
volumes:
- ghost_db_data:/var/lib/mysql
`,
},
{
ID: "gitea",
Name: "Gitea",
Slogan: "A lightweight, self-hosted Git service with issues, pull requests, and a package registry.",
Category: "Developer Tools",
DocumentationURL: "https://docs.gitea.com",
Compose: `services:
gitea:
image: gitea/gitea:1.23.1
ports: ["3000:3000", "2222:22"]
environment:
GITEA__database__DB_TYPE: mysql
GITEA__database__HOST: db:3306
GITEA__database__NAME: gitea
GITEA__database__USER: gitea
GITEA__database__PASSWD: $SERVICE_PASSWORD_DB
volumes:
- gitea_data:/data
db:
image: mariadb:11
environment:
MYSQL_DATABASE: gitea
MYSQL_USER: gitea
MYSQL_PASSWORD: $SERVICE_PASSWORD_DB
MYSQL_ROOT_PASSWORD: $SERVICE_PASSWORD_MARIADBROOT
volumes:
- gitea_db_data:/var/lib/mysql
`,
},
{
ID: "plausible",
Name: "Plausible Analytics",
Slogan: "Lightweight, privacy-friendly, cookie-free web analytics with no consent banner required.",
Category: "Analytics",
DocumentationURL: "https://plausible.io/docs/self-hosting",
Compose: `services:
plausible:
image: ghcr.io/plausible/community-edition:v3.0.1
ports: ["8000:8000"]
environment:
BASE_URL: ${SERVICE_FQDN_PLAUSIBLE:-http://localhost:8000}
SECRET_KEY_BASE: $SERVICE_BASE64_64_SECRETKEYBASE
DATABASE_URL: postgres://plausible:$SERVICE_PASSWORD_DB@db:5432/plausible
CLICKHOUSE_DATABASE_URL: http://clickhouse:8123/plausible
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: plausible
POSTGRES_PASSWORD: $SERVICE_PASSWORD_DB
POSTGRES_DB: plausible
volumes:
- plausible_db_data:/var/lib/postgresql/data
clickhouse:
image: clickhouse/clickhouse-server:24.12-alpine
volumes:
- plausible_clickhouse_data:/var/lib/clickhouse
`,
},
{
ID: "mealie",
Name: "Mealie",
Slogan: "A self-hosted recipe manager and meal planner with a clean web UI and API.",
Category: "Productivity",
DocumentationURL: "https://docs.mealie.io",
Compose: `services:
mealie:
image: ghcr.io/mealie-recipes/mealie:3.17.0
ports: ["9925:9000"]
environment:
BASE_URL: ${SERVICE_FQDN_MEALIE:-http://localhost:9925}
volumes:
- mealie_data:/app/data
`,
},
{
ID: "miniflux",
Name: "Miniflux",
Slogan: "A minimalist, fast RSS/Atom feed reader with no bloat and a keyboard-driven UI.",
Category: "Productivity",
DocumentationURL: "https://miniflux.app/docs/",
Compose: `services:
miniflux:
image: ghcr.io/miniflux/miniflux:2.2.4
ports: ["8080:8080"]
environment:
DATABASE_URL: postgres://miniflux:$SERVICE_PASSWORD_DB@db:5432/miniflux?sslmode=disable
RUN_MIGRATIONS: "1"
ADMIN_USERNAME: $SERVICE_USER_ADMIN
ADMIN_PASSWORD: $SERVICE_PASSWORD_ADMIN
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: miniflux
POSTGRES_PASSWORD: $SERVICE_PASSWORD_DB
POSTGRES_DB: miniflux
volumes:
- miniflux_db_data:/var/lib/postgresql/data
`,
},
{
ID: "firefly-iii",
Name: "Firefly III",
Slogan: "A self-hosted personal finance manager for tracking budgets, bills, and spending.",
Category: "Finance",
DocumentationURL: "https://docs.firefly-iii.org",
Compose: `services:
firefly:
image: fireflyiii/core:version-6.2.3
ports: ["8080:8080"]
environment:
APP_KEY: $SERVICE_BASE64_32_APPKEY
DB_CONNECTION: mysql
DB_HOST: db
DB_DATABASE: firefly
DB_USERNAME: firefly
DB_PASSWORD: $SERVICE_PASSWORD_DB
APP_URL: ${SERVICE_FQDN_FIREFLY:-http://localhost:8080}
volumes:
- firefly_upload_data:/var/www/html/storage/upload
db:
image: mariadb:11
environment:
MYSQL_DATABASE: firefly
MYSQL_USER: firefly
MYSQL_PASSWORD: $SERVICE_PASSWORD_DB
MYSQL_ROOT_PASSWORD: $SERVICE_PASSWORD_MARIADBROOT
volumes:
- firefly_db_data:/var/lib/mysql
`,
},
{
ID: "bookstack",
Name: "BookStack",
Slogan: "A simple, self-hosted platform for organizing documentation into books, chapters, and pages.",
Category: "Productivity",
DocumentationURL: "https://www.bookstackapp.com/docs/",
Compose: `services:
bookstack:
image: lscr.io/linuxserver/bookstack:24.05.2
ports: ["6875:80"]
environment:
APP_URL: ${SERVICE_FQDN_BOOKSTACK:-http://localhost:6875}
DB_HOST: db
DB_DATABASE: bookstack
DB_USERNAME: bookstack
DB_PASSWORD: $SERVICE_PASSWORD_DB
volumes:
- bookstack_data:/config
db:
image: mariadb:11
environment:
MYSQL_DATABASE: bookstack
MYSQL_USER: bookstack
MYSQL_PASSWORD: $SERVICE_PASSWORD_DB
MYSQL_ROOT_PASSWORD: $SERVICE_PASSWORD_MARIADBROOT
volumes:
- bookstack_db_data:/var/lib/mysql
`,
},
{
ID: "jellyfin",
Name: "Jellyfin",
Slogan: "A free media server for streaming your own movies, shows, and music to any device.",
Category: "Media",
DocumentationURL: "https://jellyfin.org/docs/",
Compose: `services:
jellyfin:
image: lscr.io/linuxserver/jellyfin:10.11.8
ports: ["8096:8096"]
volumes:
- jellyfin_config:/config
- jellyfin_media:/data/media
`,
},
{
ID: "listmonk",
Name: "Listmonk",
Slogan: "A self-hosted newsletter and mailing list manager with a fast, dependency-light core.",
Category: "Communication",
DocumentationURL: "https://listmonk.app/docs/",
Compose: `services:
listmonk:
image: listmonk/listmonk:v6.0.0
ports: ["9000:9000"]
environment:
LISTMONK_ADMIN_USER: $SERVICE_USER_ADMIN
LISTMONK_ADMIN_PASSWORD: $SERVICE_PASSWORD_ADMIN
LISTMONK_db__host: db
LISTMONK_db__user: listmonk
LISTMONK_db__password: $SERVICE_PASSWORD_DB
LISTMONK_db__database: listmonk
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: listmonk
POSTGRES_PASSWORD: $SERVICE_PASSWORD_DB
POSTGRES_DB: listmonk
volumes:
- listmonk_db_data:/var/lib/postgresql/data
`,
},
{
ID: "rocketchat",
Name: "Rocket.Chat",
Slogan: "A full-featured, self-hosted team chat platform with video calls and app integrations.",
Category: "Communication",
DocumentationURL: "https://docs.rocket.chat",
Compose: `services:
rocketchat:
image: registry.rocket.chat/rocketchat/rocket.chat:8.0.1
ports: ["3000:3000"]
environment:
MONGO_URL: mongodb://mongo:27017/rocketchat
MONGO_OPLOG_URL: mongodb://mongo:27017/local
ROOT_URL: ${SERVICE_FQDN_ROCKETCHAT:-http://localhost:3000}
mongo:
image: mongo:7
volumes:
- rocketchat_mongo_data:/data/db
`,
},
{
ID: "nocodb",
Name: "NocoDB",
Slogan: "Turn any database into a smart spreadsheet, with a real-time collaborative grid UI.",
Category: "Database Tools",
DocumentationURL: "https://docs.nocodb.com",
Compose: `services:
nocodb:
image: nocodb/nocodb:0.263.5
ports: ["8080:8080"]
volumes:
- nocodb_data:/usr/app/data
`,
},
{
ID: "directus",
Name: "Directus",
Slogan: "An open-source headless CMS and instant REST/GraphQL API layer over your own database.",
Category: "Developer Tools",
DocumentationURL: "https://docs.directus.io",
Compose: `services:
directus:
image: directus/directus:11
ports: ["8055:8055"]
environment:
KEY: $SERVICE_HEX_32_KEY
SECRET: $SERVICE_HEX_32_SECRET
ADMIN_EMAIL: admin@example.com
ADMIN_PASSWORD: $SERVICE_PASSWORD_ADMIN
DB_CLIENT: pg
DB_HOST: db
DB_DATABASE: directus
DB_USER: directus
DB_PASSWORD: $SERVICE_PASSWORD_DB
CACHE_ENABLED: "true"
CACHE_STORE: redis
REDIS: redis://redis:6379
volumes:
- directus_uploads:/directus/uploads
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: directus
POSTGRES_PASSWORD: $SERVICE_PASSWORD_DB
POSTGRES_DB: directus
volumes:
- directus_db_data:/var/lib/postgresql/data
redis:
image: redis:7-alpine
volumes:
- directus_redis_data:/data
`,
},
{
ID: "trilium",
Name: "TriliumNext Notes",
Slogan: "A hierarchical, self-hosted note-taking application built for large personal knowledge bases.",
Category: "Productivity",
DocumentationURL: "https://triliumnext.github.io/Docs/",
Compose: `services:
trilium:
image: ghcr.io/triliumnext/trilium:stable
ports: ["8080:8080"]
volumes:
- trilium_data:/home/node/trilium-data
`,
},
{
ID: "shlink",
Name: "Shlink",
Slogan: "A self-hosted URL shortener with a full REST API for creating and tracking short links.",
Category: "Developer Tools",
DocumentationURL: "https://shlink.io/documentation/",
Compose: `services:
shlink:
image: shlinkio/shlink:stable
ports: ["8080:8080"]
environment:
DEFAULT_DOMAIN: ${SERVICE_FQDN_SHLINK:-localhost}
IS_HTTPS_ENABLED: "false"
volumes:
- shlink_data:/etc/shlink/data
`,
},
{
ID: "changedetection",
Name: "Changedetection.io",
Slogan: "Monitor any webpage for changes and get notified the moment content updates.",
Category: "Monitoring",
DocumentationURL: "https://github.com/dgtlmoon/changedetection.io/wiki",
Compose: `services:
changedetection:
image: ghcr.io/dgtlmoon/changedetection.io:0.49.12
ports: ["5000:5000"]
volumes:
- changedetection_data:/datastore
`,
},
{
ID: "stirling-pdf",
Name: "Stirling PDF",
Slogan: "A self-hosted, all-in-one toolkit for merging, splitting, converting, and editing PDFs.",
Category: "Productivity",
DocumentationURL: "https://docs.stirlingpdf.com",
Compose: `services:
stirling-pdf:
image: stirlingtools/stirling-pdf:0.36.2
ports: ["8080:8080"]
volumes:
- stirling_pdf_data:/usr/share/tessdata
`,
},
{
ID: "filebrowser",
Name: "File Browser",
Slogan: "A simple web UI for browsing, uploading, and sharing files from your own storage.",
Category: "Storage",
DocumentationURL: "https://filebrowser.org",
Compose: `services:
filebrowser:
image: filebrowser/filebrowser:v2.31.2
ports: ["8080:80"]
volumes:
- filebrowser_data:/srv
- filebrowser_db:/database
`,
},
{
ID: "syncthing",
Name: "Syncthing",
Slogan: "Continuous, peer-to-peer file synchronization between your own devices, no cloud in between.",
Category: "Storage",
DocumentationURL: "https://docs.syncthing.net",
Compose: `services:
syncthing:
image: lscr.io/linuxserver/syncthing:1.29.4
ports: ["8384:8384", "22000:22000"]
volumes:
- syncthing_config:/config
- syncthing_data:/data
`,
},
{
ID: "ntfy",
Name: "ntfy",
Slogan: "A simple pub-sub push notification service you can send alerts to from any script or app.",
Category: "Communication",
DocumentationURL: "https://docs.ntfy.sh",
Compose: `services:
ntfy:
image: binwiederhier/ntfy:v2.11.0
ports: ["80:80"]
volumes:
- ntfy_cache:/var/cache/ntfy
- ntfy_data:/etc/ntfy
`,
},
{
ID: "healthchecks",
Name: "Healthchecks",
Slogan: "Cron job and scheduled task monitoring: get alerted the moment a periodic job stops checking in.",
Category: "Monitoring",
DocumentationURL: "https://healthchecks.io/docs/self_hosted/",
Compose: `services:
healthchecks:
image: healthchecks/healthchecks:v4.2
ports: ["8000:8000"]
environment:
DB: postgres
DB_HOST: db
DB_NAME: healthchecks
DB_USER: healthchecks
DB_PASSWORD: $SERVICE_PASSWORD_DB
SECRET_KEY: $SERVICE_HEX_64_SECRETKEY
ALLOWED_HOSTS: "*"
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: healthchecks
POSTGRES_PASSWORD: $SERVICE_PASSWORD_DB
POSTGRES_DB: healthchecks
volumes:
- healthchecks_db_data:/var/lib/postgresql/data
`,
},
{
ID: "pgadmin",
Name: "pgAdmin",
Slogan: "A full-featured web GUI for administering and querying PostgreSQL databases.",
Category: "Database Tools",
DocumentationURL: "https://www.pgadmin.org/docs/",
Compose: `services:
pgadmin:
image: dpage/pgadmin4:8.14
ports: ["8080:80"]
environment:
PGADMIN_DEFAULT_EMAIL: admin@example.com
PGADMIN_DEFAULT_PASSWORD: $SERVICE_PASSWORD_ADMIN
volumes:
- pgadmin_data:/var/lib/pgadmin
`,
},
{
ID: "qbittorrent",
Name: "qBittorrent",
Slogan: "A free, self-hosted BitTorrent client with a full web UI for remote download management.",
Category: "Media",
DocumentationURL: "https://github.com/qbittorrent/qBittorrent/wiki",
Compose: `services:
qbittorrent:
image: lscr.io/linuxserver/qbittorrent:5.0.3
ports: ["8080:8080", "6881:6881"]
volumes:
- qbittorrent_config:/config
- qbittorrent_downloads:/downloads
`,
},
{
ID: "home-assistant",
Name: "Home Assistant",
Slogan: "Open-source home automation that puts local control and privacy first.",
Category: "IoT",
DocumentationURL: "https://www.home-assistant.io/docs/",
Compose: `services:
home-assistant:
image: ghcr.io/home-assistant/home-assistant:2025.10.2
ports: ["8123:8123"]
volumes:
- home_assistant_config:/config
`,
},
{
ID: "paperless-ngx",
Name: "Paperless-ngx",
Slogan: "Scan, index, and archive your paper documents into a searchable digital library.",
Category: "Productivity",
DocumentationURL: "https://docs.paperless-ngx.com",
Compose: `services:
paperless:
image: paperlessngx/paperless-ngx:2.14.5
ports: ["8000:8000"]
environment:
PAPERLESS_REDIS: redis://redis:6379
PAPERLESS_SECRET_KEY: $SERVICE_HEX_64_SECRETKEY
PAPERLESS_URL: ${SERVICE_FQDN_PAPERLESS:-http://localhost:8000}
volumes:
- paperless_data:/usr/src/paperless/data
- paperless_media:/usr/src/paperless/media
redis:
image: redis:7.4
volumes:
- paperless_redis_data:/data
`,
},
{
ID: "immich",
Name: "Immich",
Slogan: "Self-hosted photo and video backup with mobile apps, facial recognition, and timeline search.",
Category: "Media",
DocumentationURL: "https://immich.app/docs",
Compose: `services:
immich-server:
image: ghcr.io/immich-app/immich-server:v1.126.1
ports: ["2283:2283"]
environment:
DB_HOSTNAME: db
DB_USERNAME: immich
DB_PASSWORD: $SERVICE_PASSWORD_DB
DB_DATABASE_NAME: immich
REDIS_HOSTNAME: redis
volumes:
- immich_upload_data:/usr/src/app/upload
immich-machine-learning:
image: ghcr.io/immich-app/immich-machine-learning:v1.126.1
volumes:
- immich_ml_cache:/cache
redis:
image: redis:7.4-alpine
db:
image: ghcr.io/immich-app/postgres:14-vectorchord0.3.0-pgvectors0.2.0
environment:
POSTGRES_USER: immich
POSTGRES_PASSWORD: $SERVICE_PASSWORD_DB
POSTGRES_DB: immich
volumes:
- immich_db_data:/var/lib/postgresql/data
`,
},
{
ID: "freshrss",
Name: "FreshRSS",
Slogan: "A lightweight, self-hosted RSS aggregator with multi-user support and a mobile-friendly API.",
Category: "Productivity",
DocumentationURL: "https://freshrss.github.io/FreshRSS/",
Compose: `services:
freshrss:
image: freshrss/freshrss:1.25.0
ports: ["8080:80"]
environment:
DB_TYPE: mysql
DB_HOST: db
DB_USER: freshrss
DB_PASSWORD: $SERVICE_PASSWORD_DB
DB_BASE: freshrss
volumes:
- freshrss_data:/var/www/FreshRSS/data
db:
image: mariadb:11
environment:
MYSQL_DATABASE: freshrss
MYSQL_USER: freshrss
MYSQL_PASSWORD: $SERVICE_PASSWORD_DB
MYSQL_ROOT_PASSWORD: $SERVICE_PASSWORD_MARIADBROOT
volumes:
- freshrss_db_data:/var/lib/mysql
`,
},
{
ID: "joplin-server",
Name: "Joplin Server",
Slogan: "A self-hosted sync target for the Joplin note-taking app, replacing Dropbox or OneDrive sync.",
Category: "Productivity",
DocumentationURL: "https://joplinapp.org/help/api/server_config/",
Compose: `services:
joplin:
image: joplin/server:3.3.4
ports: ["22300:22300"]
environment:
APP_BASE_URL: ${SERVICE_FQDN_JOPLIN:-http://localhost:22300}
DB_CLIENT: pg
POSTGRES_HOST: db
POSTGRES_DATABASE: joplin
POSTGRES_USER: joplin
POSTGRES_PASSWORD: $SERVICE_PASSWORD_DB
db:
image: postgres:16
environment:
POSTGRES_USER: joplin
POSTGRES_PASSWORD: $SERVICE_PASSWORD_DB
POSTGRES_DB: joplin
volumes:
- joplin_db_data:/var/lib/postgresql/data
`,
},
{
ID: "gotenberg",
Name: "Gotenberg",
Slogan: "A stateless API for converting HTML, Markdown, Office, and PDF documents in the background.",
Category: "Developer Tools",
DocumentationURL: "https://gotenberg.dev/docs/getting-started/introduction",
Compose: `services:
gotenberg:
image: gotenberg/gotenberg:8.15
ports: ["3000:3000"]
`,
},
{
ID: "mattermost",
Name: "Mattermost",
Slogan: "An open-source, self-hosted alternative to Slack for team messaging and collaboration.",
Category: "Communication",
DocumentationURL: "https://docs.mattermost.com",
Compose: `services:
mattermost:
image: mattermost/mattermost-team-edition:release-10
ports: ["8065:8065"]
environment:
MM_SQLSETTINGS_DRIVERNAME: postgres
MM_SQLSETTINGS_DATASOURCE: postgres://mattermost:$SERVICE_PASSWORD_DB@db:5432/mattermost?sslmode=disable
MM_SERVICESETTINGS_SITEURL: ${SERVICE_FQDN_MATTERMOST:-http://localhost:8065}
volumes:
- mattermost_data:/mattermost/data
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: mattermost
POSTGRES_PASSWORD: $SERVICE_PASSWORD_DB
POSTGRES_DB: mattermost
volumes:
- mattermost_db_data:/var/lib/postgresql/data
`,
},
{
ID: "grocy",
Name: "Grocy",
Slogan: "A self-hosted ERP for your household: groceries, chores, and a shopping list that stays in sync.",
Category: "Productivity",
DocumentationURL: "https://grocy.info/en/docs",
Compose: `services:
grocy:
image: lscr.io/linuxserver/grocy:4.6.0
ports: ["8080:80"]
volumes:
- grocy_data:/config
`,
},
{
ID: "kimai",
Name: "Kimai",
Slogan: "A self-hosted time tracking tool for freelancers and teams, with invoicing and reporting.",
Category: "Productivity",
DocumentationURL: "https://www.kimai.org/documentation/",
Compose: `services:
kimai:
image: kimai/kimai2:apache
ports: ["8001:8001"]
environment:
DATABASE_URL: mysql://kimai:$SERVICE_PASSWORD_DB@db/kimai?serverVersion=8.0
ADMINMAIL: admin@example.com
ADMINPASS: $SERVICE_PASSWORD_ADMIN
volumes:
- kimai_data:/opt/kimai/var
db:
image: mysql:8
environment:
MYSQL_DATABASE: kimai
MYSQL_USER: kimai
MYSQL_PASSWORD: $SERVICE_PASSWORD_DB
MYSQL_ROOT_PASSWORD: $SERVICE_PASSWORD_MYSQLROOT
volumes:
- kimai_db_data:/var/lib/mysql
`,
},
{
ID: "activepieces",
Name: "Activepieces",
Slogan: "An open-source, no-code automation tool for connecting apps and building AI-powered workflows.",
Category: "Automation",
DocumentationURL: "https://www.activepieces.com/docs",
Compose: `services:
activepieces:
image: ghcr.io/activepieces/activepieces:0.75.0
ports: ["8080:80"]
environment:
AP_ENCRYPTION_KEY: $SERVICE_HEX_32_ENCRYPTIONKEY
AP_JWT_SECRET: $SERVICE_HEX_32_JWTSECRET
AP_FRONTEND_URL: ${SERVICE_FQDN_ACTIVEPIECES:-http://localhost:8080}
AP_POSTGRES_HOST: db
AP_POSTGRES_DATABASE: activepieces
AP_POSTGRES_USERNAME: activepieces
AP_POSTGRES_PASSWORD: $SERVICE_PASSWORD_DB
AP_REDIS_HOST: redis
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: activepieces
POSTGRES_PASSWORD: $SERVICE_PASSWORD_DB
POSTGRES_DB: activepieces
volumes:
- activepieces_db_data:/var/lib/postgresql/data
redis:
image: redis:7-alpine
volumes:
- activepieces_redis_data:/data
`,
},
{
ID: "appsmith",
Name: "Appsmith",
Slogan: "A low-code platform for building internal tools and admin panels on top of your own data.",
Category: "Developer Tools",
DocumentationURL: "https://docs.appsmith.com",
Compose: `services:
appsmith:
image: appsmith/appsmith-ce:1.72
ports: ["8080:80"]
volumes:
- appsmith_data:/appsmith-stacks
`,
},
{
ID: "invoice-ninja",
Name: "Invoice Ninja",
Slogan: "Self-hosted invoicing, quotes, and payments for freelancers and small businesses.",
Category: "Finance",
DocumentationURL: "https://invoiceninja.github.io",
Compose: `services:
invoiceninja:
image: invoiceninja/invoiceninja:5
ports: ["8080:80"]
environment:
APP_URL: ${SERVICE_FQDN_INVOICENINJA:-http://localhost:8080}
APP_KEY: $SERVICE_BASE64_32_APPKEY
DB_HOST: db
DB_DATABASE: invoiceninja
DB_USERNAME: invoiceninja
DB_PASSWORD: $SERVICE_PASSWORD_DB
REDIS_HOST: redis
volumes:
- invoiceninja_data:/var/www/app/storage
db:
image: mariadb:11
environment:
MYSQL_DATABASE: invoiceninja
MYSQL_USER: invoiceninja
MYSQL_PASSWORD: $SERVICE_PASSWORD_DB
MYSQL_ROOT_PASSWORD: $SERVICE_PASSWORD_MARIADBROOT
volumes:
- invoiceninja_db_data:/var/lib/mysql
redis:
image: redis:7.4-alpine
volumes:
- invoiceninja_redis_data:/data
`,
},
{
ID: "excalidraw",
Name: "Excalidraw",
Slogan: "A self-hosted virtual whiteboard for sketching diagrams that feel hand-drawn.",
Category: "Productivity",
DocumentationURL: "https://github.com/excalidraw/excalidraw#docker",
Compose: `services:
excalidraw:
image: excalidraw/excalidraw:0.17.6
ports: ["8080:80"]
`,
},
{
ID: "wikijs",
Name: "Wiki.js",
Slogan: "A modern, extensible wiki engine with Markdown, visual editing, and fine-grained page permissions.",
Category: "Productivity",
DocumentationURL: "https://docs.requarks.io",
Compose: `services:
wiki:
image: ghcr.io/requarks/wiki:2
ports: ["3000:3000"]
environment:
DB_TYPE: postgres
DB_HOST: db
DB_PORT: "5432"
DB_USER: wikijs
DB_PASS: $SERVICE_PASSWORD_DB
DB_NAME: wikijs
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: wikijs
POSTGRES_PASSWORD: $SERVICE_PASSWORD_DB
POSTGRES_DB: wikijs
volumes:
- wikijs_db_data:/var/lib/postgresql/data
`,
},
{
ID: "zipline",
Name: "Zipline",
Slogan: "A self-hosted file and screenshot host with a share-first upload flow and its own URL shortener.",
Category: "Storage",
DocumentationURL: "https://zipline.diced.sh/docs",
Compose: `services:
zipline:
image: ghcr.io/diced/zipline:3.7.9
ports: ["3000:3000"]
environment:
CORE_RETURN_HTTPS: "false"
CORE_DATABASE_URL: postgres://zipline:$SERVICE_PASSWORD_DB@db:5432/zipline
CORE_SECRET: $SERVICE_HEX_64_SECRET
volumes:
- zipline_uploads:/zipline/uploads
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: zipline
POSTGRES_PASSWORD: $SERVICE_PASSWORD_DB
POSTGRES_DB: zipline
volumes:
- zipline_db_data:/var/lib/postgresql/data
`,
},
{
ID: "memos",
Name: "Memos",
Slogan: "A lightweight, privacy-first note-taking service for jotting down quick thoughts.",
Category: "Productivity",
DocumentationURL: "https://www.usememos.com/docs",
Compose: `services:
memos:
image: neosmemo/memos:stable
ports: ["5230:5230"]
volumes:
- memos_data:/var/opt/memos
`,
},
{
ID: "dashy",
Name: "Dashy",
Slogan: "A feature-rich, self-hosted start page with widgets, status checks, and full visual customization.",
Category: "Dashboard",
DocumentationURL: "https://dashy.to/docs",
Compose: `services:
dashy:
image: lissy93/dashy:3.1.1
ports: ["8080:8080"]
volumes:
- dashy_config:/app/user-data
`,
},
{
ID: "glance",
Name: "Glance",
Slogan: "A fast, self-hosted dashboard that pulls RSS, weather, and other widgets onto one page.",
Category: "Dashboard",
DocumentationURL: "https://github.com/glanceapp/glance/blob/main/docs/configuration.md",
Compose: `services:
glance:
image: glanceapp/glance:v0.8.6
ports: ["8080:8080"]
volumes:
- glance_config:/app/config
`,
},
{
ID: "it-tools",
Name: "IT Tools",
Slogan: "A collection of handy online tools for developers: converters, generators, formatters, and more.",
Category: "Developer Tools",
DocumentationURL: "https://it-tools.tech",
Compose: `services:
it-tools:
image: corentinth/it-tools:2024.10.22-7ca5933
ports: ["8080:80"]
`,
},
{
ID: "meilisearch",
Name: "Meilisearch",
Slogan: "A fast, typo-tolerant search engine API you can drop into any app's search bar.",
Category: "Developer Tools",
DocumentationURL: "https://www.meilisearch.com/docs",
Compose: `services:
meilisearch:
image: getmeili/meilisearch:v1.11.1
ports: ["7700:7700"]
environment:
MEILI_MASTER_KEY: $SERVICE_HEX_32_MASTERKEY
MEILI_NO_ANALYTICS: "true"
volumes:
- meilisearch_data:/meili_data
`,
},
{
ID: "docmost",
Name: "Docmost",
Slogan: "An open-source, Notion-style collaborative wiki and documentation workspace.",
Category: "Productivity",
DocumentationURL: "https://docmost.com/docs",
Compose: `services:
docmost:
image: docmost/docmost:0.13.2
ports: ["3000:3000"]
environment:
APP_URL: ${SERVICE_FQDN_DOCMOST:-http://localhost:3000}
APP_SECRET: $SERVICE_HEX_64_APPSECRET
DATABASE_URL: postgresql://docmost:$SERVICE_PASSWORD_DB@db:5432/docmost
REDIS_URL: redis://redis:6379
volumes:
- docmost_data:/app/data/storage
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: docmost
POSTGRES_PASSWORD: $SERVICE_PASSWORD_DB
POSTGRES_DB: docmost
volumes:
- docmost_db_data:/var/lib/postgresql/data
redis:
image: redis:7.2-alpine
volumes:
- docmost_redis_data:/data
`,
},
{
ID: "glitchtip",
Name: "GlitchTip",
Slogan: "A lightweight, self-hosted error tracking service compatible with the Sentry SDK.",
Category: "Monitoring",
DocumentationURL: "https://glitchtip.com/documentation",
Compose: `services:
glitchtip:
image: glitchtip/glitchtip:6.0
ports: ["8080:8080"]
environment:
SECRET_KEY: $SERVICE_HEX_64_SECRETKEY
DATABASE_URL: postgres://glitchtip:$SERVICE_PASSWORD_DB@db:5432/glitchtip
REDIS_URL: redis://redis:6379
GLITCHTIP_DOMAIN: ${SERVICE_FQDN_GLITCHTIP:-http://localhost:8080}
DEFAULT_FROM_EMAIL: admin@example.com
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: glitchtip
POSTGRES_PASSWORD: $SERVICE_PASSWORD_DB
POSTGRES_DB: glitchtip
volumes:
- glitchtip_db_data:/var/lib/postgresql/data
redis:
image: redis:7-alpine
volumes:
- glitchtip_redis_data:/data
`,
},
{
ID: "audiobookshelf",
Name: "Audiobookshelf",
Slogan: "A self-hosted server for your audiobooks and podcasts, with sync across every device.",
Category: "Media",
DocumentationURL: "https://www.audiobookshelf.org/docs",
Compose: `services:
audiobookshelf:
image: ghcr.io/advplyr/audiobookshelf:2.34.0
ports: ["80:80"]
environment:
TZ: "Etc/UTC"
volumes:
- audiobookshelf_config:/config
- audiobookshelf_metadata:/metadata
- audiobookshelf_audiobooks:/audiobooks
- audiobookshelf_podcasts:/podcasts
`,
},
{
ID: "calcom",
Name: "Cal.com",
Slogan: "Open-source scheduling infrastructure for booking meetings without the back-and-forth.",
Category: "Productivity",
DocumentationURL: "https://cal.com/docs/self-hosting/installation",
Compose: `services:
calcom:
image: calcom/cal.com:v5.0.9
ports: ["3000:3000"]
environment:
NEXT_PUBLIC_WEBAPP_URL: ${SERVICE_FQDN_CALCOM:-http://localhost:3000}
NEXTAUTH_URL: ${SERVICE_FQDN_CALCOM:-http://localhost:3000}
NEXTAUTH_SECRET: $SERVICE_BASE64_NEXTAUTHSECRET
CALENDSO_ENCRYPTION_KEY: $SERVICE_BASE64_ENCRYPTIONKEY
DATABASE_URL: postgresql://calcom:$SERVICE_PASSWORD_DB@db:5432/calcom
CALCOM_TELEMETRY_DISABLED: "1"
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: calcom
POSTGRES_PASSWORD: $SERVICE_PASSWORD_DB
POSTGRES_DB: calcom
volumes:
- calcom_db_data:/var/lib/postgresql/data
`,
},
{
ID: "calibre-web",
Name: "Calibre-Web",
Slogan: "A clean web interface for browsing, reading, and downloading your existing Calibre ebook library.",
Category: "Media",
DocumentationURL: "https://github.com/janeczku/calibre-web/wiki",
Compose: `services:
calibre-web:
image: lscr.io/linuxserver/calibre-web:0.6.24
ports: ["8083:8083"]
environment:
PUID: "1000"
PGID: "1000"
TZ: "Etc/UTC"
volumes:
- calibreweb_config:/config
- calibreweb_books:/books
`,
},
{
ID: "convertx",
Name: "ConvertX",
Slogan: "A self-hosted file converter that handles well over a thousand image, document, and media formats.",
Category: "Developer Tools",
DocumentationURL: "https://github.com/C4illin/ConvertX",
Compose: `services:
convertx:
image: ghcr.io/c4illin/convertx:0.19.0
ports: ["3000:3000"]
environment:
JWT_SECRET: $SERVICE_PASSWORD_JWTSECRET
ACCOUNT_REGISTRATION: "false"
HTTP_ALLOWED: "true"
volumes:
- convertx_data:/app/data
`,
},
{
ID: "diun",
Name: "Diun",
Slogan: "Watches your running containers and notifies you the moment a new image tag is published.",
Category: "Monitoring",
DocumentationURL: "https://crazymax.dev/diun/",
Compose: `services:
diun:
image: crazymax/diun:4.29.0
environment:
TZ: "Etc/UTC"
LOG_LEVEL: "info"
DIUN_WATCH_WORKERS: "20"
DIUN_WATCH_SCHEDULE: "0 */6 * * *"
DIUN_PROVIDERS_DOCKER: "true"
DIUN_PROVIDERS_DOCKER_WATCHBYDEFAULT: "true"
volumes:
- diun_data:/data
`,
},
{
ID: "duplicati",
Name: "Duplicati",
Slogan: "Scheduled, encrypted backups of your files to local storage, network shares, or cloud storage.",
Category: "Storage",
DocumentationURL: "https://duplicati.readthedocs.io",
Compose: `services:
duplicati:
image: lscr.io/linuxserver/duplicati:2.1.1.0
ports: ["8200:8200"]
environment:
PUID: "1000"
PGID: "1000"
TZ: "Etc/UTC"
SETTINGS_ENCRYPTION_KEY: $SERVICE_PASSWORD_ENCRYPT
DUPLICATI__WEBSERVICE_PASSWORD: $SERVICE_PASSWORD_WEB
volumes:
- duplicati_config:/config
- duplicati_backups:/backups
`,
},
{
ID: "formbricks",
Name: "Formbricks",
Slogan: "An open-source survey and experience-management platform you run on your own infrastructure.",
Category: "Productivity",
DocumentationURL: "https://formbricks.com/docs/self-hosting/setup/docker",
Compose: `services:
formbricks:
image: ghcr.io/formbricks/formbricks:4.5.0
ports: ["3000:3000"]
environment:
WEBAPP_URL: ${SERVICE_FQDN_FORMBRICKS:-http://localhost:3000}
NEXTAUTH_URL: ${SERVICE_FQDN_FORMBRICKS:-http://localhost:3000}
NEXTAUTH_SECRET: $SERVICE_BASE64_NEXTAUTHSECRET
ENCRYPTION_KEY: $SERVICE_BASE64_ENCRYPTIONKEY
CRON_SECRET: $SERVICE_BASE64_CRONSECRET
DATABASE_URL: postgresql://formbricks:$SERVICE_PASSWORD_DB@db:5432/formbricks
REDIS_URL: redis://redis:6379
volumes:
- formbricks_uploads:/apps/web/uploads
db:
image: pgvector/pgvector:pg16
environment:
POSTGRES_USER: formbricks
POSTGRES_PASSWORD: $SERVICE_PASSWORD_DB
POSTGRES_DB: formbricks
volumes:
- formbricks_db_data:/var/lib/postgresql/data
redis:
image: redis:7-alpine
volumes:
- formbricks_redis_data:/data
`,
},
{
ID: "infisical",
Name: "Infisical",
Slogan: "An open-source secrets manager to centralize API keys, database credentials, and app config.",
Category: "Security",
DocumentationURL: "https://infisical.com/docs/self-hosting/overview",
Compose: `services:
infisical:
image: infisical/infisical:v0.154.6
ports: ["8080:8080"]
environment:
SITE_URL: ${SERVICE_FQDN_INFISICAL:-http://localhost:8080}
ENCRYPTION_KEY: $SERVICE_PASSWORD_ENCRYPTIONKEY
AUTH_SECRET: $SERVICE_REALBASE64_64_AUTHSECRET
DB_CONNECTION_URI: postgres://infisical:$SERVICE_PASSWORD_DB@db:5432/infisical
REDIS_URL: redis://redis:6379
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: infisical
POSTGRES_PASSWORD: $SERVICE_PASSWORD_DB
POSTGRES_DB: infisical
volumes:
- infisical_db_data:/var/lib/postgresql/data
redis:
image: redis:7-alpine
volumes:
- infisical_redis_data:/data
`,
},
{
ID: "leantime",
Name: "Leantime",
Slogan: "A goals-focused project management tool built for people who aren't professional project managers.",
Category: "Productivity",
DocumentationURL: "https://docs.leantime.io",
Compose: `services:
leantime:
image: leantime/leantime:3.5.6
ports: ["8080:8080"]
environment:
LEAN_DB_HOST: db
LEAN_DB_USER: leantime
LEAN_DB_PASSWORD: $SERVICE_PASSWORD_DB
LEAN_DB_DATABASE: leantime
LEAN_SESSION_PASSWORD: $SERVICE_PASSWORD_64_SESSION
LEAN_USE_REDIS: "true"
LEAN_REDIS_HOST: redis
LEAN_REDIS_PORT: "6379"
volumes:
- leantime_userfiles:/var/www/html/userfiles
- leantime_public_userfiles:/var/www/html/public/userfiles
db:
image: mysql:8.4
environment:
MYSQL_ROOT_PASSWORD: $SERVICE_PASSWORD_MYSQLROOT
MYSQL_USER: leantime
MYSQL_PASSWORD: $SERVICE_PASSWORD_DB
MYSQL_DATABASE: leantime
volumes:
- leantime_db_data:/var/lib/mysql
redis:
image: redis:7-alpine
volumes:
- leantime_redis_data:/data
`,
},
{
ID: "librespeed",
Name: "LibreSpeed",
Slogan: "A lightweight, self-hosted internet speed test with no ads, tracking, or Flash required.",
Category: "Monitoring",
DocumentationURL: "https://github.com/librespeed/speedtest",
Compose: `services:
librespeed:
image: ghcr.io/librespeed/speedtest:5.4.5
ports: ["82:82"]
environment:
MODE: standalone
TELEMETRY: "false"
WEBPORT: "82"
`,
},
{
ID: "navidrome",
Name: "Navidrome",
Slogan: "Stream your own music collection from a Subsonic-compatible server to any device, anywhere.",
Category: "Media",
DocumentationURL: "https://www.navidrome.org/docs/",
Compose: `services:
navidrome:
image: deluan/navidrome:0.54.1
ports: ["4533:4533"]
environment:
ND_SCANSCHEDULE: "1h"
ND_LOGLEVEL: "info"
volumes:
- navidrome_data:/data
- navidrome_music:/music
`,
},
{
ID: "osticket",
Name: "osTicket",
Slogan: "A widely used open-source support ticket system for teams handling customer requests.",
Category: "Productivity",
DocumentationURL: "https://docs.osticket.com/en/latest/",
Compose: `services:
osticket:
image: tiredofit/osticket:1.18.2
ports: ["80:80"]
environment:
DB_HOST: db
DB_NAME: osticket
DB_USER: osticket
DB_PASS: $SERVICE_PASSWORD_DB
INSTALL_SECRET: $SERVICE_PASSWORD_INSTALLSECRET
ADMIN_EMAIL: admin@example.com
ADMIN_USER: $SERVICE_USER_ADMIN
ADMIN_PASS: $SERVICE_PASSWORD_ADMIN
volumes:
- osticket_data:/www/osticket
db:
image: mariadb:11
environment:
MARIADB_ROOT_PASSWORD: $SERVICE_PASSWORD_DBROOT
MARIADB_DATABASE: osticket
MARIADB_USER: osticket
MARIADB_PASSWORD: $SERVICE_PASSWORD_DB
volumes:
- osticket_db_data:/var/lib/mysql
`,
},
{
ID: "overseerr",
Name: "Overseerr",
Slogan: "Lets your Plex users request new movies and TV shows straight from a shared web UI.",
Category: "Media",
DocumentationURL: "https://docs.overseerr.dev",
Compose: `services:
overseerr:
image: sctx/overseerr:1.34.0
ports: ["5055:5055"]
environment:
TZ: "Etc/UTC"
volumes:
- overseerr_config:/app/config
`,
},
{
ID: "passbolt",
Name: "Passbolt",
Slogan: "An open-source password manager built for teams, compatible with the usual browser extensions.",
Category: "Security",
DocumentationURL: "https://www.passbolt.com/docs",
Compose: `services:
passbolt:
image: passbolt/passbolt:4.12.0-ce
ports: ["80:80"]
environment:
APP_FULL_BASE_URL: ${SERVICE_FQDN_PASSBOLT:-http://localhost}
PASSBOLT_SSL_FORCE: "false"
DATASOURCES_DEFAULT_HOST: db
DATASOURCES_DEFAULT_USERNAME: passbolt
DATASOURCES_DEFAULT_PASSWORD: $SERVICE_PASSWORD_DB
DATASOURCES_DEFAULT_DATABASE: passbolt
volumes:
- passbolt_gpg:/etc/passbolt/gpg
- passbolt_jwt:/etc/passbolt/jwt
db:
image: mariadb:11
environment:
MARIADB_ROOT_PASSWORD: $SERVICE_PASSWORD_DBROOT
MARIADB_DATABASE: passbolt
MARIADB_USER: passbolt
MARIADB_PASSWORD: $SERVICE_PASSWORD_DB
volumes:
- passbolt_db_data:/var/lib/mysql
`,
},
{
ID: "penpot",
Name: "Penpot",
Slogan: "An open-source design and prototyping platform, a self-hosted alternative to Figma.",
Category: "Productivity",
DocumentationURL: "https://help.penpot.app",
Compose: `services:
frontend:
image: penpotapp/frontend:2.11.1
ports: ["8080:8080"]
backend:
image: penpotapp/backend:2.11.1
environment:
PENPOT_FLAGS: "enable-login-with-password disable-email-verification"
PENPOT_SECRET_KEY: $SERVICE_REALBASE64_64_SECRETKEY
PENPOT_PUBLIC_URI: ${SERVICE_FQDN_FRONTEND:-http://localhost:8080}
PENPOT_DATABASE_URI: postgresql://postgres/penpot
PENPOT_DATABASE_USERNAME: $SERVICE_USER_POSTGRES
PENPOT_DATABASE_PASSWORD: $SERVICE_PASSWORD_POSTGRES
PENPOT_REDIS_URI: redis://valkey/0
PENPOT_OBJECTS_STORAGE_BACKEND: fs
PENPOT_OBJECTS_STORAGE_FS_DIRECTORY: /opt/data/assets
volumes:
- penpot_assets:/opt/data/assets
exporter:
image: penpotapp/exporter:2.11.1
environment:
PENPOT_PUBLIC_URI: ${SERVICE_FQDN_FRONTEND:-http://localhost:8080}
PENPOT_REDIS_URI: redis://valkey/0
postgres:
image: postgres:15-alpine
environment:
POSTGRES_INITDB_ARGS: "--data-checksums"
POSTGRES_USER: $SERVICE_USER_POSTGRES
POSTGRES_PASSWORD: $SERVICE_PASSWORD_POSTGRES
POSTGRES_DB: penpot
volumes:
- penpot_db_data:/var/lib/postgresql/data
valkey:
image: valkey/valkey:8.1-alpine
volumes:
- penpot_valkey_data:/data
`,
},
{
ID: "prowlarr",
Name: "Prowlarr",
Slogan: "An indexer manager that syncs your torrent and Usenet indexers across the whole Arr stack.",
Category: "Media",
DocumentationURL: "https://wiki.servarr.com/prowlarr",
Compose: `services:
prowlarr:
image: lscr.io/linuxserver/prowlarr:1.22.1
ports: ["9696:9696"]
environment:
PUID: "1000"
PGID: "1000"
TZ: "Etc/UTC"
volumes:
- prowlarr_config:/config
`,
},
{
ID: "radarr",
Name: "Radarr",
Slogan: "Watches your favorite indexers for movies and automatically grabs, sorts, and renames them.",
Category: "Media",
DocumentationURL: "https://wiki.servarr.com/radarr",
Compose: `services:
radarr:
image: lscr.io/linuxserver/radarr:5.16.2
ports: ["7878:7878"]
environment:
PUID: "1000"
PGID: "1000"
TZ: "Etc/UTC"
volumes:
- radarr_config:/config
`,
},
{
ID: "redisinsight",
Name: "RedisInsight",
Slogan: "A GUI for browsing keys, running commands, and profiling performance on any Redis instance.",
Category: "Database Tools",
DocumentationURL: "https://redis.io/docs/latest/operate/redisinsight/",
Compose: `services:
redisinsight:
image: redis/redisinsight:2.70
ports: ["5540:5540"]
environment:
RI_APP_HOST: "0.0.0.0"
RI_APP_PORT: "5540"
RI_ENCRYPTION_KEY: $SERVICE_HEX_64_ENCRYPTIONKEY
volumes:
- redisinsight_data:/data
`,
},
{
ID: "soketi",
Name: "Soketi",
Slogan: "A simple, fast, Pusher-protocol-compatible WebSockets server for real-time app features.",
Category: "Developer Tools",
DocumentationURL: "https://docs.soketi.app",
Compose: `services:
soketi:
image: quay.io/soketi/soketi:1.6-16-debian
ports: ["6001:6001"]
environment:
SOKETI_DEFAULT_APP_ID: $SERVICE_USER_SOKETI
SOKETI_DEFAULT_APP_KEY: $SERVICE_REALBASE64_64_APPKEY
SOKETI_DEFAULT_APP_SECRET: $SERVICE_REALBASE64_64_APPSECRET
SOKETI_PUSHER_SCHEME: https
`,
},
{
ID: "sonarr",
Name: "Sonarr",
Slogan: "Watches your favorite indexers for new TV episodes and automatically grabs, sorts, and renames them.",
Category: "Media",
DocumentationURL: "https://wiki.servarr.com/sonarr",
Compose: `services:
sonarr:
image: lscr.io/linuxserver/sonarr:4.0.12
ports: ["8989:8989"]
environment:
PUID: "1000"
PGID: "1000"
TZ: "Etc/UTC"
volumes:
- sonarr_config:/config
`,
},
{
ID: "tolgee",
Name: "Tolgee",
Slogan: "A localization management platform where developers and translators work in one shared UI.",
Category: "Developer Tools",
DocumentationURL: "https://tolgee.io/platform",
Compose: `services:
tolgee:
image: tolgee/tolgee:3.92.0
ports: ["8080:8080"]
environment:
TOLGEE_AUTHENTICATION_ENABLED: "true"
TOLGEE_AUTHENTICATION_INITIAL_USERNAME: admin
TOLGEE_AUTHENTICATION_INITIAL_PASSWORD: $SERVICE_PASSWORD_ADMIN
TOLGEE_AUTHENTICATION_JWT_SECRET: $SERVICE_HEX_64_JWTSECRET
TOLGEE_POSTGRES_AUTOSTART_ENABLED: "false"
SPRING_DATASOURCE_URL: jdbc:postgresql://db:5432/tolgee
SPRING_DATASOURCE_USERNAME: $SERVICE_USER_DB
SPRING_DATASOURCE_PASSWORD: $SERVICE_PASSWORD_DB
volumes:
- tolgee_data:/data
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: $SERVICE_USER_DB
POSTGRES_PASSWORD: $SERVICE_PASSWORD_DB
POSTGRES_DB: tolgee
volumes:
- tolgee_db_data:/var/lib/postgresql/data
`,
},
{
ID: "weblate",
Name: "Weblate",
Slogan: "A continuous localization system for translating software with a web-based editor and review flow.",
Category: "Developer Tools",
DocumentationURL: "https://docs.weblate.org",
Compose: `services:
weblate:
image: weblate/weblate:5.9.2
ports: ["8080:8080"]
environment:
WEBLATE_SITE_DOMAIN: ${SERVICE_FQDN_WEBLATE:-localhost}
WEBLATE_ADMIN_PASSWORD: $SERVICE_PASSWORD_ADMIN
POSTGRES_HOST: db
POSTGRES_USER: weblate
POSTGRES_PASSWORD: $SERVICE_PASSWORD_DB
POSTGRES_DATABASE: weblate
REDIS_HOST: redis
REDIS_PORT: "6379"
REDIS_PASSWORD: $SERVICE_PASSWORD_REDIS
volumes:
- weblate_data:/app/data
- weblate_cache:/app/cache
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: weblate
POSTGRES_PASSWORD: $SERVICE_PASSWORD_DB
POSTGRES_DB: weblate
volumes:
- weblate_db_data:/var/lib/postgresql/data
redis:
image: redis:7-alpine
environment:
REDIS_PASSWORD: $SERVICE_PASSWORD_REDIS
volumes:
- weblate_redis_data:/data
`,
},
}
Templates is the full catalog, served by GET /api/v1/service-templates and GET /api/v1/service-templates/{id}.
Functions ¶
This section is empty.
Types ¶
type Template ¶
type Template struct {
ID string
Name string
Slogan string
Category string
DocumentationURL string
Compose string
}
Template is one deployable entry in the catalog. Compose is a full compose.yaml body, valid against internal/compose's supported subset (see catalog_test.go, which parses and validates every one).