Skip to content

Deployment

This guide will walk you through the steps to deploy your own Anchor instance, the Novarum homeserver.

  • A Linux server with Docker and Docker Compose installed. Virtually any hardware will work.
  • Solid network connection and public IP: A Livekit server will be set up to handle voice calls.
  • A domain name for your server. We’ll be using piedpiper.com as an example.

A few files must be created. Hopefully it’s not much :’)

This is the Docker Compose file. I assume it doesn’t need much explanation!

services:
anchor:
image: ghcr.io/novarumsocial/anchor:latest
container_name: anchor
restart: unless-stopped
ports:
- '127.0.0.1:5049:5049'
volumes:
- ./config.toml:/app/config.toml:ro
- ./keys:/app/keys
depends_on:
postgres:
condition: service_healthy
livekit:
condition: service_started
postgres:
image: postgres:18-alpine
container_name: postgres
restart: unless-stopped
environment:
POSTGRES_DB: novarum
POSTGRES_USER: novarum
POSTGRES_PASSWORD: Y0U_SH0ULD_CHANG3_TH1S
volumes:
- ./pg:/var/lib/postgresql
healthcheck:
test: ['CMD-SHELL', 'pg_isready -U novarum -d novarum']
interval: 5s
timeout: 3s
retries: 20
livekit:
image: livekit/livekit-server:latest
container_name: livekit
command: --config /etc/livekit.yaml
restart: unless-stopped
volumes:
- ./livekit.yaml:/etc/livekit.yaml:ro
ports:
- '127.0.0.1:7880:7880/tcp'
- '7881:7881/tcp'
- '50100-50200:50100-50200/udp'
garage:
image: dxflrs/garage:v2.3.0
container_name: novarum-garage
restart: unless-stopped
ports:
- "3900:3900"
volumes:
- ./garage.toml:/etc/garage.toml:ro
- ./garage-meta:/var/lib/garage/meta
- ./garage-data:/var/lib/garage/data
environment:
GARAGE_RPC_SECRET: 'READ_BELOW_FOR_GENERATION'
GARAGE_DEFAULT_ACCESS_KEY: 'READ_BELOW_FOR_GENERATION'
GARAGE_DEFAULT_SECRET_KEY: 'READ_BELOW_FOR_GENERATION'
GARAGE_DEFAULT_BUCKET: 'novarum'
command:
- /garage
- server
- --single-node
- --default-bucket

A few secrets must be generated:

Anchor requires a randomly generated OTP pepper to store OTPs securely in the database. You can generate it with openssl rand -hex 16

We recommend running everything though a reverse proxy, such as Caddy, but the demo server runs on Cloudflare Tunnels, so we’ll be demonstrating that.

Domain Points to
piedpiper.com http://localhost:5049
lk.piedpiper.com http://localhost:7880
cdn.piedpiper.com http://localhost:3900

You’ll also need to open 50100-50200/udp in your firewall for WebRTC connections to work properly.


Great job! Gilfoyle would be proud.