Manual install
Use this when the server has no desktop - a VPS, a NAS, a machine in a rack - or when you'd simply rather see what you're running.
Create a folder for the install
Everything lives here: the compose file, the .env, and by extension your
database. Put it somewhere permanent.
New-Item -ItemType Directory -Force -Path "$env:ProgramData\Chronicler" | Out-Null
Set-Location "$env:ProgramData\Chronicler"
sudo mkdir -p /opt/chronicler
cd /opt/chronicler
Download the compose file
Invoke-WebRequest -Uri "https://github.com/ChroniclerLM/Releases/releases/latest/download/docker-compose.yml" -OutFile "docker-compose.yml"
curl -L -o docker-compose.yml \
https://github.com/ChroniclerLM/Releases/releases/latest/download/docker-compose.yml
Write the .env
Two values are required: a database password, and which runtime to use for the model.
"POSTGRES_PASSWORD=$([guid]::NewGuid().ToString('N'))`nCOMPOSE_PROFILES=cpu" | Out-File -Encoding ascii .env
-Encoding ascii matters: Docker Compose can't read the UTF-16 that
Out-File writes by default.
printf 'POSTGRES_PASSWORD=%s\nCOMPOSE_PROFILES=cpu\n' "$(openssl rand -hex 24)" > .env
Pick the right runtime
COMPOSE_PROFILES decides which Ollama container starts: cpu, nvidia or
amd. cpu always works. If the machine has a graphics card, let the detection
script choose:
$vram = nvidia-smi --query-gpu=memory.total --format=csv,noheader,nounits 2>$null
$profile = if ($vram) { "nvidia" } else { "cpu" }
(Get-Content .env) -replace '^COMPOSE_PROFILES=.*$', "COMPOSE_PROFILES=$profile" |
Set-Content -Encoding ascii .env
if ($vram) {
Add-Content -Encoding ascii .env "CHRONICLER_GPU_VRAM_GB=$([math]::Floor($vram / 1024))"
}
AMD acceleration is Linux-only. On Windows this selects NVIDIA when its driver is visible; otherwise it keeps the CPU profile.
curl -L -o detect-hardware.sh \
https://github.com/ChroniclerLM/Releases/releases/latest/download/detect-hardware.sh
chmod +x detect-hardware.sh
./detect-hardware.sh
It probes the host and writes the right COMPOSE_PROFILES into .env, plus
CHRONICLER_GPU_VRAM_GB if it finds an NVIDIA card - that second key is what
lets Admin → Model offer you the GPU-class models later. Details and manual
alternatives: GPU acceleration.
COMPOSE_PROFILES is missing entirely, no model runtime starts. The stack
comes up but can't answer anything, and docker compose logs ollama-pull will
say so after two minutes.Start it
docker compose up -d
docker compose logs -f
docker compose up -d
docker compose logs -f
First start pulls several gigabytes. When chronicler-backend reports it's
listening on 8410, you're up. chronicler-ollama-pull exiting is normal - it
downloads the model and stops.
Check with:
docker compose ps
Invoke-RestMethod http://localhost:8410/health
docker compose ps
curl http://localhost:8410/health
Connect the app and claim the server
On any machine on the network, open Chronicler → Settings → Connection →
Local, and enter http://<server-ip>:8410.
The login screen offers Register your admin account while the server has no users. Create it, accept the licence terms, and activate your key (Licensing).
What just started
The database schema is created automatically on first boot, and again on every update - you never run migrations by hand. Before a schema change the backend dumps the database first and refuses to continue if that dump fails.
Optional next steps
- Tune memory: Performance and memory
- Every setting you can change: Configuration reference
- Put HTTPS in front: Security and networking
- Automatic backups: Backups and restore