Sets up the backend (Keel) under uvicorn, the frontend (Shore), nginx as an SSL reverse proxy, and systemd services in one command.
- Linux (x86_64 or arm64)
- Root access (
sudo) wgetorcurl(to fetch the installer binary)
python3, git, and nginx are installed automatically if not already present.
wget https://github.com/Holt-Chat/installer/releases/latest/download/install.sh -O install.sh
chmod +x install.sh
sudo ./install.shWith curl:
curl -fsSL https://github.com/Holt-Chat/installer/releases/latest/download/install.sh -o install.sh
chmod +x install.sh
sudo ./install.shIf GitHub is not accessible, you can point the installer to an alternative mirror:
wget https://your-mirror.com/install.sh -O install.sh
chmod +x install.sh
sudo MIRROR_BASE_URL="https://your-mirror.com" ./install.shThe installer binary will be fetched from the specified mirror.
When the installer runs, you choose from:
[I] Install
[U] Update
[M] Modify
[X] Uninstall
For a fresh install, you first choose:
Recommended asks only for your domain or IP address, URI prefix, optional instance password, and SSL method, then sets everything up with sensible defaults.
Custom lets you configure the HTTPS port, install directory, instance password, thread count, voice calls, and more.
At the end of installation you are asked whether to enable auto-update (see below).
Pulls the latest Keel and Shore from git, reinstalls Python dependencies, and restarts the backend. Your config.toml, certificates, and data are untouched.
Post-install changes without reinstalling:
- Renew SSL certificate: re-run the SSL setup flow (same options as during install); updates
nginx.confand restarts nginx automatically - Enable / Disable auto-update: toggle the automatic update cron job
Stops and disables all services, removes systemd unit files, and deletes the install directory.
| Option | When to use |
|---|---|
| Self-signed | IP addresses, private/local instances, or anywhere behind a firewall |
| Let's Encrypt - HTTP | Public domain with port 80 open for the internet. Auto-renews. |
| Let's Encrypt - DNS | Public domain behind a firewall. Requires adding a DNS TXT record. Must be renewed manually every 90 days. |
| Use existing certificates | You already have a certificate and private key (PEM format); provide the file paths. |
If you enter an IP address instead of a domain, self-signed is used automatically since Let's Encrypt requires a domain name.
When installing, the installer asks if you want automatic updates. If enabled, you choose the schedule:
| Option | Schedule |
|---|---|
| Every 5 minutes | */5 * * * * |
| Every hour | 0 * * * * |
| Daily at 3 AM | 0 3 * * * |
| Daily at 4 AM | 0 4 * * * |
| Custom | enter any cron expression |
The installer writes auto-update.sh in the install directory and registers a cron job. Each run does a git pull on Keel and Shore, reinstalls Python deps if needed, and restarts the backend only when there is a new version. Update output is logged to /var/log/holt-keel-update.log.
You can enable or disable auto-update at any time from the Modify menu.
| Component | Description |
|---|---|
keel/ |
Keel backend source (cloned from git) |
keel/venv/ |
Python virtual environment with Keel dependencies |
keel/config.toml |
Keel configuration |
shore/ |
Shore frontend static files (cloned from git) |
certs/ |
Self-signed SSL certificate (10 year validity) |
nginx.conf |
nginx reverse proxy config |
auto-update.sh |
Auto-update script (if enabled) |
.install_info |
Saved settings used by the Modify menu |
holt-keel.service |
systemd service for Keel (uvicorn) |
holt-keel-nginx.service |
systemd service for nginx |
Everything is installed to /opt/holt by default (configurable in Custom mode).
The instance will be accessible at https://<your-domain>:<port>/<uri-prefix>/.
Your browser will show a certificate warning on the first visit if using a self-signed certificate. Click Advanced -> Proceed to continue.
# Check status
systemctl status holt-keel
systemctl status holt-keel-nginx
# Restart
systemctl restart holt-keel
systemctl restart holt-keel-nginx
# Stop
systemctl stop holt-keel
systemctl stop holt-keel-nginx
# View logs
journalctl -u holt-keel -fMIT, see LICENSE.
