Installation
Install Arcane with Docker Compose or the Linux install script.
Arcane runs as a single container that manages Docker on the same host through the Docker socket. Install it with Docker Compose, or on Linux run the install script, which also sets up Docker.
To manage other Docker hosts later, add them as remote environments. To restrict Docker access, see Socket Proxy.
1. Generate an encryption key
Arcane needs an ENCRYPTION_KEY that is 32 bytes long (raw, base64, or hex). Generate one with any of these commands and copy the output.
With a temporary Arcane container:
With the Arcane CLI, if you already have it installed:
With OpenSSL:
Arcane doesn’t use JWT_SECRET. Session tokens are signed with an ML-DSA-87 key that Arcane generates and stores itself. If JWT_SECRET is still set, Arcane logs a warning at startup; remove it from your environment.
2. Create compose.yaml
Paste your key in place of <your-encryption-key>, and replace /opt/docker with the folder where your Compose projects live (or where you want Arcane to create them):
services:
arcane:
image: ghcr.io/getarcaneapp/manager:latest
container_name: arcane
ports:
- '3552:3552'
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- arcane-data:/app/data
- /opt/docker:/opt/docker
environment:
- APP_URL=http://localhost:3552
- PUID=1000
- PGID=1000
- ENCRYPTION_KEY=<your-encryption-key>
- PROJECTS_DIRECTORY=/opt/docker
cgroup: host
restart: unless-stopped
volumes:
arcane-data:The official images start as root only to prepare the container, then run as a non-root user. PUID and PGID set the host UID and GID that Arcane-created files belong to. If you leave them out, Arcane uses its built-in user 65532:65532.
Projects folder
Mount your projects folder at the same path inside the container and set PROJECTS_DIRECTORY to that path, as in the example above. The path must be absolute (/opt/docker, not opt/docker). With matching paths, relative mounts such as ./config resolve the same way for Arcane and Docker, and Arcane can manage the Compose projects already in that folder.
A different container path, such as /opt/docker:/app/data/projects, also works. Arcane reads its own container mounts and translates project paths to host paths for Compose. To state the mapping yourself, set PROJECTS_DIRECTORY=<containerPath>:<hostPath>. If you don’t set PROJECTS_DIRECTORY, Arcane uses /app/data/projects.
3. Start Arcane
docker compose up -dRun the install script
On Linux, the install script sets up Docker and Arcane for you:
Uninstall
The recommended uninstall asks before it removes Arcane data, the Arcane user and group, or Docker:
To remove everything without prompting:
This removes Arcane, its data, the Arcane user and group, and the Docker packages. Only use it if you want Docker gone from the machine too.
Open Arcane
Open localhost:3552 in your browser and sign in with the default credentials below. Arcane asks you to change the password the first time you sign in.
Username:
Password:
More setup options
You don’t need any of these to get started. Expand a section if it applies to your setup.
| Mount | Purpose |
|---|---|
/var/run/docker.sock | Gives Arcane access to Docker. To limit what Arcane can do, use a socket proxy instead. |
arcane-data | Stores Arcane’s database and data. |
| Projects folder | Holds your Compose projects. See Projects folder. |
/builds | Optional. Build contexts for the Build Workspace. See Image Builds. |
/backups | Optional. Where exported backups are stored. See Backups. |
To use the optional folders, add them to the volumes: list in your compose.yaml:
/builds: used by the Build Workspace for Dockerfiles and build contexts.- Host path example:
/srv/arcane/builds:/builds - Docker volume example:
arcane-builds:/builds
- Host path example:
/backups: used to store exported volume backups somewhere predictable.- Host path example:
/srv/arcane/backups:/backups - Docker volume example:
arcane-backups:/backups
- Host path example:
If you use named Docker volumes, remember to declare them under the top-level volumes: section too.
On SELinux hosts, pick one of these:
- Use a socket proxy (recommended). Run a Docker socket proxy, point Arcane at it with
DOCKER_HOST, and add:zto the projects folder mount (/opt/docker:/opt/docker:z). Socket Proxy has the full Compose file. - Mount the socket directly. If you can’t run a proxy, disable SELinux labelling for the Arcane container and relabel the projects mount:
services:
arcane:
image: ghcr.io/getarcaneapp/manager:latest
container_name: arcane
ports:
- '3552:3552'
security_opt:
- label:disable
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- arcane-data:/app/data
- /opt/docker:/opt/docker:z
environment:
- PROJECTS_DIRECTORY=/opt/dockerThe Arcane image includes an arcane health command for Docker health checks. It calls Arcane’s local /api/health endpoint and exits non-zero if the server isn’t responding. Add it to your compose.yaml:
services:
arcane:
image: ghcr.io/getarcaneapp/manager:latest
# ...
healthcheck:
test: ['CMD', './arcane', 'health', '--timeout', '2s']
interval: 10s
timeout: 3s
retries: 5
start_period: 15sstart_period gives Arcane time to run database migrations on first boot before failed checks count against retries.
Arcane stores its data in a SQLite file inside arcane-data by default, which works well for most setups. To use Postgres instead, set DATABASE_URL:
Replace each placeholder with your database’s username, password, server address, port, and database name.
The default SQLite value, if you need to set it back, is:
Arcane uses WebSockets for live updates, so a reverse proxy in front of it must pass WebSocket connections through. Reverse Proxy has setup steps for Nginx, Apache, and other proxies.
If Arcane has to reach the internet through a proxy, for example to download templates or check for updates, see Outbound Proxy.
The manager and agent images are published for:
linux/amd64linux/arm64linux/arm/v7linux/riscv64
Docker picks your host’s architecture automatically. CLI and agent binaries on GitHub Releases also cover Linux 386 and macOS (amd64, arm64).
Preview builds are published from the main branch under the :next image tag. They’re for testing, not production. See Preview Builds.