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>
1532 lines
99 KiB
Bash
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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
|