Install Containly
Containly runs as one container on your own server. With Docker Compose it is installed in about a minute; then you create the first admin and add your hosts.
Want to look around first?The demo runs in your browser with sample hosts. Nothing to install, deleted when you leave.
Try the demoWatch the install
The overview video shows the install from 0:21. The steps below are the same, with every command to copy.
The video plays from YouTube (youtube-nocookie.com) only after you click, in English with subtitles. Watch on YouTube
Requirements
- A Linux host with Docker Engine and Docker Compose v2 (the
docker composecommand). - A 64-bit system: the image is published for linux/amd64 and linux/arm64.
- A free port, 8420 by default.
Containly talks to the Docker socket, which is equivalent to root on the host. Read the security notes in the README on GitHub before you make it reachable from the internet.
Install with Docker Compose
Create a folder and download the example Compose file and the .env template straight to their final names:
# get the compose file and the .env template$ mkdir containly && cd containly$ REPO=https://raw.githubusercontent.com/amslertec/containly/main$ curl -fsSL $REPO/docker-compose.example.yml -o docker-compose.yml$ curl -fsSL $REPO/.env.example -o .env
Before the first start, check two settings:
- In
.env, keepCONTAINLY_SECURE_COOKIES=falseas long as you open Containly over plain HTTP. Set it totrueonly behind HTTPS. - In
docker-compose.yml, change/path/to/your/compose-projectson both sides of the volume line to the folder that holds your Compose projects. The path inside the container must be the same as on the host.
Then pull the image, start it and follow the log:
# pull, start, then copy the setup token from the log$ docker compose pull$ docker compose up -d$ docker compose logs -f containly
First login
On the first start there is no admin account yet. Containly prints a one-time setup token to the log, inside a boxed banner. The token is also stored in the containly-data volume as /data/setup.token.
- Open
http://<server-ip>:8420in your browser. The setup form appears as long as no admin exists. - Enter a username and a password, and paste the setup token.
- Submit. The first admin is created, setup mode closes for good and the token is deleted.
Then turn on two-factor authentication for your account. If the page stays blank or black, you are on plain HTTP with CONTAINLY_SECURE_COOKIES=true: set it to false, restart and reload the page with Ctrl+Shift+R.
Behind a reverse proxy
For access from outside your own network, put a reverse proxy with TLS in front of Containly, for example Traefik, Caddy or nginx, and change these settings:
- Bind the port to the host only:
"127.0.0.1:8420:8420"underports:indocker-compose.yml. - Set
CONTAINLY_SECURE_COOKIES=truein.env. - Keep
CONTAINLY_TRUST_PROXY=true, the default, so Containly reads the forwarded headers. If you setCONTAINLY_PUBLIC_URLto your address, notification emails link to it.
CONTAINLY_SECURE_COOKIES=trueCONTAINLY_TRUST_PROXY=trueCONTAINLY_PUBLIC_URL=https://containly.example.com
For least-privilege access to Docker, the example Compose file also contains a filtered socket proxy. Start it with docker compose --profile hardened up -d, add a TCP endpoint on socket-proxy:2375 in Containly and remove the direct socket mount from the containly service. That port is only reachable on the internal Compose network; never publish plain port 2375.
Add more hosts
The local Docker host is connected from the start. Add more hosts in Containly in one of these ways:
- TCP with TLS client certificates, for a Docker daemon that listens on a TLS port.
- SSH, for hosts you reach over SSH.
- The agent, for hosts behind NAT or without open ports. Containly shows a one-time token and a
docker runor Compose snippet; you run it on the remote host, and the agent dials out to Containly over WSS.
On TCP and SSH hosts Containly manages Compose files through a small helper container over the plain Docker API, so nothing has to be installed there by hand. The free tier covers 2 hosts; Pro removes the limit.
Update Containly
Containly can update itself: one click in the app recreates its container on the new version and rolls back if the new version does not start up healthy. From the command line it works like any Compose service, without the automatic rollback:
$ cd containly$ docker compose pull$ docker compose up -d
The image is tagged latest and with every version number. To stay on one version, replace latest in docker-compose.yml with an exact version.
Platform notes
Containly needs nothing special from the platform: any host that runs Docker Engine and Docker Compose v2 works, whether it is a mini PC, a virtual machine, a NAS or a VPS.
On a Raspberry Pi, use a 64-bit system on a Pi 4 or Pi 5; Docker then pulls the linux/arm64 image on its own. There is no 32-bit image.