Check your docker-compose file
Paste or drop a docker-compose.yml or compose.yaml. It is read in this tab only and never uploaded, so the passwords in it stay with you. You get what will break and what is risky, each with a one-line fix and its source, and for 30 known apps the data folders their docs say must be mounted.
Why a generic validator, or a chat, misses what matters here
- Your file holds your passwords. Compose files routinely carry database passwords and API keys. Pasting one into a chat or an upload-based validator hands them to a third party. This page parses the file with a YAML library served from this site and shows any secret-looking value as its first two characters and
•••, in the page and in the Markdown export. - It knows where 30 apps keep their data. Syntax checkers see a valid file when Immich runs without its
/datamount. Dankhost holds each app's documented services, images, volumes and variables, copied from the app's own docs, so it can tell you that your photos, your Vaultwarden vault or your Paperless documents live inside the container and disappear at the next update. - It knows why a published database is worse than it looks. Docker publishes ports with its own firewall rules, which take effect before ufw's, so
5432:5432on a VPS is open to the internet even whenufw statussays it is denied.
What it checks
Sixteen generic rules run on every service. Each links to the Compose file reference or to Docker's own documentation.
- error The file is not valid YAML. Docker Compose refuses a file it cannot parse, so nothing in it starts. Compose file reference
- error No services, or a service that is not a mapping. A Compose file needs a top-level services: mapping, and each service must be a mapping of keys such as image: and ports:. Compose file reference: services
- error Database or cache port published on every network interface. Docker routes published ports in its own iptables rules, before ufw's rules see the traffic, so a database published as 5432:5432 on a VPS is reachable from the internet even with ufw set to deny. Docker docs: Packet filtering and firewalls, Docker and ufw
- warning Image tag is latest, or missing (which means latest). The next docker compose pull fetches whatever is newest, including a major version that migrates or breaks your data, and afterwards you cannot tell which version you were running. Compose file reference: image
- warning No restart policy. The default policy is no: after a crash, or after the server reboots, the container stays stopped until you start it by hand. Compose file reference: restart
- warning Docker socket mounted into the container. Whoever can talk to the Docker API controls the host: it can start a privileged container that mounts /. Mounting the socket :ro does not help, because read-only applies to the file, not to the API calls sent through it. Docker docs: Docker daemon attack surface
- warning privileged: true. The container gets every Linux capability and access to all host devices, so an attacker who breaks into the app has the host. Docker docs: Runtime privilege and Linux capabilities
- warning network_mode: host. The container shares the host's network: every port it listens on is open on the host, its ports: list is ignored, and it cannot reach other services by name on the file's networks. Compose file reference: network_mode
- warning cap_add: ALL or SYS_ADMIN. ALL grants every capability; SYS_ADMIN alone covers mounting filesystems and much of what privileged mode allows. Compose file reference: cap_add
- warning Secret written in plain text in the file. Anyone who can read the file, its git history, a backup or a paste of it has the value, and docker inspect prints it. Docker docs: Manage secrets securely in Docker Compose
- error Two services publish the same host port. Only one container can bind a host port; the second fails to start with 'port is already allocated'. Compose file reference: ports
- error The whole host filesystem (/) is bind-mounted. The container can read every file on the host, including /etc/shadow and SSH keys, and change them unless the mount is read-only. Docker docs: Bind mounts
- warning A whole home directory is bind-mounted. The container can read (and, unless :ro, change) SSH keys, shell start-up files and every other file in that home, which is a short step to running code as that user. Docker docs: Bind mounts
- error depends_on names a service that is not in the file. docker compose up stops before starting anything when depends_on points at an undefined service. Compose file reference: depends_on
- error Two services use the same container_name. Container names are unique on a Docker host, so the second container cannot be created. Compose file reference: container_name
- info The top-level version: key is obsolete. Compose ignores it apart from printing a warning; it always validates against the newest schema. Compose file reference: Version top-level element (obsolete)
App-aware rules
When a service's image is one of the documented images below, five more rules compare it with that app's documented definition and cite the app's own install page. Shared images such as postgres, mariadb, redis and valkey are never taken as a sign of any app.
- error A documented data folder of a recognised app is not mounted. Whatever the app writes there lives in the container's own layer, so it is lost when the container is recreated, which docker compose pull followed by up -d does on every update.
- info A documented cache folder of a recognised app is not mounted. Nothing irreplaceable is lost, but the app rebuilds or downloads it again after every recreate.
- info The documented library folder of a recognised app is not mounted. This is where the app's docs put your own files (media, books, music). If you mount them at another path, point the app's library setting there instead.
- warning Environment variables of the documented definition are missing. The app's documented definition sets these; without them it may fall back to a default database password, a wrong public URL or untrusted proxy headers.
- info A repackaged image of a known app. Repackaged images (LinuxServer.io's, for example) often use other paths and variables than the documented image, so the app-aware checks were not run on this service.
What it cannot do
- It runs nothing. No container is started, so it cannot tell you whether an image exists, whether a tag has been published or whether the app starts.
- It checks no network. It does not look up hostnames, test ports or see your firewall; the published-port rules read only what the file says.
- It scans no CVEs. It does not pull images or look at what is inside them. Use an image scanner for that.
- It reads one file.
.envfiles,env_file:,extends:andinclude:are not followed, and${VARIABLES}are not filled in. A service withenv_file:gets no missing-variable check, because the variables may be in that file. - It only knows 30 apps. App-aware findings exist only for the apps below, matched by image. Any other service still gets every generic rule.
The 30 apps it recognises, and by which images
- Nextcloud
nextcloud - Immich
ghcr.io/immich-app/immich-serverghcr.io/immich-app/immich-machine-learningghcr.io/immich-app/postgres - Jellyfin
jellyfin/jellyfin - Vaultwarden
vaultwarden/server - Home Assistant
ghcr.io/home-assistant/home-assistant - Paperless-ngx
ghcr.io/paperless-ngx/paperless-ngx - Uptime Kuma
louislam/uptime-kuma - Audiobookshelf
ghcr.io/advplyr/audiobookshelf - Navidrome
deluan/navidrome - FreshRSS
freshrss/freshrss - Forgejo
codeberg.org/forgejo/forgejo - Mealie
ghcr.io/mealie-recipes/mealie - Actual Budget
actualbudget/actual-server - Stirling-PDF
docker.stirlingpdf.com/stirlingtools/stirling-pdf - linkding
sissbruecker/linkding - Miniflux
miniflux/miniflux - Grafana
grafana/grafana-enterprise - PhotoPrism
photoprism/photoprism - Kavita
jvmilazz0/kavita - Syncthing
syncthing/syncthing - n8n
n8nio/n8n - Open WebUI
ollama/ollamaghcr.io/open-webui/open-webui - Ghost
ghost - BookStack
lscr.io/linuxserver/bookstack - Wiki.js
ghcr.io/requarks/wiki - Memos
neosmemo/memos - ntfy
binwiederhier/ntfy - Vikunja
vikunja/vikunja - Gotify
gotify/server - changedetection.io
ghcr.io/dgtlmoon/changedetection.io