Skip to content

Installation

This guide covers installing HoloMUSH using Docker or pre-built binaries.

HoloMUSH requires a Key Encryption Key (KEK) to boot. The core server reads the keyfile path from HOLOMUSH_KEK_FILE and the unlock passphrase from one of three sources (first hit wins):

SourceDescription
HOLOMUSH_KEK_PASSPHRASEPassphrase as a plain env var
HOLOMUSH_KEK_PASSPHRASE_FILEPath to a file containing the passphrase
Interactive promptPrompted on stdin when a TTY is attached

On first boot, pass --auto-gen-kek to mint the keyfile automatically. After that the keyfile is never overwritten — if the file exists, --auto-gen-kek is a no-op. Providing a wrong passphrase or a corrupt keyfile surfaces an error at startup rather than silently degrading.

The admin-totp CLI (holomush admin totp …) uses the same HOLOMUSH_KEK_FILE and HOLOMUSH_KEK_PASSPHRASE env vars but does not support --auto-gen-kek. It requires a pre-existing keyfile.

Docker provides the simplest deployment method with automatic dependency management.

RequirementMinimum Version
Docker20.10+
Docker Compose2.0+

Clone the repository and start all services:

Terminal window
git clone https://github.com/holomush/holomush.git
cd holomush
docker compose up -d

This starts three services:

ServiceDescriptionPort
postgresPostgreSQL database5432
coreGame engine and plugin runtime9000
gatewayTelnet and web client servers4201, 8080

Verify the services are running:

Terminal window
docker compose ps

Connect to the server:

Terminal window
telnet localhost 4201

HoloMUSH publishes container images to GitHub Container Registry:

Terminal window
docker pull ghcr.io/holomush/holomush:latest

Available tags:

TagDescription
latestMost recent stable release
v1.x.xSpecific version
mainLatest development build

For production deployments, customize the compose file:

services:
postgres:
image: postgres:18-alpine
environment:
POSTGRES_DB: holomush
POSTGRES_USER: holomush
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U holomush"]
interval: 2s
timeout: 5s
retries: 5
core:
image: ghcr.io/holomush/holomush:latest
command: ["core", "--grpc-addr=0.0.0.0:9000", "--metrics-addr=0.0.0.0:9100", "--auto-gen-kek"]
environment:
DATABASE_URL: postgres://holomush:${POSTGRES_PASSWORD}@postgres:5432/holomush?sslmode=disable
HOME: /home/holomush
# KEK is required. --auto-gen-kek mints the keyfile on first boot;
# subsequent starts reuse it. Store the passphrase in a secrets manager
# and reference it via HOLOMUSH_KEK_PASSPHRASE_FILE for production.
HOLOMUSH_KEK_FILE: /home/holomush/.config/holomush/certs/master.key.enc
HOLOMUSH_KEK_PASSPHRASE: ${HOLOMUSH_KEK_PASSPHRASE}
volumes:
- holomush_config:/home/holomush/.config/holomush
depends_on:
postgres:
condition: service_healthy
gateway:
image: ghcr.io/holomush/holomush:latest
command: ["gateway", "--core-addr=core:9000", "--metrics-addr=0.0.0.0:9101"]
environment:
HOME: /home/holomush
volumes:
- holomush_config:/home/holomush/.config/holomush
ports:
- "4201:4201"
- "8080:8080"
depends_on:
- core
volumes:
postgres_data:
holomush_config:

Download pre-built binaries for your platform.

Download the latest release from GitHub:

Terminal window
# Linux (amd64)
curl -LO https://github.com/holomush/holomush/releases/latest/download/holomush-linux-amd64.tar.gz
tar xzf holomush-linux-amd64.tar.gz
# macOS (arm64)
curl -LO https://github.com/holomush/holomush/releases/latest/download/holomush-darwin-arm64.tar.gz
tar xzf holomush-darwin-arm64.tar.gz

Move the binary to your PATH:

Terminal window
sudo mv holomush /usr/local/bin/

HoloMUSH requires PostgreSQL 18 or later.

Quick start with Docker:

Terminal window
docker run -d --name holomush-db \
-e POSTGRES_DB=holomush \
-e POSTGRES_USER=holomush \
-e POSTGRES_PASSWORD=secret \
-p 5432:5432 \
postgres:18-alpine

Or install natively:

Terminal window
# Ubuntu/Debian
sudo apt install postgresql postgresql-contrib
# macOS
brew install postgresql@18

Create the database:

Terminal window
createdb holomush
createuser holomush -P

Before first run, apply database migrations:

Terminal window
DATABASE_URL="postgres://holomush:secret@localhost:5432/holomush?sslmode=disable" \
holomush migrate up

HoloMUSH uses a two-process architecture. Start both processes:

Terminal 1 - Core (first start):

Terminal window
DATABASE_URL="postgres://holomush:secret@localhost:5432/holomush?sslmode=disable" \
HOLOMUSH_KEK_FILE="/etc/holomush/master.key.enc" \
HOLOMUSH_KEK_PASSPHRASE="your-passphrase" \
holomush core --auto-gen-kek

On subsequent starts, --auto-gen-kek is a no-op if the keyfile already exists:

Terminal window
DATABASE_URL="postgres://holomush:secret@localhost:5432/holomush?sslmode=disable" \
HOLOMUSH_KEK_FILE="/etc/holomush/master.key.enc" \
HOLOMUSH_KEK_PASSPHRASE="your-passphrase" \
holomush core

Terminal 2 - Gateway:

Terminal window
holomush gateway

Check server health:

Terminal window
holomush status

Connect via telnet:

Terminal window
telnet localhost 4201

For development or customization, build from source.

RequirementVersion
Go1.24+
TaskLatest
Terminal window
git clone https://github.com/holomush/holomush.git
cd holomush
task build

The binary is created at ./holomush.

For development, install additional tooling:

Terminal window
task setup

For production Linux deployments, create systemd unit files.

Core service (/etc/systemd/system/holomush-core.service):

[Unit]
Description=HoloMUSH Core
After=network.target postgresql.service
Requires=postgresql.service
[Service]
Type=simple
User=holomush
Group=holomush
Environment=DATABASE_URL=postgres://holomush:secret@localhost:5432/holomush?sslmode=disable
Environment=HOLOMUSH_KEK_FILE=/etc/holomush/master.key.enc
# Use EnvironmentFile or HOLOMUSH_KEK_PASSPHRASE_FILE for the passphrase
# to avoid it appearing in systemd logs or process listings.
EnvironmentFile=/etc/holomush/kek-passphrase.env
ExecStart=/usr/local/bin/holomush core
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target

Gateway service (/etc/systemd/system/holomush-gateway.service):

[Unit]
Description=HoloMUSH Gateway
After=network.target holomush-core.service
Requires=holomush-core.service
[Service]
Type=simple
User=holomush
Group=holomush
ExecStart=/usr/local/bin/holomush gateway
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target

Enable and start:

Terminal window
sudo systemctl daemon-reload
sudo systemctl enable holomush-core holomush-gateway
sudo systemctl start holomush-core holomush-gateway