Files
automations/deployments/ergo/deploy.sh
T
57_WolveandClaude Opus 5 6dba4a5f09 docs(ergo): user guide and admin/moderator cheat sheet
Two quick-reference documents, written to be scanned rather than read:

- USER-GUIDE.md for people new to IRC -- connecting, claiming a nickname,
  the dozen commands that matter, scrollback, and a plain-language privacy
  section (cloaked IP, channels logged for the configured retention, how to
  turn off DM storage).
- ADMIN-CHEATSHEET.md split by where you work: from IRC as an operator
  (UBAN, KILL, DEFCON, ChanServ, NickServ) and on the host via ergoctl, plus
  mode tables and a "when things go wrong" section.

Both use the same placeholder convention as ergo.motd and are rendered by
deploy.sh into $STACK_DIR/docs/ with the network's real name, domain and
retention, so they can be handed straight to users and moderators. Refreshed
on every run, like the other installed files.

Command and mode references were checked against the v2.19.1 sources rather
than written from memory: irc/modes/modes.go for every mode letter, and
irc/chanserv.go and irc/nickserv.go for the service subcommands and which
require an oper capability.

build.sh's embed guard caught the docs being added to FILES without being
added to deploy.sh's EMBEDDED manifest -- the exact failure it was added to
prevent.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-02 21:48:01 -05:00

1521 lines
98 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; 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
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; 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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
t8+3z7/28/8DaTPILwAwAgA=