Installation
Install milmil with Docker Compose in under five minutes.
Prerequisites
- Docker Desktop or Docker Engine with the Compose plugin
- ~2 GB disk space for images and app data
- ≥ 1 GB free RAM
FFmpeg is bundled in the milmildev/milmil-api image. You do not need to install it on the host.
Install with Docker
Clone the repository
git clone https://github.com/milmil-dev/milmil.git
cd milmilCreate env files
milmil uses two env files with distinct responsibilities:
| File | Controls |
|---|---|
.env (repo root) | Compose-level: ports, volume paths, Postgres credentials |
api/.env | Runtime secrets: JWT_SECRET, DATABASE_URL, Redis, integrations |
cp .env.example .env
cp api/.env.example api/.envGenerate a JWT secret (required)
The API refuses to start without a JWT_SECRET of at least 32 characters.
openssl rand -hex 32Paste the output into the JWT_SECRET= line in api/.env.
Also set MILMIL_ENCRYPTION_KEY — run openssl rand -hex 32 again and paste it into api/.env under MILMIL_ENCRYPTION_KEY=. This encrypts stored storage credentials (rclone tokens, OAuth). If unset it falls back to JWT_SECRET.
Start the stack
docker compose up -dFirst run pulls milmildev/milmil-api and milmildev/milmil-web (~1 minute).
Verify
docker compose psEvery row should show running or healthy.
curl http://localhost:8080/health
# {"status":"ok","version":"1.0.0"}Open the app
Visit http://localhost:3000 and follow the First-time Setup wizard to create your admin account and add a library.
Advanced
The default compose setup uses SQLite. To switch to Postgres:
-
Edit
api/.env:DATABASE_URL=postgres://milmil:change_me_postgres_password@postgres:5432/milmil?sslmode=disable -
Start with the
postgresprofile:docker compose --profile postgres up -d
See the Docker reference for all compose profiles.
Overlay docker-compose.dev.yml to build images from your local checkout instead of pulling published ones:
docker compose -f docker-compose.yml -f docker-compose.dev.yml up -d --buildAdd two variables to api/.env:
ADMIN_USER=admin
ADMIN_PASSWORD=your-strong-passwordOn first boot, if the users table is empty, milmil auto-creates this admin. Remove both variables after first boot to avoid leaking the password on disk.
Prerequisites: Go 1.27+, Bun 1.3+, FFmpeg in $PATH.
Backend:
cd api
go build -o milmil-api ./cmd/server
export JWT_SECRET=$(openssl rand -hex 32)
./milmil-apiFrontend:
cd web
bun install
bun run build
# Serve web/dist from Nginx, Caddy, or any static host.Point the frontend's VITE_API_URL at the API host. All env vars from api/.env.example apply.