Self-hosting
Installation
The two ways to install Omicron, what the installer does, and how to verify the stack came up correctly.
Option A — the installer
curl -fsSL https://raw.githubusercontent.com/the-jk-labs/omicron/main/install.sh | sh
The script:
- Detects your container engine (
docker compose,docker-compose,podman compose, orpodman-compose). - Downloads the source into a directory in the current working directory.
- Runs the equivalent of
compose up -d --build. - Prints the URLs to open and the command to upgrade later.
No git required. Re-running the installer later performs an upgrade.
Option B — clone and run
git clone https://github.com/the-jk-labs/omicron.git omicron
cd omicron
docker compose up -d --build
This is the same thing, with the source in a directory you control — which is
what you want if you plan to track upstream with git pull.
The first build compiles the images and takes a few minutes. Subsequent builds are cached and fast.
What comes up
docker compose ps
| Service | Purpose | Published on |
|---|---|---|
caddy |
Public entrypoint, TLS termination, Let’s Encrypt | 80, 443 |
frontend |
SvelteKit web app | 127.0.0.1:5173 |
backend |
JSON API + ActivityPub (Deno) | 127.0.0.1:8000 |
postgres |
Database | internal only |
redis |
Queue + rate-limit state | internal only |
The frontend and backend ports are bound to loopback only. They exist for troubleshooting on the host; all public traffic goes through Caddy.
No configuration step
There is no .env to create. On first boot the stack generates:
- the Postgres password, into the
secretsvolume; - the session secret, into the same volume;
- the database schema, by running migrations automatically.
You only create a .env if you want to override a default — see
Configuration.
Verify
curl localhost:8000/healthz # {"status":"ok"}
curl localhost:8000/version # {"name":"omicron","version":"…","federation":false}
Then open the app:
- Local:
http://localhost - Public: point DNS at the host first —
Domain and HTTPS — then open
https://your-domain.
Every route redirects to the setup wizard until it is finished. See Setup wizard.
Watching logs
docker compose logs -f # everything
docker compose logs -f backend # or: frontend, caddy, postgres, redis
The backend logs its version on boot, whether federation is enabled, and — in
console email mode — every outgoing message with its link.
Stopping and removing
docker compose down # stop, keep all data
docker compose down -v # stop and DELETE all volumes
Found a mistake?Edit this page on GitHub.