Files
automations/deployments/ergo/deploy.sh
T
57_WolveandClaude Opus 5 c00fc62b82 fix(ergo): guard a network rename, and persist ACME_EMAIL on a re-run
ergo already defends this bug class deliberately -- it adopts .env settings on
a re-run and dies with a precise remedy for ERGO_DOMAIN, HISTORY, PLAINTEXT
and a floating ERGO_TAG. NETWORK_NAME and ACME_EMAIL were gaps in that
defense, not design choices: both are absent from EXPLICIT and from the
re-run writeback loop, though the header promises it "writes back settings you
passed explicitly on this run".

A plain re-run stays safe, since both are adopted from .env as prompt
defaults. The hole is a value the operator actively supplies. NETWORK_NAME
then splits three ways: the generated docs under $STACK_DIR/docs and (when
exported) the Caddy landing page get the NEW name, ircd.yaml keeps the OLD one
because render_ircd_yaml never rewrites an existing file, and .env is never
updated so the next run reverts the docs too. The summary prints the new name.
Clients keep seeing the old one in NETWORK=.

Add yaml_network_name beside yaml_server_name and die with a remedy pointing
at `ergoctl edit` + `ergoctl rehash`, matching how ERGO_DOMAIN is handled --
a rename ircd.yaml cannot absorb should stop the run, not half-apply. Add
ACME_EMAIL to EXPLICIT and to the writeback loop, since unlike the network
name it genuinely can change on a re-run.

ergolib.sh is embedded, so the payload was regenerated with build.sh; that
rebuild also carries the env_set repair from 947c899.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 14:21:36 -05:00

1532 lines
99 KiB
Bash

#!/usr/bin/env bash
#
# deploy.sh -- deploy Ergo (IRC server) behind Caddy (Let's Encrypt) on Alpine,
# Debian or Alma. Single-node; runs as root.
#
# What this does:
# 1. Installs docker + compose (and openssl/jq/curl) if missing; creates the
# `ergo` system user the container runs as.
# 2. Lays down the stack in $STACK_DIR: docker-compose.yml, caddy/etc/Caddyfile,
# update.sh, ergoctl (+ /usr/local/bin/ergoctl wrapper), ergolib.sh.
# 3. Seeds .env on first run, pinning ERGO_TAG to the newest release.
# 4. Generates ircd/ircd.yaml ONCE from the pulled image's own default config
# (server name, network name, listeners, websocket origin, message-history
# backend, admin oper with a random password saved to secrets/admin.pass)
# and validates it with a throwaway `ergo run --smoke` before anything
# starts. Never rewritten.
# 5. Opens 80/443/6697 (+6667 with PLAINTEXT=1) on the host firewall. Both
# containers use host networking, so this firewall really applies.
# 6. Pulls images, validates the Caddyfile, brings the stack up, waits for
# health, copies Caddy's Let's Encrypt cert into ircd/ and rehashes Ergo.
# 7. Schedules update.sh: certsync every 15 min, update check daily.
#
# Idempotent: re-run to apply compose/Caddyfile changes or pull images. It never
# touches ircd/ircd.yaml, secrets/ or caddy/etc/conf.d/; in .env it only refreshes
# ERGO_UID/GID, re-pins a floating ERGO_TAG, and writes back settings you passed
# explicitly on this run (everything else is adopted FROM .env, not overwritten).
#
# Self-contained: docker-compose.yml, docker-compose.postgres.yml, Caddyfile,
# conf.d-readme.caddy, ergo.motd, .env.example, ergolib.sh, update.sh and ergoctl
# are embedded as a base64 tar.gz at the bottom of this file. Rebuild with
# build.sh after editing them.
#
# Usage:
# bash deploy.sh # interactive prompts
# ERGO_DOMAIN=irc.example.com ACME_EMAIL=me@x.com NETWORK_NAME=MyNet \
# SKIP_PROMPTS=1 bash deploy.sh # non-interactive
# HISTORY=postgres bash deploy.sh # FIRST deploy only: persistent history in
# # PostgreSQL (default sqlite; off = RAM only)
# HISTORY_EXPIRE=90d bash deploy.sh # how long messages are kept (default 30d)
# PLAINTEXT=1 bash deploy.sh # FIRST deploy only: also serve plaintext
# # :6667 publicly (+STS). Fixed thereafter.
# ERGO_TAG=v2.19.1 bash deploy.sh # pin a release on the FIRST deploy; after
# # that use: ergoctl update update
# UPDATE_POLICY=security bash deploy.sh # also latest | off
# ERGO_AUTOUPDATE=0 bash deploy.sh # install update.sh but don't schedule the
# # daily update (certsync is still scheduled)
# CERT_WAIT=0 bash deploy.sh # don't wait for the first LE cert
# SKIP_DOCKER_INSTALL=1 bash deploy.sh
set -euo pipefail
: "${STACK_DIR:=/srv/ergo}"
: "${SKIP_DOCKER_INSTALL:=0}"
: "${FORCE:=0}"
: "${SKIP_PROMPTS:=0}"
[[ "$SKIP_PROMPTS" == "1" ]] && FORCE=1
: "${ERGO_DOMAIN:=}"
: "${ACME_EMAIL:=}"
: "${NETWORK_NAME:=}"
: "${ERGO_IMAGE:=ghcr.io/ergochat/ergo}"
: "${ERGO_TAG:=}" # blank = pin the newest release
# Remember which settings the caller actually passed, BEFORE the defaults below
# hide that. On a re-run the rest come from the existing .env instead, so a
# plain `bash deploy.sh` never silently reverts a deployed stack's settings.
# (`|| true` on the trailing `&&`s below: a false test makes the whole list
# return 1, which aborts the script under `set -e` if it ever ends a block.)
EXPLICIT=""
for _k in ERGO_TAG PLAINTEXT HISTORY UPDATE_POLICY FORCE_UPDATE UPDATE_GRACE CADDY_AUTOUPDATE CADDY_TAG ACME_EMAIL; do
[[ -n "${!_k:-}" ]] && EXPLICIT="${EXPLICIT} ${_k}" || true
done
: "${PLAINTEXT:=0}"
: "${HISTORY:=sqlite}" # sqlite | postgres | off (see the README)
# How long messages are kept. Upstream's 1w applies to PERSISTENT storage too --
# it deletes, it is not just a query cutoff -- so persistence with the shipped
# default buys only a week. Retention is a policy (and privacy) decision: raise
# or lower it here, or later with 'ergoctl edit'.
: "${HISTORY_EXPIRE:=30d}"
: "${POSTGRES_TAG:=17-alpine}" # major version is PINNED; update.sh never moves it
: "${POSTGRES_USER:=ergo}"
: "${POSTGRES_DB:=ergo_history}"
: "${POSTGRES_PORT:=5432}"
: "${UPDATE_POLICY:=latest}"
: "${FORCE_UPDATE:=0}"
: "${UPDATE_GRACE:=60}"
: "${CADDY_AUTOUPDATE:=0}"
: "${CADDY_TAG:=2-alpine}"
: "${ERGO_AUTOUPDATE:=1}" # 0 = install update.sh but don't schedule the daily update
: "${CERT_WAIT:=180}" # seconds to wait for Caddy's first Let's Encrypt cert
log() { printf '\033[1;32m[+]\033[0m %s\n' "$*"; }
warn() { printf '\033[1;33m[!]\033[0m %s\n' "$*" >&2; }
die() { printf '\033[1;31m[x]\033[0m %s\n' "$*" >&2; exit 1; }
[[ $EUID -eq 0 ]] || die "Run as root."
# ---------------------------------------------------------------------------
# Extract the embedded archive; ergolib.sh (shared helpers) comes from it.
# ---------------------------------------------------------------------------
SCRIPT_DIR=$(mktemp -d -t ergo-deploy.XXXXXX)
trap 'rm -rf "$SCRIPT_DIR"' EXIT
extract_archive() {
grep -a -A 9999999 '^__ARCHIVE_BELOW__$' "$0" \
| tail -n +2 \
| base64 -d \
| tar -xz -C "$SCRIPT_DIR"
}
if grep -q -a '^__ARCHIVE_BELOW__$' "$0"; then
log "Extracting embedded deployment files..."
extract_archive
else
die "No embedded archive found. Run build.sh to embed deployment files."
fi
EMBEDDED=(docker-compose.yml docker-compose.postgres.yml Caddyfile conf.d-readme.caddy ergo.motd USER-GUIDE.md ADMIN-CHEATSHEET.md .env.example ergolib.sh update.sh ergoctl)
for f in "${EMBEDDED[@]}"; do
[[ -f "$SCRIPT_DIR/$f" ]] || die "Embedded archive missing $f"
done
# shellcheck source=ergolib.sh
. "$SCRIPT_DIR/ergolib.sh"
ergo_set_paths
# ---------------------------------------------------------------------------
# Host packages + Docker (deploy-only helpers; ergolib has the rest)
# ---------------------------------------------------------------------------
pkg_install() { # best-effort install across the three families
case "$(osfam)" in
alpine) apk add -q "$@" || true ;;
debian) DEBIAN_FRONTEND=noninteractive apt-get install -y -qq "$@" || true ;;
rhel) dnf install -y -q "$@" || true ;;
esac
}
install_docker() {
if command -v docker >/dev/null 2>&1; then
log "Docker already installed: $(docker --version)"
else
log "Installing Docker (OS: $(osfam))..."
case "$(osfam)" in
alpine) apk add -q docker docker-cli-compose openrc ;;
debian|rhel) command -v curl >/dev/null 2>&1 || pkg_install curl
curl -fsSL https://get.docker.com | sh ;;
*) die "Unsupported OS for auto Docker install. Set SKIP_DOCKER_INSTALL=1 and install Docker yourself." ;;
esac
fi
if command -v rc-update >/dev/null 2>&1; then
rc-update add docker default >/dev/null 2>&1 || true
rc-service docker status >/dev/null 2>&1 || rc-service docker start
elif command -v systemctl >/dev/null 2>&1; then
systemctl enable --now docker >/dev/null 2>&1 || systemctl start docker || true
fi
# dockerd may return before its socket listens (esp. OpenRC); don't race it.
local i
for i in $(seq 1 30); do
docker info >/dev/null 2>&1 && return
sleep 1
done
warn "Docker daemon not ready after 30s; continuing (compose may fail -- check 'docker info')."
}
# The container runs as this host user (no login, no home). It owns ./ircd so
# the DB, config and the copied TLS key are never readable by other local users.
ensure_ergo_user() {
if ! getent passwd ergo >/dev/null 2>&1; then
log "Creating system user 'ergo' (owns $IRCD_DIR; the container runs as it)..."
case "$(osfam)" in
alpine) getent group ergo >/dev/null 2>&1 || addgroup -S ergo
adduser -S -D -H -G ergo -s /sbin/nologin -g "Ergo IRC server" ergo ;;
*) useradd -r -M -s /usr/sbin/nologin -d /nonexistent -c "Ergo IRC server" ergo 2>/dev/null \
|| useradd -r -M -s /sbin/nologin -c "Ergo IRC server" ergo ;;
esac
fi
ERGO_UID="$(id -u ergo)"; ERGO_GID="$(id -g ergo)"
}
open_ports() {
# Host networking: these ports are bound on the host itself, so the INPUT
# firewall genuinely governs them (unlike Docker-published ports).
local ports=(80/tcp 443/tcp 6697/tcp)
[[ "$PLAINTEXT" == "1" ]] && ports+=(6667/tcp)
# ufw and firewalld are additive: unlike the repo's declarative ports.d
# engine they never drop a port that left the list, so turning PLAINTEXT
# back off would leave 6667 open. Revoke it explicitly.
if [[ "$PLAINTEXT" != "1" ]]; then
if command -v ufw >/dev/null 2>&1 && ufw status 2>/dev/null | grep -q '^Status: active'; then
ufw status 2>/dev/null | grep -q '^6667/tcp' && { log "Closing 6667/tcp in ufw (PLAINTEXT=0)..."; ufw delete allow 6667/tcp >/dev/null 2>&1 || true; }
elif command -v firewall-cmd >/dev/null 2>&1 && firewall-cmd --state >/dev/null 2>&1; then
if firewall-cmd --query-port=6667/tcp --permanent >/dev/null 2>&1; then
log "Closing 6667/tcp in firewalld (PLAINTEXT=0)..."
firewall-cmd -q --remove-port=6667/tcp --permanent || true; firewall-cmd -q --reload || true
fi
fi
fi
if [[ -d /etc/firewall/ports.d && -x /usr/local/sbin/firewall-apply ]]; then
log "Registering ${ports[*]} with the host firewall..."
printf '%s\n' "${ports[@]}" > /etc/firewall/ports.d/ergo.rule
/usr/local/sbin/firewall-apply
elif command -v ufw >/dev/null 2>&1 && ufw status 2>/dev/null | grep -q '^Status: active'; then
log "ufw active -- allowing ${ports[*]}..."
local p; for p in "${ports[@]}"; do ufw allow "$p" >/dev/null; done
elif command -v firewall-cmd >/dev/null 2>&1 && firewall-cmd --state >/dev/null 2>&1; then
log "firewalld active -- allowing ${ports[*]}..."
local p; for p in "${ports[@]}"; do firewall-cmd -q --add-port="$p" --permanent; done
firewall-cmd -q --reload
else
warn "No managed host firewall found; make sure ${ports[*]} are reachable (and nothing else is)."
fi
}
# Anything already listening on our host ports (only checked while our own
# containers are not running -- on re-runs they hold the ports themselves).
check_ports_free() {
local listing p busy=""
listing="$(netstat -ltn 2>/dev/null || ss -ltn 2>/dev/null || true)"
[[ -n "$listing" ]] || return 0
for p in 80 443 6697 8097 6667; do
if printf '%s\n' "$listing" | grep -qE "[:.]${p}[[:space:]]"; then busy="${busy} ${p}"; fi
done
[[ -z "$busy" ]] || die "Ports already in use on this host:${busy}. Both containers use host networking, so this stack needs 80/443 (Caddy), 6697/6667/8097 (Ergo) to itself. Another Caddy stack on this box? Move it or this."
}
# ---------------------------------------------------------------------------
# Prompt for required vars, then normalise + validate them
# ---------------------------------------------------------------------------
prompt() { # <VAR> <message> [default]
local varname="$1" message="$2" def="${3:-}"
local -n ref="$varname"
if [[ -z "${ref:-}" ]]; then
if [[ "$SKIP_PROMPTS" == "1" ]]; then
[[ -n "$def" ]] && { ref="$def"; return 0; }
die "$varname required (set it in the environment; running with SKIP_PROMPTS=1)."
fi
if [[ -n "$def" ]]; then read -r -p "$message [$def]: " ref; ref="${ref:-$def}"
else read -r -p "$message: " ref; fi
[[ -n "$ref" ]] || die "$varname required."
fi
}
prompt ERGO_DOMAIN "Public hostname of the IRC server (e.g. irc.example.com)"
ERGO_DOMAIN="$(printf '%s' "$ERGO_DOMAIN" | tr 'A-Z' 'a-z' | sed -E 's#^https?://##; s#[/.]+$##')"
[[ "$ERGO_DOMAIN" =~ ^([a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,}$ ]] \
|| die "ERGO_DOMAIN '$ERGO_DOMAIN' is not a valid hostname."
# On a re-run these must default to what is DEPLOYED, not to a fresh guess:
# otherwise pressing Enter through the prompts silently renames the network to the
# hostname in the summary while .env keeps the real one. Test for emptiness --
# env_get succeeds even when the key is absent.
_ae_default="$(env_get ACME_EMAIL)"
_nn_default="$(env_get NETWORK_NAME)"
[[ -n "$_nn_default" ]] || _nn_default="$ERGO_DOMAIN"
prompt ACME_EMAIL "Let's Encrypt email" "$_ae_default"
prompt NETWORK_NAME "IRC network name (no spaces)" "$_nn_default"
[[ "$NETWORK_NAME" =~ ^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$ ]] \
|| die "NETWORK_NAME '$NETWORK_NAME' must be 1-64 chars of letters, digits, . _ - (no spaces: it is sent as an IRC parameter)."
[[ "$PLAINTEXT" == "0" || "$PLAINTEXT" == "1" ]] || die "PLAINTEXT must be 0 or 1."
case "$UPDATE_POLICY" in latest|security|off) ;; *) die "UPDATE_POLICY must be latest, security or off." ;; esac
case "$HISTORY" in sqlite|postgres|off) ;; *) die "HISTORY must be sqlite, postgres or off." ;; esac
# Re-run guard: server.name is immutable once Ergo has run with it, and the
# cert/websocket origin/Caddy site all derive from ERGO_DOMAIN.
if [[ -f "$IRCD_DIR/ircd.yaml" ]]; then
existing="$(yaml_server_name "$IRCD_DIR/ircd.yaml" || true)"
if [[ -n "$existing" && "$existing" != "$ERGO_DOMAIN" ]]; then
die "This stack is already deployed as '$existing' (ircd/ircd.yaml server.name) but ERGO_DOMAIN=$ERGO_DOMAIN. Ergo cannot rename a running server; re-run with ERGO_DOMAIN=$existing, or stop the stack, move $STACK_DIR away and deploy fresh."
fi
# Same for the network name. render_ircd_yaml never rewrites an existing
# ircd.yaml, so a re-run cannot rename the network -- but it WOULD relabel
# $STACK_DIR/docs and (when exported) the Caddy landing page, leaving the
# documentation claiming a name clients never see in NETWORK=.
existing_nn="$(yaml_network_name "$IRCD_DIR/ircd.yaml" || true)"
if [[ -n "$existing_nn" && "$existing_nn" != "$NETWORK_NAME" ]]; then
die "This network is named '$existing_nn' (ircd/ircd.yaml network.name) but you passed NETWORK_NAME=$NETWORK_NAME. deploy.sh never rewrites ircd.yaml, so a re-run cannot rename it -- it would only relabel the generated docs and the Caddy landing page while clients still see $existing_nn. To rename: 'ergoctl edit' (network.name), then 'ergoctl rehash'. Otherwise re-run with NETWORK_NAME=$existing_nn."
fi
fi
# ---------------------------------------------------------------------------
# Re-run: adopt the deployed settings from .env
#
# Everything below (the firewall rule, the scheduled jobs, the summary) must
# describe the stack as deployed, not this shell's defaults. A setting the
# caller passed explicitly wins and is written back; PLAINTEXT is the exception,
# because the listener it selects lives in ircd.yaml, which is never rewritten.
# ---------------------------------------------------------------------------
if [[ -f "$ENV_FILE" ]]; then
for _k in PLAINTEXT HISTORY UPDATE_POLICY FORCE_UPDATE UPDATE_GRACE CADDY_AUTOUPDATE CADDY_TAG POSTGRES_TAG POSTGRES_USER POSTGRES_DB POSTGRES_PORT; do
_v="$(env_get "$_k")"
[[ -n "$_v" ]] || continue
if [[ " $EXPLICIT " == *" $_k "* ]]; then
[[ "${!_k}" == "$_v" ]] && continue
if [[ "$_k" == "HISTORY" ]]; then
die "This stack was deployed with HISTORY=${_v} and you passed HISTORY=${!_k}. The backend is recorded in ircd/ircd.yaml, which deploy.sh never rewrites, so re-running cannot switch it (and switching does not migrate existing messages). To change it: 'ergoctl history ${!_k}'."
fi
if [[ "$_k" == "PLAINTEXT" ]]; then
die "This stack was deployed with PLAINTEXT=${_v} and you passed PLAINTEXT=${!_k}. The listener is fixed in ircd/ircd.yaml, which deploy.sh never rewrites, so re-running cannot change it. To switch: edit the plaintext listener with 'ergoctl edit' ($( [[ "$_v" == 1 ]] && echo '":6667": -> "127.0.0.1:6667":' || echo '"127.0.0.1:6667": -> ":6667":' ) and server.sts.enabled), set PLAINTEXT=${!_k} in $ENV_FILE, run 'ergoctl restart', then re-run this script to fix the firewall."
fi
log "${_k}: ${_v} -> ${!_k} (updating $ENV_FILE)."
else
printf -v "$_k" '%s' "$_v"
fi
done
[[ "$PLAINTEXT" == "0" || "$PLAINTEXT" == "1" ]] || die "PLAINTEXT in $ENV_FILE must be 0 or 1 (found '$PLAINTEXT')."
case "$UPDATE_POLICY" in latest|security|off) ;; *) die "UPDATE_POLICY in $ENV_FILE must be latest, security or off (found '$UPDATE_POLICY')." ;; esac
fi
# ---------------------------------------------------------------------------
# Host prerequisites
# ---------------------------------------------------------------------------
[[ "$SKIP_DOCKER_INSTALL" == "1" ]] || install_docker
for tool in openssl jq curl; do
command -v "$tool" >/dev/null 2>&1 || { log "Installing $tool..."; pkg_install "$tool"; }
command -v "$tool" >/dev/null 2>&1 || die "$tool is required (certsync/updater); install it and re-run."
done
command -v docker >/dev/null 2>&1 || die "docker not found."
docker compose version >/dev/null 2>&1 || die "docker compose (v2 plugin) not found."
ensure_ergo_user
# Other host-network containers share Ergo's trust boundary (its loopback).
docker info >/dev/null 2>&1 || die "The Docker daemon is not running or not reachable (check 'docker info'). Start it and re-run."
others="$(docker ps -q 2>/dev/null | xargs -r docker inspect -f '{{.Name}} {{.HostConfig.NetworkMode}}' 2>/dev/null \
| awk '$2=="host" && $1!="/ergo" && $1!="/ergo-caddy" {print $1}' | tr '\n' ' ' || true)"
[[ -z "$others" ]] || warn "Other containers use host networking: ${others}-- they can reach Ergo's loopback listeners (see README: Security model)."
if [[ -z "$(dc ps -q 2>/dev/null || true)" ]]; then check_ports_free; fi
open_ports
# ---------------------------------------------------------------------------
# Stack directory + files
# ---------------------------------------------------------------------------
log "Setting up $STACK_DIR..."
install -d -m 0700 "$STACK_DIR" "$SECRETS_DIR" "$BACKUP_DIR" "$TEMPLATES_DIR" "$STATE_DIR"
install -d -m 0700 "$CADDY_DIR" "$CADDY_DIR/data" "$CADDY_DIR/config"
install -d -m 0755 "$CADDY_DIR/etc" "$CADDY_DIR/etc/conf.d"
install -m 0640 "$SCRIPT_DIR/docker-compose.yml" "$STACK_DIR/docker-compose.yml"
install -m 0640 "$SCRIPT_DIR/docker-compose.postgres.yml" "$STACK_DIR/docker-compose.postgres.yml"
# Caddy has no admin API here and bind-mounted file contents are not part of the
# compose config hash, so `up -d` alone would leave a changed Caddyfile unloaded.
# Only an ACTUAL change counts: on a first deploy the destination does not exist
# yet, and restarting Caddy seconds after it started would interrupt the very
# first ACME issuance for nothing.
CADDY_CHANGED=0
if [[ -f "$CADDY_DIR/etc/Caddyfile" ]] && ! cmp -s "$SCRIPT_DIR/Caddyfile" "$CADDY_DIR/etc/Caddyfile"; then
CADDY_CHANGED=1
fi
install -m 0644 "$SCRIPT_DIR/Caddyfile" "$CADDY_DIR/etc/Caddyfile"
[[ -e "$CADDY_DIR/etc/conf.d/00-readme.caddy" ]] || install -m 0644 "$SCRIPT_DIR/conf.d-readme.caddy" "$CADDY_DIR/etc/conf.d/00-readme.caddy"
# Reference docs, rendered with this network's real values so they can be handed
# straight to users and moderators. Refreshed every run, like the scripts.
install -d -m 0755 "$STACK_DIR/docs"
_hist_days="$( [[ "$HISTORY" == "off" ]] && printf 'as long as the server stays up' || printf '%s' "$HISTORY_EXPIRE" )"
for _doc in USER-GUIDE.md ADMIN-CHEATSHEET.md; do
[[ -f "$SCRIPT_DIR/$_doc" ]] || continue
sed -e "s|__NETWORK_NAME__|${NETWORK_NAME}|g" -e "s|__DOMAIN__|${ERGO_DOMAIN}|g" \
-e "s|__HISTORY_DAYS__|${_hist_days}|g" "$SCRIPT_DIR/$_doc" > "$STACK_DIR/docs/$_doc"
chmod 0644 "$STACK_DIR/docs/$_doc"
done
install -m 0644 "$SCRIPT_DIR/ergolib.sh" "$STACK_DIR/ergolib.sh"
install -m 0750 "$SCRIPT_DIR/update.sh" "$STACK_DIR/update.sh"
install -m 0750 "$SCRIPT_DIR/ergoctl" "$STACK_DIR/ergoctl"
install -d -m 0755 /usr/local/bin
cat > /usr/local/bin/ergoctl <<EOF
#!/bin/sh
# Auto-generated by the Ergo deploy.sh -- runs the stack's admin CLI from anywhere.
exec bash "$STACK_DIR/ergoctl" "\$@"
EOF
chmod 0755 /usr/local/bin/ergoctl
install -d -m 0700 -o "$ERGO_UID" -g "$ERGO_GID" "$IRCD_DIR"
# Pin ERGO_TAG to the newest release so the running version is explicit.
if [[ -z "$ERGO_TAG" && -f "$ENV_FILE" ]]; then ERGO_TAG="$(env_get ERGO_TAG)"; fi
if [[ -z "$ERGO_TAG" || "$ERGO_TAG" == "latest" || "$ERGO_TAG" == "stable" ]]; then
if _t="$(ergo_latest_tag)"; then ERGO_TAG="$_t"; log "Pinned ERGO_TAG=${ERGO_TAG} (newest release)."
else warn "Could not resolve the newest release from GitHub; using tag 'stable' for now (update.sh will pin it)."; ERGO_TAG="stable"; fi
fi
[[ "$ERGO_TAG" == "stable" || "$ERGO_TAG" == v* ]] || ERGO_TAG="v${ERGO_TAG}" # ghcr tags carry the v
if [[ ! -f "$ENV_FILE" ]]; then
log "Seeding $ENV_FILE..."
install -m 0600 "$SCRIPT_DIR/.env.example" "$ENV_FILE"
env_set ERGO_DOMAIN "$ERGO_DOMAIN"
env_set ACME_EMAIL "$ACME_EMAIL"
env_set NETWORK_NAME "$NETWORK_NAME"
env_set ERGO_IMAGE "$ERGO_IMAGE"
env_set ERGO_TAG "$ERGO_TAG"
env_set PLAINTEXT "$PLAINTEXT"
env_set HISTORY "$HISTORY"
env_set UPDATE_POLICY "$UPDATE_POLICY"
env_set FORCE_UPDATE "$FORCE_UPDATE"
env_set UPDATE_GRACE "$UPDATE_GRACE"
env_set CADDY_AUTOUPDATE "$CADDY_AUTOUPDATE"
env_set CADDY_TAG "$CADDY_TAG"
else
log ".env exists; keeping its settings (ERGO_TAG=$(env_get ERGO_TAG))."
[[ "$(ergo_domain)" == "$ERGO_DOMAIN" ]] || die ".env has ERGO_DOMAIN=$(env_get ERGO_DOMAIN) but you passed $ERGO_DOMAIN -- the domain cannot change after the first deploy."
# Persist the settings the caller passed explicitly on this re-run.
for _k in PLAINTEXT UPDATE_POLICY FORCE_UPDATE UPDATE_GRACE CADDY_AUTOUPDATE CADDY_TAG ACME_EMAIL; do
[[ " $EXPLICIT " == *" $_k "* ]] && env_set "$_k" "${!_k}" || true
done
# A floating tag ('stable', from a first deploy that could not reach GitHub)
# would let any pull change the running version with no pre-flight, snapshot
# or rollback. Pin it as soon as we can resolve a real release.
_envtag="$(env_get ERGO_TAG)"
if [[ "$ERGO_TAG" == v[0-9]* && "$ERGO_TAG" != "$_envtag" ]]; then
case "$_envtag" in
# Changing the version of a DEPLOYED stack here would swap the image
# with none of the updater's rails: no pre-flight against the live
# config, no database snapshot, no warning to connected users and no
# rollback if the new build never becomes healthy. Send them there.
v[0-9]*) die "This stack is pinned to ${_envtag} and you passed ERGO_TAG=${ERGO_TAG}. Re-running deploy.sh would swap the image with no pre-flight, no database snapshot and no rollback. Use: TARGET_VERSION=$(normver "$ERGO_TAG") ergoctl update update" ;;
*) env_set ERGO_TAG "$ERGO_TAG"; log "Pinned ERGO_TAG=${ERGO_TAG} (was '${_envtag}', which floats)." ;;
esac
fi
fi
env_set ERGO_UID "$ERGO_UID"
env_set ERGO_GID "$ERGO_GID"
ERGO_TAG="$(ergo_tag)"
IMAGE="$(ergo_image)"
# ---------------------------------------------------------------------------
# Persistent history backend
#
# Ergo's history is ON by default but lives in RAM, so it is lost on every
# restart -- including the ones this stack's updater performs. sqlite persists
# it in a file beside ircd.db with no extra moving parts; postgres adds a
# pinned container for people who want a real database.
# ---------------------------------------------------------------------------
if [[ "$HISTORY" != "off" ]]; then
# Both SQL history backends were added in Ergo 2.18.0.
_v="$(normver "$ERGO_TAG")"
if [[ -n "$_v" ]] && ! ver_ge "$_v" 2.18.0; then
die "HISTORY=$HISTORY needs Ergo 2.18.0 or newer (the SQL history backends were added there), but ERGO_TAG=$ERGO_TAG. Use HISTORY=off or a newer release."
fi
fi
if [[ "$HISTORY" == "postgres" ]]; then
env_set POSTGRES_TAG "$POSTGRES_TAG"
env_set POSTGRES_USER "$POSTGRES_USER"
env_set POSTGRES_DB "$POSTGRES_DB"
env_set POSTGRES_PORT "$POSTGRES_PORT"
# docker compose reads COMPOSE_FILE from .env, so every compose command in
# this stack picks up the overlay without needing extra flags.
env_set COMPOSE_FILE "docker-compose.yml:docker-compose.postgres.yml"
if [[ ! -f "$SECRETS_DIR/postgres.pass" ]]; then
log "Generating the PostgreSQL password (secrets/postgres.pass)..."
( umask 077; ergo_random_password 32 > "$SECRETS_DIR/postgres.pass" )
fi
chmod 0600 "$SECRETS_DIR/postgres.pass"
PG_PASS="$(cat "$SECRETS_DIR/postgres.pass")"
else
env_set COMPOSE_FILE "docker-compose.yml"
fi
missing=()
for var in ERGO_DOMAIN ACME_EMAIL NETWORK_NAME ERGO_TAG ERGO_UID ERGO_GID; do
grep -E "^${var}=.+$" "$ENV_FILE" >/dev/null || missing+=("$var")
done
(( ${#missing[@]} == 0 )) || die "Missing values in $ENV_FILE: ${missing[*]}"
# ---------------------------------------------------------------------------
# Pull images, validate the Caddyfile (static config -- no admin API needed)
# ---------------------------------------------------------------------------
cd "$STACK_DIR"
# Pull per service. ERGO_TAG is an immutable vX.Y.Z, so pulling it is a no-op
# after the first time. caddy's tag FLOATS, and a bare `docker compose pull`
# would adopt a newer Caddy on every re-run and let `up -d` recreate it --
# silently doing what CADDY_AUTOUPDATE=0 promises not to, with none of
# update.sh's health check or rollback. Only pull it when it is missing, or when
# the operator opted in.
log "Pulling $IMAGE..."
docker compose pull ergo
_caddy_tag="$(env_get CADDY_TAG)"; _caddy_tag="${_caddy_tag:-2-alpine}"
if [[ "$CADDY_AUTOUPDATE" == "1" ]] || ! docker image inspect "caddy:${_caddy_tag}" >/dev/null 2>&1; then
log "Pulling caddy:${_caddy_tag}..."
docker compose pull caddy
else
log "Keeping the local caddy:${_caddy_tag} (CADDY_AUTOUPDATE=0; update it with 'ergoctl update caddy')."
fi
if [[ "$HISTORY" == "postgres" ]]; then docker compose pull postgres; fi
log "Validating the Caddyfile..."
# A one-off `compose run` container gets a generated name (compose drops the
# service's container_name for these), so this is safe while ergo-caddy runs.
docker compose run --rm --no-deps -T caddy \
caddy validate --config /etc/caddy/Caddyfile --adapter caddyfile >/dev/null \
|| die "Caddyfile validation failed. Check $CADDY_DIR/etc/Caddyfile and conf.d/*.caddy."
# ---------------------------------------------------------------------------
# First run: generate ircd.yaml from the image's own default config
# ---------------------------------------------------------------------------
render_ircd_yaml() { # <template> <dest>
local plain_listener sts_note netname="" listeners ws
# Cloaked hostnames end in this fake TLD (default "irc"). Use the network's
# first label when it is hostname-shaped; changing it later re-cloaks everyone.
netname="$(printf '%s' "$NETWORK_NAME" | tr 'A-Z' 'a-z' | cut -d. -f1)"
[[ "$netname" =~ ^[a-z0-9]([a-z0-9-]{0,30}[a-z0-9])?$ ]] || netname=""
if [[ "$PLAINTEXT" == "1" ]]; then
plain_listener=' # PLAINTEXT=1: plaintext IRC on ALL interfaces. STS is advertised (server.sts)
# so capable clients pin TLS after first contact. Anything sent here crosses
# the internet unencrypted. Loopback probes (ergoctl, healthcheck) use it too.
":6667":'
else
plain_listener=' # Loopback plaintext: the compose healthcheck and `ergoctl` use it (loopback is
# exempt from ip-limits/bans and treated as secure). To serve plaintext publicly
# instead (not recommended): change this to ":6667", enable server.sts above, set
# PLAINTEXT=1 in ../.env, `ergoctl restart`, then re-run deploy.sh for the firewall.
"127.0.0.1:6667":'
fi
listeners=" listeners:
${plain_listener}
# Public TLS port. fullchain.pem/privkey.pem are Caddy's Let's Encrypt cert,
# kept current by 'update.sh certsync' (self-signed from mkcerts until the
# first sync). Rehash (SIGHUP) reloads them without dropping anyone.
\":6697\":
tls:
cert: fullchain.pem
key: privkey.pem
proxy: false
min-tls-version: 1.2
# IRC over WebSocket for browser clients; TLS is terminated by Caddy on :443
# (wss://${ERGO_DOMAIN}/webirc), which proxies here over loopback with
# X-Forwarded-For -- trusted because 127.0.0.1 is in proxy-allowed-from.
\"127.0.0.1:8097\":
websocket: true
"
ws=" websockets:
# Only pages served from these origins may open a websocket (anchored,
# case-sensitive globs). Add the origin of any web client you host elsewhere.
# Non-browser clients should use :6697 directly.
allowed-origins:
- \"https://${ERGO_DOMAIN}\"
"
MARKER="# Generated by deployments/ergo/deploy.sh on $(date -u +%FT%TZ) from the ${IMAGE} default config.
# Edit freely; apply with 'ergoctl rehash' (or 'ergoctl edit', which validates first).
# server.name, datastore.path, casemapping and enforce-utf8 need 'ergoctl restart'.
# The pristine template is kept in ../templates/ for diffing after upgrades." \
DOMAIN="$ERGO_DOMAIN" NETWORK_NAME="$NETWORK_NAME" HASH="$ADMIN_HASH" PLAINTEXT="$PLAINTEXT" \
NETNAME="$netname" LISTENERS_BLOCK="$listeners" WS_BLOCK="$ws" \
awk '
BEGIN { print ENVIRON["MARKER"]; top=""; sub4=""; oper=""; skip=0 }
{
line=$0
# while replacing a 4-space block, drop its children (8+ spaces) and blanks
if (skip) { if (line ~ /^ / || line ~ /^[ \t]*$/) next; skip=0 }
if (line ~ /^[a-z][a-z-]*:/) { top=line; sub(/:.*/,"",top); sub4=""; oper="" }
if (top=="server") {
if (line ~ /^ [a-z"-]/) { sub4=line; sub(/^ /,"",sub4); sub(/:.*/,"",sub4) }
if (line ~ /^ name:/) { print " name: " ENVIRON["DOMAIN"]; next }
if (line ~ /^ listeners:/) { printf "%s", ENVIRON["LISTENERS_BLOCK"]; skip=1; next }
if (line ~ /^ websockets:/) { printf "%s", ENVIRON["WS_BLOCK"]; skip=1; next }
if (sub4=="sts" && ENVIRON["PLAINTEXT"]=="1" && line ~ /^ enabled: false/) { print " enabled: true"; next }
if (sub4=="ip-cloaking" && ENVIRON["NETNAME"]!="" && line ~ /^ netname:/) { print " netname: \"" ENVIRON["NETNAME"] "\""; next }
}
if (top=="network" && line ~ /^ name:/) { print " name: \"" ENVIRON["NETWORK_NAME"] "\""; next }
if (top=="opers") {
if (line ~ /^ [A-Za-z0-9_.-]+:/) { oper=line; sub(/^ /,"",oper); sub(/:.*/,"",oper) }
if (oper=="admin" && line ~ /^ password:/) { print " password: \"" ENVIRON["HASH"] "\""; next }
}
if (top=="languages" && line ~ /^ path: languages/) { print " path: /ircd-bin/languages"; next }
print line
}' "$1" > "$2"
}
assert_ircd_yaml() { # hard post-conditions -- a silent sed miss would be a public :6667 or a dead admin oper
local f="$1" fail=0
_chk() { if ! grep -qE -- "$1" "$f"; then warn "ircd.yaml check failed: expected $2"; fail=1; fi; }
_nochk() { if grep -qE -- "$1" "$f"; then warn "ircd.yaml check failed: unexpected $2"; fail=1; fi; }
_chk '^ name: '"$ERGO_DOMAIN"'$' "server.name = $ERGO_DOMAIN"
_chk '^ name: "'"$NETWORK_NAME"'"$' "network.name"
_chk '^ ":6697":' "TLS listener :6697"
_chk '^ "127.0.0.1:8097":' "websocket listener"
_chk '^ - "https://'"$ERGO_DOMAIN"'"$' "websocket allowed origin"
_chk '^ password: "\$2[ab]\$' "admin oper bcrypt hash"
_nochk '^ password: "\$2a\$04\$0123456789abcdef' "placeholder oper hash still active (the commented examples are fine)"
_nochk '"\[::1\]:6667"' "[::1] listener (fails on IPv6-less hosts)"
_chk '^ path: /ircd-bin/languages' "languages path"
_nochk '^ path: languages$' "unpatched languages path"
if [[ "$PLAINTEXT" == "1" ]]; then _chk '^ ":6667":' "public plaintext listener"; _nochk '^ "127.0.0.1:6667":' "loopback-only listener with PLAINTEXT=1"
else _chk '^ "127.0.0.1:6667":' "loopback plaintext listener"; _nochk '^ ":6667":' "PUBLIC plaintext listener with PLAINTEXT=0"; fi
# The history backend must be exactly the one asked for -- yaml_set_nested
# targets a specific block, so a wrong result means the template moved.
local got; got="$(history_backend "$f")"
if [[ "$got" != "$HISTORY" ]]; then warn "ircd.yaml check failed: history backend is '$got', expected '$HISTORY'"; fail=1; fi
(( fail == 0 ))
}
CONF="$IRCD_DIR/ircd.yaml"
FIRST_RUN=0
if [[ ! -f "$CONF" ]]; then
FIRST_RUN=1
log "Generating $CONF from the image's default config..."
TEMPLATE="$TEMPLATES_DIR/default.yaml.${ERGO_TAG}"
ergo_extract_template "$IMAGE" "$TEMPLATE" || die "Could not read /ircd-bin/default.yaml from $IMAGE."
chmod 0600 "$TEMPLATE"
# Admin oper: random password (plaintext 0600 on the host, hash in the yaml).
ADMIN_PW="$(ergo_random_password 24)"
ADMIN_HASH="$(ergo_genpasswd "$IMAGE" "$ADMIN_PW")" || die "ergo genpasswd did not return a bcrypt hash."
( umask 077; printf '%s\n' "$ADMIN_PW" > "$ADMIN_PASS_FILE" )
render_ircd_yaml "$TEMPLATE" "$CONF"
# Persistent history. Ergo keeps the in-memory limits (channel-length etc.)
# for the RAM backend; with persistence on, retention is governed by
# history.restrictions.expire-time (1w by default).
if [[ "$HISTORY" != "off" && -n "$HISTORY_EXPIRE" ]]; then
yaml_set_nested "$CONF" history restrictions expire-time "$HISTORY_EXPIRE" \
|| die "Could not set history.restrictions.expire-time."
log "Message retention: ${HISTORY_EXPIRE} (history.restrictions.expire-time)."
fi
case "$HISTORY" in
sqlite)
log "Enabling persistent history (SQLite: ircd/ergo_history.db)..."
yaml_set_nested "$CONF" datastore sqlite enabled true || die "Could not enable datastore.sqlite in the generated config."
yaml_set_nested "$CONF" history persistent enabled true || die "Could not enable history.persistent in the generated config." ;;
postgres)
log "Enabling persistent history (PostgreSQL on 127.0.0.1:${POSTGRES_PORT})..."
yaml_set_nested "$CONF" datastore postgresql enabled true || die "Could not enable datastore.postgresql."
yaml_set_nested "$CONF" datastore postgresql host "\"127.0.0.1\"" || die "Could not set the postgresql host."
yaml_set_nested "$CONF" datastore postgresql port "$POSTGRES_PORT" || die "Could not set the postgresql port."
yaml_set_nested "$CONF" datastore postgresql user "\"${POSTGRES_USER}\"" || die "Could not set the postgresql user."
yaml_set_nested "$CONF" datastore postgresql password "\"${PG_PASS}\"" || die "Could not set the postgresql password."
yaml_set_nested "$CONF" datastore postgresql history-database "\"${POSTGRES_DB}\"" || die "Could not set the postgresql database."
yaml_set_nested "$CONF" history persistent enabled true || die "Could not enable history.persistent." ;;
off)
log "Persistent history disabled (HISTORY=off): messages stay in RAM and are lost on restart." ;;
esac
assert_ircd_yaml "$CONF" || { rm -f "$CONF"; die "Generated ircd.yaml failed its checks (the upstream template layout changed?). Nothing started. Template kept at $TEMPLATE."; }
# MOTD: the bind mount hides the image's ergo.motd, and a missing MOTD is silently
# ignored (clients get ERR_NOMOTD) -- so always ship one.
# Tell users the truth about retention, whichever backend was chosen.
if [[ "$HISTORY" == "off" ]]; then
_motd_hist="Messages are not stored: history is lost whenever the server restarts."
else
_motd_hist="Messages are kept for ${HISTORY_EXPIRE} so you can scroll back, then deleted."
fi
sed -e "s|__NETWORK_NAME__|${NETWORK_NAME}|g" -e "s|__DOMAIN__|${ERGO_DOMAIN}|g" \
-e "s|__HISTORY_NOTE__|${_motd_hist}|g" "$SCRIPT_DIR/ergo.motd" > "$IRCD_DIR/ergo.motd"
chmod 0600 "$CONF"; chmod 0644 "$IRCD_DIR/ergo.motd"
chown -R "$ERGO_UID:$ERGO_GID" "$IRCD_DIR"
log "Validating the generated config (ergo run --smoke in a throwaway container)..."
if ! ergo_validate_config "$IMAGE"; then
tail -n 20 "$VALIDATE_LOG" >&2 || true
rm -f "$CONF"
die "ircd.yaml did not load in $IMAGE. Nothing started; fix the cause above and re-run."
fi
rm -f "$VALIDATE_LOG"
else
log "$CONF exists; leaving it alone."
chown -R "$ERGO_UID:$ERGO_GID" "$IRCD_DIR"
fi
ADMIN_PW="$(head -n1 "$ADMIN_PASS_FILE" 2>/dev/null || echo '<not on file>')"
# Only put the password on screen for a human at a terminal, and only on the run
# that created it. Unattended paths (cloud-init) send stdout to the provider's
# serial console and /var/log/cloud-init-output.log, where a server-admin oper
# credential would sit indefinitely, readable by anyone with console access.
if [[ "$FIRST_RUN" == "1" && -t 1 ]]; then
ADMIN_PW_LINE="/OPER admin ${ADMIN_PW} (also in ${ADMIN_PASS_FILE})"
else
ADMIN_PW_LINE="see ${ADMIN_PASS_FILE}, or run: ergoctl passwd show"
fi
# ---------------------------------------------------------------------------
# Confirm
# ---------------------------------------------------------------------------
if [[ "$FORCE" != "1" ]]; then
cat <<EOF
About to start the Ergo stack from $STACK_DIR (host networking).
Caddy will request a Let's Encrypt cert for ${ERGO_DOMAIN}. DNS for that name must
already point at this host and ports 80/443 must be reachable from the internet.
IRC clients connect on 6697 (TLS)$( [[ "$PLAINTEXT" == "1" ]] && printf ' and 6667 (PLAINTEXT -- credentials in clear)' ).
Continue? [y/N]
EOF
read -r ans
[[ "${ans,,}" == "y" || "${ans,,}" == "yes" ]] || { warn "Aborted."; exit 0; }
fi
# ---------------------------------------------------------------------------
# Up + health
# ---------------------------------------------------------------------------
log "Starting stack..."
# A container compose CREATES or RECREATES has already read the new Caddyfile, so
# only the one it left alone still holds the old config. Compare the container's
# identity across `up -d` to tell those apart -- `svc_state` says "running" in
# both cases.
_caddy_cid_before="$(docker inspect -f '{{.Id}}' ergo-caddy 2>/dev/null || true)"
docker compose up -d --remove-orphans
_caddy_cid_after="$(docker inspect -f '{{.Id}}' ergo-caddy 2>/dev/null || true)"
if (( CADDY_CHANGED )) && [[ -n "$_caddy_cid_before" && "$_caddy_cid_before" == "$_caddy_cid_after" ]] \
&& [[ "$(svc_state caddy)" == running* ]]; then
log "Caddyfile changed; restarting Caddy to load it..."
docker compose restart caddy >/dev/null 2>&1 || warn "Could not restart Caddy; run 'ergoctl caddy-restart'."
fi
log "Waiting for services to become healthy..."
if [[ "$HISTORY" == "postgres" ]]; then
# Ergo refuses to start when its history backend is unreachable, and
# depends_on holds it back until this passes.
if wait_healthy postgres 120; then log "PostgreSQL is ready."
else docker compose logs --tail 20 postgres >&2 || true
die "PostgreSQL did not become healthy; Ergo cannot start without it. See the log above."; fi
fi
wait_healthy caddy 60 || warn "Caddy is not healthy yet (docker compose logs caddy)."
if ! wait_healthy ergo 120; then
docker compose logs --tail 30 ergo >&2 || true
die "Ergo did not become healthy. See the log above."
fi
log "Ergo is up ($(ergo_version_running))."
# ---------------------------------------------------------------------------
# TLS: wait for Caddy's cert, copy it into ircd/, rehash
# ---------------------------------------------------------------------------
log "Waiting up to ${CERT_WAIT}s for Caddy to obtain the Let's Encrypt certificate..."
deadline=$(( $(date +%s) + CERT_WAIT ))
have_cert=0
while (( $(date +%s) < deadline )); do
if ergo_cert_source >/dev/null 2>&1; then have_cert=1; break; fi
sleep 5
done
if [[ "$have_cert" == 1 ]]; then
sleep 2 # let certmagic finish writing the .json sidecar
bash "$STACK_DIR/update.sh" certsync || warn "Cert sync did not complete; the 15-minute job will retry."
else
warn "No certificate from Caddy yet (DNS not pointing here, or 80/443 unreachable?)."
warn "Ergo is serving a SELF-SIGNED cert on 6697 until certsync succeeds (every 15 min). Check: docker compose logs caddy"
fi
# ---------------------------------------------------------------------------
# Schedule certsync (15 min) + the daily update check
# ---------------------------------------------------------------------------
log "Installing scheduled jobs (certsync every 15 min; daily update check, policy=${UPDATE_POLICY})..."
STACK_DIR="$STACK_DIR" UPDATE_POLICY="$UPDATE_POLICY" FORCE_UPDATE="$FORCE_UPDATE" UPDATE_GRACE="$UPDATE_GRACE" \
CADDY_AUTOUPDATE="$CADDY_AUTOUPDATE" SCHEDULE_UPDATES="$ERGO_AUTOUPDATE" \
bash "$STACK_DIR/update.sh" install || warn "Scheduling failed (non-fatal): run '$STACK_DIR/update.sh install' by hand."
echo
log "Stack status:"
docker compose ps
echo
cat <<EOF
================================================================
DEPLOYED -- Ergo IRC server
Network: ${NETWORK_NAME}
Server: ${ERGO_DOMAIN} port 6697 (TLS)$( [[ "$PLAINTEXT" == "1" ]] && printf ', port 6667 (plaintext)' )
WebSocket: wss://${ERGO_DOMAIN}/webirc (landing page: https://${ERGO_DOMAIN})
Stack dir: ${STACK_DIR}
Oper login: ${ADMIN_PW_LINE}
(rotate with: ergoctl passwd rotate)
Config: ${IRCD_DIR}/ircd.yaml MOTD: ${IRCD_DIR}/ergo.motd
ergoctl edit / ergoctl motd (validates, then rehashes)
History: $( case "$HISTORY" in
sqlite) printf 'persistent, SQLite (%s/ergo_history.db)' "$IRCD_DIR" ;;
postgres) printf 'persistent, PostgreSQL (container ergo-postgres, db %s)' "$POSTGRES_DB" ;;
off) printf 'in RAM only -- lost on every restart, including updates' ;;
esac )
$( [[ "$HISTORY" == "off" ]] || printf 'Messages are kept for %s, then deleted (history.restrictions.expire-time).' "$HISTORY_EXPIRE" )
Switch backend: ergoctl history sqlite|postgres|off
Administer (from anywhere on this host):
ergoctl status versions, health, cert, user count
ergoctl users who is on
ergoctl oper add <name> add an operator (prints a generated password)
ergoctl announce <text> NOTICE to everyone
ergoctl kill|ban|defcon ... moderation (see: ergoctl help)
ergoctl cmd <raw IRC line> anything else, as the admin oper
ergoctl logs -f server log (health-probe noise filtered)
ergoctl backup stop-consistent backup of config + database
TLS: Caddy holds the Let's Encrypt cert; 'update.sh certsync' copies it to
Ergo and rehashes (every 15 min, silent when unchanged).
Check with 'ergoctl cert'. While it says SELF-SIGNED, IRC clients will
refuse to connect to 6697 with a certificate error -- that is a pending
issuance, not a broken install. Fix it in this order:
dig +short ${ERGO_DOMAIN} # must return this host's public IP
docker compose logs caddy # shows why ACME failed (80/443 blocked?)
ergoctl cert sync # apply now instead of waiting 15 min
Updates: ergoctl update check current vs latest (+ security advisories)
ergoctl update update update now (health-checked, DB snapshot, rollback)
$( [[ "$ERGO_AUTOUPDATE" == "1" ]] \
&& printf "Daily automatic run, policy '%s' (edit it in %s)." "$UPDATE_POLICY" "$ENV_FILE" \
|| printf "Daily run NOT scheduled (ERGO_AUTOUPDATE=0); enable it with 'ergoctl update install'." )
Restarting Ergo disconnects every user; the daily run warns them first.
Re-running this script is idempotent: it never touches ircd.yaml, secrets/ or
caddy/etc/conf.d/, and it adopts the settings above from .env rather than
resetting them to defaults.
================================================================
EOF
# IMPORTANT: do not put any code below this exit. Everything after the
# __ARCHIVE_BELOW__ marker is the embedded tar.gz payload (base64), appended by
# build.sh.
exit 0
__ARCHIVE_BELOW__
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