Files
automations/deployments/ergo/deploy.sh
T
57_WolveandClaude Opus 5 73eeb981b8 feat(ergo): a real MOTD with house rules, and honest retention wording
Replaces the placeholder MOTD with a usable one: a coloured header, five house
rules, the NickServ/ChanServ/SASL commands people actually need, and a short
"worth knowing" section.

The retention line is generated rather than hard-coded, so it matches the
deployment instead of drifting from it: HISTORY=off says messages are not
stored, otherwise it names the real HISTORY_EXPIRE. Users are told plainly that
channels are logged and for how long, which is the honest counterpart to
enabling persistent history by default.

Rendered and checked: valid UTF-8 (an invalid byte makes the whole config fail
to load), ASCII-only for old clients, no stray $-escapes, only documented colour
names, and 72 columns at the widest.

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

1448 lines
93 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 .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"
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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
f75/vn++f75/vn++f/69n/8fg9vGtQAIAgA=