#!/usr/bin/env bash # Sirius Press installer. # # curl -fsSL https://silentmode.st/sirius-press/install.sh | bash # # Brings up a working instance on a fresh Ubuntu 22.04 or 24.04 VPS: Docker if # it is missing, the repository, generated passwords, and the stack running # behind nginx. # # Two things this script will not do, both on purpose: # # It does not pipe anything else into a shell. Docker is installed from the # distribution's own packages, not from get.docker.com — you are already # trusting one curl-to-bash by running this, and chaining a second is how a # supply chain gets long. # # It does not ask for, generate or store a wallet phrase. The site's # publishing key is entered later in wp-admin, by a person, over whatever # TLS they have arranged — not typed into a terminal session that scrolls # into a log. set -euo pipefail REPO="${SIRIUS_PRESS_REPO:-https://code.silentmode.st/silentmode/sirius-press.git}" DIR="${SIRIUS_PRESS_DIR:-/opt/sirius-press}" PORT="${SIRIUS_PRESS_PORT:-80}" BRANCH="${SIRIUS_PRESS_BRANCH:-master}" bold() { printf '\033[1m%s\033[0m\n' "$*"; } say() { printf '\033[1m→\033[0m %s\n' "$*"; } warn() { printf '\033[33mwarning:\033[0m %s\n' "$*" >&2; } die() { printf '\033[31merror:\033[0m %s\n' "$*" >&2; exit 1; } [ "$(id -u)" -eq 0 ] || die "run this as root, or with sudo." # --------------------------------------------------------------- prerequisites say "checking prerequisites" if ! command -v docker >/dev/null 2>&1; then say "installing Docker from the distribution repositories" export DEBIAN_FRONTEND=noninteractive apt-get update -qq apt-get install -y -qq docker.io docker-compose-v2 git curl \ || die "could not install Docker. Install it yourself and run this again." systemctl enable --now docker else command -v git >/dev/null 2>&1 || apt-get install -y -qq git fi if docker compose version >/dev/null 2>&1; then COMPOSE="docker compose" elif command -v docker-compose >/dev/null 2>&1; then COMPOSE="docker-compose" else die "Docker is installed but Compose is not. Install docker-compose-v2." fi # ------------------------------------------------------------------ the code if [ -d "$DIR/.git" ]; then say "updating $DIR" git -C "$DIR" fetch --quiet origin "$BRANCH" git -C "$DIR" checkout --quiet "$BRANCH" git -C "$DIR" pull --quiet --ff-only origin "$BRANCH" \ || warn "could not fast-forward; leaving the checkout as it is." else say "cloning into $DIR" mkdir -p "$(dirname "$DIR")" git clone --quiet --branch "$BRANCH" --depth 1 "$REPO" "$DIR" \ || die "could not clone $REPO" fi cd "$DIR/docker" # ---------------------------------------------------------------- the config random() { head -c 32 /dev/urandom | od -An -tx1 | tr -d ' \n'; } if [ -f .env ]; then say "keeping the existing .env" else say "writing .env with generated passwords" # No WordPress version or checksum here: core is vendored in the # repository and baked into the image, so there is nothing to pin at # deploy time. { echo "# Written by install.sh on $(date -u +%Y-%m-%dT%H:%M:%SZ)." echo "DB_NAME=wordpress" echo "DB_USER=wordpress" echo "DB_PASSWORD=$(random)" echo "DB_ROOT_PASSWORD=$(random)" echo "SITE_URL=" echo "HTTP_PORT=$PORT" echo "WP_DEBUG=false" echo "SIRIUS_PRESS_KEY=$(random)" } > .env chmod 600 .env fi # ------------------------------------------------------------------- run it say "building the image (this is the slow part — a few minutes on a small VPS)" $COMPOSE build --quiet 2>&1 | tail -5 || die "the image did not build." say "starting" $COMPOSE up -d || die "the stack did not start. Try: cd $DIR/docker && $COMPOSE logs" # Give the app a moment, then check that something answers. A silent failure # here is the difference between "installed" and "installed and working". say "waiting for the site to answer" url="http://127.0.0.1:${PORT}/wp-admin/install.php" ok=0 for _ in $(seq 1 60); do code="$(curl -fsS -o /dev/null -w '%{http_code}' --max-time 5 "$url" 2>/dev/null || true)" case "$code" in 200|30[0-9]) ok=1; break ;; esac sleep 2 done ip="$(curl -fsS --max-time 5 https://api.ipify.org 2>/dev/null || hostname -I 2>/dev/null | awk '{print $1}')" suffix="" [ "$PORT" = "80" ] || suffix=":$PORT" echo if [ "$ok" -eq 1 ]; then bold "Sirius Press is running." else bold "Sirius Press started, but nothing answered on port $PORT yet." warn "Check with: cd $DIR/docker && $COMPOSE logs -f app" fi cat <