agentsclimarketplace

Docker compose writer

Skill chfle/lehnert-claude-skills/skills/docker-compose-writer

Use when user wants to write, generate, create, or optimize a docker-compose.yml — for a new project, an existing stack, any self-hosted app, or when they want to replace a cloud service (Google Drive, Gmail, GitHub, Slack, Notion, ChatGPT, etc.) with a self-hosted alternative.From its SKILL.md

Install
npx -y skills add chfle/lehnert-claude-skills --skill docker-compose-writer

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

2 things to look at

  • no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
  • 3 stars3 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

SKILL.md

28.1 KB, as published. Nobody here has run it

Docker Compose Writer

Overview

Three modes:

Selection Mode — User asks for a category or vague need → present 3–4 real options → user picks → generate complete stack.

Direct Mode — User names a specific app or describes a full custom stack → generate immediately.

Optimize Mode — User pastes existing docker-compose.yml → audit and fix issues → write improved version.

Language: Respond in the user's language. YAML keys and comments always in English.


Step 1 — Detect Mode and Handle "Replace X" Requests

First, map "I want to replace X" requests to the right category:

User wants to replace / runPoint to
Google Drive / DropboxFile Storage → Nextcloud, Seafile
Google Photos / iCloud PhotosPhotos → Immich
Gmail / email hostingEmail → Mailcow, Mailu
GitHub / GitLabGit Hosting → Gitea, Forgejo, GitLab CE
Slack / TeamsChat → Mattermost, Element/Matrix
Notion / ConfluenceNotes/Wiki → Outline, BookStack, Trilium
LastPass / 1Password / BitwardenPasswords → Vaultwarden, Passbolt
Trello / Jira / LinearProject Management → Plane, Vikunja
Google AnalyticsAnalytics → Plausible, Umami, Matomo
ChatGPT / Claude (locally)AI → Ollama + Open WebUI
Spotify (music streaming)Media → Navidrome
Netflix (video streaming)Media → Jellyfin
YouTube (video hosting)Media → PeerTube
Evernote / Apple Notes syncNotes → Joplin Server, Trilium
Pocket / InstapaperRead Later → Wallabag
Feedly / RSS readerRSS → FreshRSS, Miniflux
Google BookmarksBookmarks → Linkding, Hoarder
Mint / YNAB (budgeting)Finance → Firefly III, Actual Budget
Goodreads / e-book libraryBooks → Calibre-Web, Kavita
DNS / ad blockingNetwork → Pi-hole, AdGuard Home
Okta / Auth0 / SSOIdentity → Authelia, Keycloak
ngrok / Cloudflare TunnelTunnels → cloudflared, Pangolin
No open ports / CGNAT problemTunnels → cloudflared (free), Tailscale
Auto-update containersDeveloper Tools → Watchtower

Then decide mode:

User saysMode
Names specific app ("Vaultwarden", "Gitea", "Nextcloud")Direct → generate immediately
Pastes existing compose fileOptimize → audit and fix
Names category ("database", "notes", "monitoring")Selection → show 3–4 options
Describes vague need ("I want to back up my photos")Map to category → Selection
Custom app stack ("Next.js + Postgres + Redis")Direct → generate immediately
"I want to replace Google Drive"Map → File Storage Selection

Step 2 — Selection Mode: Present Options

When in Selection Mode, respond with:

Here are the best self-hosted options for [need]. Which fits your use case?

1. [App Name] — [one sentence what it is] Best for: [who/what it's best for] · RAM: [rough requirement] · Requires: [dependencies]

2. [App Name] — [one sentence] Best for: ... · RAM: ... · Requires: ...

3. [App Name] — [one sentence] Best for: ...

(Optional) 4. [App Name] — ...

Type a number to generate the full Docker Compose stack.

Never ask follow-up questions during selection — user picks a number, then generate immediately.


App Catalogue

📦 Databases & Data Stores

AppDescriptionRAMBest for
PostgreSQLIndustry-standard relational DB256MB+Most apps, complex queries
MariaDBMySQL-compatible, fast, reliable256MB+WordPress, legacy apps
MongoDBDocument NoSQL database512MB+JSON-heavy, flexible schemas
RedisIn-memory cache, session store, queue64MB+Caching, pub/sub, rate limiting
ClickHouseColumnar DB for analytics, extremely fast1GB+Time-series data, large-scale analytics
InfluxDBPurpose-built time-series database256MB+IoT metrics, monitoring

Extras to suggest alongside: pgAdmin (PostgreSQL UI) · RedisInsight (Redis UI) · Mongo Express (MongoDB UI)


📝 Notes, Wikis & Knowledge Base

AppDescriptionRAMBest for
OutlineModern team wiki, Slack/Google auth, real-time512MB+Teams, documentation
BookStackStructured wiki: books → chapters → pages256MB+Simple personal/team docs
Trilium NotesHierarchical personal KB, code, relations256MB+Power users, large wikis
Joplin ServerNote sync backend for Joplin clients (E2E encrypted)128MB+Existing Joplin users
SilverBulletMarkdown-based PKM, self-hosted Obsidian alternative64MB+Markdown note-takers
AffineNext-gen Notion/Miro hybrid — docs + whiteboard512MB+Visual knowledge work

🔒 Password Managers

AppDescriptionRAMBest for
VaultwardenUnofficial Bitwarden server, extremely lightweight64MB+Personal/family
Passbolt CETeam password manager with GPG256MB+Teams, organizations

☁️ File Storage & Cloud

AppDescriptionRAMBest for
NextcloudFull Google Drive replacement: files, calendar, contacts, office512MB+Full cloud suite
SeafileFast file sync and share, reliable256MB+Pure file sync
FilebrowserMinimal web file browser and uploader32MB+Simple access, no sync needed
SyncthingPeer-to-peer continuous file sync (no server-side storage)128MB+Device sync without central server

📸 Photos

AppDescriptionRAMBest for
ImmichSelf-hosted Google Photos: auto-backup, face recognition, albums, mobile app2GB+Phone photo backup
PhotoPrismAI-powered photo manager, facial recognition, maps1GB+Large collections, AI tags
PhotoviewFast, simple photo viewer for existing directory structure256MB+Existing photo directories
PiwigoTraditional photo gallery with albums and sharing256MB+Public photo sharing

Note for Immich: Requires PostgreSQL + Redis + Machine Learning service in the same stack.


🎬 Media Servers

AppDescriptionRAMBest for
JellyfinFully open-source media server, no subscription512MB+Privacy-first streaming
PlexFeature-rich server with mobile apps, remote access1GB+Best client support
NavidromeLightweight music server (Subsonic API)64MB+Music-only, minimal
AudiobookshelfAudiobook + podcast server with mobile apps256MB+Audiobooks, podcasts

Media automation ( arr stack):* Suggest Sonarr + Radarr + Prowlarr + qBittorrent together when user asks for automated downloads.


📥 Media Automation (*arr Stack)

AppDescription
SonarrTV show monitoring and download automation
RadarrMovie monitoring and download automation
LidarrMusic monitoring and download automation
ProwlarrIndexer manager for Sonarr/Radarr/Lidarr
qBittorrentTorrent client with web UI
SABnzbdUsenet downloader

*Always generate the full arr stack together when user asks for any of these — they're meant to work as a unit.


🤖 AI / LLM

AppDescriptionRAM / GPUBest for
Ollama + Open WebUIRun LLMs locally (Llama, Mistral, etc.) with a ChatGPT-like UI8GB+ RAM, GPU optionalLocal AI chat, privacy
LocalAIOpenAI-compatible API for local models4GB+API-compatible local AI
Stable Diffusion WebUILocal image generation (AUTOMATIC1111)4GB+ GPUAI image generation
Open WebUI (standalone)Chat UI that connects to external OpenAI/Anthropic APIs256MB+Self-hosted chat frontend

Note for Ollama: If user has NVIDIA GPU, add deploy: resources: reservations: devices for GPU passthrough.


📧 Email

AppDescriptionRAMBest for
MailcowFull-featured mail server: SMTP, IMAP, web UI, spam filter2GB+Complete email hosting
MailuSimpler mail server, easier setup than Mailcow1GB+Simple email hosting
Stalwart MailModern all-in-one mail server (JMAP/SMTP/IMAP)256MB+Modern standards, low resource

Warning: Email delivery requires proper DNS (SPF, DKIM, DMARC, PTR) — mention this when generating.


🛡️ Identity, SSO & Access

AppDescriptionRAMBest for
AutheliaLightweight SSO + 2FA proxy for nginx/Traefik64MB+Protecting services with single login
KeycloakFull enterprise identity provider, OIDC/SAML512MB+Full SSO platform, many apps
ZitadelModern cloud-native identity platform256MB+Developer-friendly, modern stack
AuthentikFlexible IdP with beautiful UI512MB+Best balance of features and ease

🔀 Reverse Proxy

AppDescriptionRAMBest for
Traefik v3Auto-discovers Docker services, Let's Encrypt TLS64MB+Multi-service, automated HTTPS
Nginx Proxy ManagerWeb UI for nginx reverse proxy + Let's Encrypt256MB+GUI over config files
CaddyAutomatic HTTPS, simple Caddyfile config64MB+Simple setups

🌐 Network & Ad Blocking

AppDescriptionRAMBest for
Pi-holeDNS-based ad blocker for entire network64MB+Network-wide ad blocking
AdGuard HomeDNS ad blocker with modern UI, DoH/DoT support64MB+Same as Pi-hole, more modern UI
UnboundValidating, recursive DNS resolver32MB+Privacy-focused recursive DNS
WireGuard (wg-easy)WireGuard VPN with simple web UI32MB+Easy VPN setup with UI
DDNS UpdaterAutomatic dynamic DNS updater (DuckDNS, Cloudflare, Namecheap, 80+ providers)16MB+Dynamic IP home servers

🚇 Tunnels & Remote Access

Use when the server is behind CGNAT, ISP blocks ports 80/443, or you don't want to open firewall ports.

AppDescriptionRAMBest for
Cloudflare Tunnel (cloudflared)Zero-trust tunnel — exposes services via Cloudflare without opening any ports; free32MB+No open ports, CGNAT, Cloudflare DNS users
TailscaleMesh VPN with subnet routing; access homelab from anywhere32MB+Private remote access, no public exposure
Pangolin + NewtSelf-hosted tunnel server (open-source Cloudflare Tunnel alternative)64MB+Full control, no external dependency

Cloudflare Tunnel pattern:

services:
  cloudflared:
    image: cloudflare/cloudflared:latest
    restart: unless-stopped
    command: tunnel --no-autoupdate run --token ${CLOUDFLARE_TUNNEL_TOKEN}
    networks:
      - app_network

Token from: Cloudflare Zero Trust → Networks → Tunnels → Create tunnel → Docker


📖 RSS & Read Later

AppDescriptionRAMBest for
FreshRSSFull-featured RSS/Atom aggregator128MB+Power RSS users
MinifluxMinimalist, fast RSS reader32MB+Simple, fast, no-frills
WallabagSave articles for later reading (Pocket replacement)256MB+Read-later queue

📚 Books, Comics & Audiobooks

AppDescriptionRAMBest for
Calibre-WebWeb UI for Calibre e-book library, OPDS support256MB+E-book library management
KavitaFast manga/comic/book server, cross-platform reader128MB+Comics, manga, mixed library
KomgaComic/manga server with OPDS + web reader256MB+Comics focus, excellent reader
AudiobookshelfAudiobook and podcast server with mobile apps256MB+Audiobooks + podcasts

🔗 Bookmarks & Links

AppDescriptionRAMBest for
LinkdingMinimal bookmark manager, browser extensions64MB+Simple, fast, self-hosted bookmarks
HoarderAI-powered bookmark manager with auto-tagging512MB+Smart bookmarks with AI tags
ShaarliPersonal link sharing / bookmark tool32MB+Simple, PHP-based, no DB

💰 Finance & Budget

AppDescriptionRAMBest for
Firefly IIIPersonal finance manager, budgets, accounts, reports256MB+Detailed personal finance
Actual BudgetModern local-first budget app (YNAB alternative)64MB+Simple, fast budgeting

📊 Analytics & Business Intelligence

AppDescriptionRAMBest for
PlausiblePrivacy-friendly, GDPR-compliant web analytics512MB+Privacy-first website analytics
UmamiMinimal, fast analytics, multi-site256MB+Simple GA replacement
MatomoFull-featured analytics, full data ownership512MB+Full Google Analytics replacement
MetabaseBI tool — query databases visually, dashboards1GB+SQL queries without SQL knowledge
GrafanaMetric visualization + dashboards256MB+Technical dashboards, time-series

🐙 Git & Code Hosting

AppDescriptionRAMBest for
GiteaLightweight self-hosted Git128MB+Personal/small team
ForgejoCommunity fork of Gitea128MB+Same, more open governance
GitLab CEFull DevOps platform: Git, CI/CD, registry4GB+Teams needing full GitLab

🚀 CI/CD

AppDescriptionRAMBest for
Woodpecker CIGitea/Forgejo-native, lightweight256MB+Gitea/Forgejo users
Drone CIContainer-native pipeline-as-code256MB+Modern container CI
JenkinsBattle-tested, massively extensible1GB+Complex pipelines, many plugins
TektonKubernetes-native CI/CD pipelines512MB+K8s environments

📦 Container Registry

AppDescriptionRAMBest for
HarborEnterprise container registry with security scanning2GB+Production, security scanning
ZotOCI-native, minimal, production-ready registry64MB+Lightweight, OCI standards
Docker RegistryOfficial Docker registry (minimal)32MB+Simple internal registry

✅ Project Management & Productivity

AppDescriptionRAMBest for
PlaneOpen-source Linear/Jira alternative1GB+Teams, software projects
VikunjaTo-do app with tasks, teams, projects128MB+Personal/small team tasks
FocalboardKanban/calendar boards (open-source Trello)128MB+Simple Kanban

🗓️ Calendar & Contacts

AppDescriptionRAMBest for
RadicaleLightweight CalDAV + CardDAV server32MB+Simple calendar + contacts sync
NextcloudFull calendar, contacts, tasks as part of cloud suite512MB+Part of full Nextcloud setup

💬 Chat & Communication

AppDescriptionRAMBest for
MattermostOpen-source Slack: channels, DMs, integrations512MB+Team chat
Matrix + ElementFederated, E2E encrypted chat (Synapse + Element Web)1GB+Secure, federated messaging
Rocket.ChatFull-featured chat platform, video calls1GB+Enterprise, video calls

🔔 Notifications

AppDescriptionRAMBest for
NtfySimple pub/sub push notification server32MB+Server alerts, cron failures
GotifySelf-hosted push notifications with Android app32MB+Android push notifications

📊 Monitoring & Observability

AppDescriptionRAMBest for
Prometheus + GrafanaIndustry-standard metrics + visualization512MB+Server/app dashboards
Uptime KumaUptime monitor + status page128MB+Service availability
NetdataReal-time metrics, zero config256MB+Live system monitoring
DozzleReal-time Docker log viewer16MB+Quick container log access

For full observability stacks → use /linux-monitoring-setup instead.


🏠 Home Automation

AppDescriptionRAMBest for
Home AssistantGold standard home automation512MB+Full smart home
Node-REDVisual flow-based IoT programming128MB+Custom automations

🛠️ Developer Tools & Utilities

AppDescriptionRAMBest for
Portainer CEDocker management web UI128MB+Visual Docker management
pgAdmin 4PostgreSQL web admin256MB+PostgreSQL administration
Stirling PDF50+ PDF operations in browser256MB+PDF processing
IT-ToolsDeveloper utility tools web UI32MB+Quick dev utilities
DashdotBeautiful server stats dashboard64MB+Server overview page
HomepagePersonal dashboard for all your services32MB+Homelab start page
SearXNGPrivacy-respecting meta search engine128MB+Self-hosted search
ShlinkURL shortener with analytics128MB+Link shortening
InfisicalOpen-source secrets manager (Vault alternative)512MB+App secrets management
WatchtowerAutomatically updates Docker images when new versions are published16MB+Auto-update homelab containers
DockgeCompose stack manager UI (alternative to Portainer)32MB+Simple compose file management
Changedetection.ioWebsite change monitoring with alerts64MB+Price tracking, content monitoring
ScrutinyHard drive S.M.A.R.T. monitoring with web UI64MB+Disk health alerts
Speedtest TrackerScheduled internet speed tests with history dashboard64MB+ISP speed monitoring

Watchtower note: By default updates all containers. Use --label-enable flag and add com.centurylinklabs.watchtower.enable: "true" only to containers you want auto-updated.


Step 3 — Generate the Compose Stack

After the user selects (or in Direct Mode), generate the complete, working stack immediately. No more questions.

Quality Standards — Every compose file MUST have:

ElementRule
No version: fieldOmit it — Compose V2 ignores it; Compose V1 compatibility not needed
Named networksAt least one; never rely on default bridge
Named volumesAll persistent data in named volumes — no bind mounts for DB data
Health checksOn every service others depends_on — use real test commands
depends_on conditioncondition: service_healthy, not service_started
Env variablesVia ${ENV_VAR} — never hardcode passwords or secrets inline
Restart policyrestart: unless-stopped on every service
Image tagsSpecific pinned tags (e.g. postgres:16-alpine) — never latest
Log limitslogging: options: max-size: "10m" max-file: "3" to prevent disk fill
Securitycap_drop: [ALL], read-only config mounts :ro, no privileged: true unless required
Internal-only portsServices not exposed to host must NOT have ports: — use Docker network
Resource limitsFor production, add deploy.resources.limits: {cpus: "1.0", memory: 512M} to prevent runaway containers consuming the whole host

Companion Service Health Check Templates

When generating Redis as a companion service, always include a health check so dependent services use condition: service_healthy:

  redis:
    image: redis:7-alpine
    restart: unless-stopped
    volumes:
      - redis_data:/data
    networks:
      - app_network
    healthcheck:
      test: ["CMD", "redis-cli", "--raw", "ping"]
      # redis:7-alpine includes redis-cli. For minimal custom images use:
      # test: ["CMD", "sh", "-c", "redis-cli ping | grep -q PONG"]
      interval: 10s
      timeout: 5s
      retries: 5

App-Specific Requirements

Some apps require specific companion services — always include them:

AppRequired companions
ImmichPostgreSQL 16 + Redis + immich-machine-learning service
NextcloudMariaDB or PostgreSQL + Redis (for caching + locking)
MailcowDo not use docker-compose-writer — Mailcow has its own installer; direct user to curl -LO https://github.com/mailcow/mailcow-dockerized/archive/master.tar.gz
OutlinePostgreSQL + Redis
PlanePostgreSQL + Redis + MinIO (object storage)
AuthentikPostgreSQL + Redis
KeycloakPostgreSQL
Matrix/SynapsePostgreSQL
GitLab CEPostgreSQL + Redis (bundled in official image, or external)
MetabasePostgreSQL (for app metadata)
Firefly IIIMariaDB or PostgreSQL
Actual BudgetNone (local SQLite, no companion needed)
HoarderRedis + meilisearch for full-text search
Ollama + Open WebUINo companions needed; add GPU passthrough if user has NVIDIA

NVIDIA GPU Passthrough (for Ollama, Stable Diffusion)

Ask if user has NVIDIA GPU. If yes, add to the service:

runtime: nvidia       # Required — separate from deploy.resources
deploy:
  resources:
    reservations:
      devices:
        - driver: nvidia
          count: all
          capabilities: [gpu]

Requirements:

  • NVIDIA Container Toolkit must be installed on host (both runtime: and deploy: require it)
  • After install: sudo systemctl restart docker
  • Test GPU access: docker run --rm --runtime=nvidia nvidia/cuda:12.0-base nvidia-smi

Install guide: https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html


Traefik Middleware Labels (add when Traefik is in the stack)

When generating services behind Traefik, offer these middleware patterns for exposed services:

Basic Auth (protect internal tools — pgAdmin, Grafana, etc.):

labels:
  traefik.http.middlewares.myapp-auth.basicauth.users: "${BASIC_AUTH_USERS}"
  # Generate hash: echo $(htpasswd -nB admin) | sed -e s/\\$/\\$\\$/g
  traefik.http.routers.myapp.middlewares: "myapp-auth@docker"

Rate Limiting (protect public-facing APIs):

labels:
  traefik.http.middlewares.myapp-ratelimit.ratelimit.average: "100"
  traefik.http.middlewares.myapp-ratelimit.ratelimit.burst: "50"
  traefik.http.middlewares.myapp-ratelimit.ratelimit.period: "1m"
  traefik.http.routers.myapp.middlewares: "myapp-ratelimit@docker"

Force HTTPS Redirect (HTTP → HTTPS on port 80):

labels:
  traefik.http.middlewares.redirect-https.redirectscheme.scheme: "https"
  traefik.http.middlewares.redirect-https.redirectscheme.permanent: "true"
  traefik.http.routers.myapp-http.rule: "Host(`${DOMAIN}`)"
  traefik.http.routers.myapp-http.entrypoints: "web"
  traefik.http.routers.myapp-http.middlewares: "redirect-https@docker"

IP Allowlist (restrict to specific IPs — e.g. internal only):

labels:
  traefik.http.middlewares.myapp-ipallowlist.ipallowlist.sourcerange: "192.168.1.0/24,10.0.0.0/8"
  traefik.http.routers.myapp.middlewares: "myapp-ipallowlist@docker"

Middlewares can be chained: middlewares: "redirect-https@docker,myapp-auth@docker"


Step 4 — Write Files Silently

Do NOT print the compose file or .env.example content in chat. Write them to disk silently.

File locations — kebab-case subdirectory in current working directory:

[app-name]/
  docker-compose.yml    ← complete, production-ready
  .env.example          ← all required vars with descriptions and safe placeholder values

Generate complete .env.example — every env var must have:

  • A comment explaining what it is
  • A safe placeholder value (not empty — CHANGE_ME_strong_password_here, your-domain.com, etc.)
  • A note if it's auto-generated (e.g. # Generate with: openssl rand -hex 32)

Output — print ONLY this after writing:

✅ [App Name] stack created in ./[app-name]/

▶ Setup:
  cd [app-name]
  cp .env.example .env
  nano .env              # ← edit ALL passwords and domain settings first!

▶ Start:
  docker compose up -d

▶ Check health:
  docker compose ps
  docker compose logs -f [service-name]

📋 Useful commands:
  docker compose pull && docker compose up -d    # update to latest images
  docker compose down                            # stop (data preserved)
  docker compose down -v                         # ⚠️  stop + DELETE ALL DATA

💾 Backup volumes (before updating or migrating):
  docker run --rm -v [volume_name]:/data -v $(pwd):/backup alpine \
    tar czf /backup/[volume_name]-$(date +%Y%m%d).tar.gz -C /data .
  # Restore: tar xzf [volume_name]-YYYYMMDD.tar.gz -C /data

🌐 Access: http://localhost:[PORT]
[default login credentials if applicable]

⚠️  [Any important warnings — email DNS, firewall ports, first-run setup steps]

💡 Next steps:
  [1-2 relevant next steps, e.g. "Set up Traefik for HTTPS → /docker-compose-writer Traefik"]
  [e.g. "Back up volumes → /linux-backup-restore Docker volumes"]
  [e.g. "Monitor this stack → /linux-monitoring-setup for Prometheus + Grafana"]

List each UI separately if multiple services expose ports:

🌐 App:      http://localhost:8080
🌐 Admin UI: http://localhost:9000  (admin / [password from .env])

Optimize Mode (existing compose pasted)

When user pastes an existing compose file:

  1. Audit silently for all issues:

    • latest image tags → pin to specific version
    • Hardcoded secrets → replace with ${ENV_VAR}
    • Missing health checks → add working test commands
    • Missing restart policy → add unless-stopped
    • Default bridge network → add named network
    • Missing log limits → add logging block
    • privileged: true without reason → warn and remove if possible
    • Bind mounts for DB data → move to named volumes
  2. Write fixed docker-compose.yml to ./[app-name]/docker-compose.yml

  3. If secrets were hardcoded, also write .env.example

  4. Print only:

✅ Optimized compose written to ./[app-name]/docker-compose.yml
   Fixed [N] issues:
   - Pinned [X] image tags (removed :latest)
   - Moved secrets to .env.example
   - Added health checks to [services]
   - Added log rotation limits
   - [other changes]

🌐 Access: http://localhost:[PORT]

Security Rules (non-negotiable)

  • No inline secrets — ${ENV_VAR} only, never password: mysecret
  • Read-only config mounts — always :ro for config files that the app only reads
  • cap_drop: [ALL] — drop all Linux capabilities; add back only what's explicitly needed
  • Never privileged: true — if the user insists, warn with the security risk and require explicit confirmation
  • Non-root user — user: "1000:1000" for app services where the image supports it
  • Internal networks — services that communicate only internally must NOT have ports: exposed to host
  • Log limits — always add logging block to prevent disk fill from container logs

Homelab / Multi-App Stacks

When user asks for a "full homelab setup", "all my self-hosted apps in one compose", or similar:

  1. Ask which categories they want: file cloud, media, monitoring, git, CI/CD, etc.
  2. Generate a single docker-compose.yml with all requested apps + shared infrastructure (Traefik as reverse proxy, shared PostgreSQL, shared Redis)
  3. Use Traefik labels for routing instead of port mappings where possible
  4. Group services with comments (# ── Media ──, # ── Storage ──, etc.)

Keep looking

Skills are one crate of 626,194. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.