Docker-based self-hosted WordPress deployment system with: - Four-container stack (nginx, wordpress/php-fpm, mariadb, certbot) - Automatic SSL via Let's Encrypt with self-signed fallback - First-boot WordPress setup via WP-CLI (GeneratePress + child theme, plugins) - Interactive setup wizard and one-line install script - Backup, update, healthcheck, and SSL renewal scripts Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
141 lines
4.1 KiB
Bash
Executable File
141 lines
4.1 KiB
Bash
Executable File
#!/bin/bash
|
|
set -eo pipefail
|
|
|
|
# WebsiteBox Install Script
|
|
# Bootstrap script: installs Docker, clones repo, runs setup wizard
|
|
# Usage: curl -fsSL <url>/install.sh | bash
|
|
|
|
echo ""
|
|
echo "═══════════════════════════════════════════════════════════"
|
|
echo " WebsiteBox Installer"
|
|
echo "═══════════════════════════════════════════════════════════"
|
|
echo ""
|
|
|
|
# --- Check for root/sudo ---
|
|
|
|
if [ "$(id -u)" -eq 0 ]; then
|
|
SUDO=""
|
|
ACTUAL_USER="${SUDO_USER:-root}"
|
|
else
|
|
if ! command -v sudo &>/dev/null; then
|
|
echo "ERROR: This script requires root or sudo access."
|
|
exit 1
|
|
fi
|
|
SUDO="sudo"
|
|
ACTUAL_USER="$(whoami)"
|
|
fi
|
|
|
|
# --- Detect OS ---
|
|
|
|
if [ -f /etc/os-release ]; then
|
|
# shellcheck disable=SC1091
|
|
. /etc/os-release
|
|
OS_ID="$ID"
|
|
OS_VERSION="$VERSION_ID"
|
|
else
|
|
echo "ERROR: Cannot detect OS. /etc/os-release not found."
|
|
echo "WebsiteBox supports Ubuntu 20.04+ and Debian 11+."
|
|
exit 1
|
|
fi
|
|
|
|
case "$OS_ID" in
|
|
ubuntu)
|
|
if [ "${OS_VERSION%%.*}" -lt 20 ]; then
|
|
echo "ERROR: Ubuntu 20.04 or later is required (detected: ${OS_VERSION})."
|
|
exit 1
|
|
fi
|
|
;;
|
|
debian)
|
|
if [ "${OS_VERSION%%.*}" -lt 11 ]; then
|
|
echo "ERROR: Debian 11 or later is required (detected: ${OS_VERSION})."
|
|
exit 1
|
|
fi
|
|
;;
|
|
*)
|
|
echo "WARNING: Unsupported OS detected (${OS_ID} ${OS_VERSION})."
|
|
echo "WebsiteBox is tested on Ubuntu 20.04+ and Debian 11+."
|
|
read -rp "Continue anyway? (y/N) " cont
|
|
if [ "$cont" != "y" ] && [ "$cont" != "Y" ]; then
|
|
exit 1
|
|
fi
|
|
;;
|
|
esac
|
|
|
|
echo "Detected: ${OS_ID} ${OS_VERSION}"
|
|
|
|
# --- Install Docker if needed ---
|
|
|
|
DOCKER_JUST_INSTALLED=false
|
|
|
|
if command -v docker &>/dev/null; then
|
|
echo "Docker is already installed."
|
|
else
|
|
echo "Installing Docker..."
|
|
|
|
# Install prerequisites
|
|
$SUDO apt-get update -qq
|
|
$SUDO apt-get install -y -qq ca-certificates curl gnupg lsb-release
|
|
|
|
# Add Docker's GPG key
|
|
$SUDO install -m 0755 -d /etc/apt/keyrings
|
|
curl -fsSL "https://download.docker.com/linux/${OS_ID}/gpg" | $SUDO gpg --dearmor -o /etc/apt/keyrings/docker.gpg
|
|
$SUDO chmod a+r /etc/apt/keyrings/docker.gpg
|
|
|
|
# Add Docker repository
|
|
echo \
|
|
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/${OS_ID} \
|
|
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
|
|
$SUDO tee /etc/apt/sources.list.d/docker.list > /dev/null
|
|
|
|
# Install Docker
|
|
$SUDO apt-get update -qq
|
|
$SUDO apt-get install -y -qq docker-ce docker-ce-cli containerd.io docker-compose-plugin
|
|
|
|
# Add user to docker group
|
|
if [ "$ACTUAL_USER" != "root" ]; then
|
|
$SUDO usermod -aG docker "$ACTUAL_USER"
|
|
DOCKER_JUST_INSTALLED=true
|
|
echo "Docker installed. User '${ACTUAL_USER}' added to docker group."
|
|
fi
|
|
|
|
# Start and enable Docker
|
|
$SUDO systemctl start docker
|
|
$SUDO systemctl enable docker
|
|
|
|
echo "Docker installation complete."
|
|
fi
|
|
|
|
# --- Clone Repository ---
|
|
|
|
INSTALL_DIR="${HOME}/websitebox"
|
|
|
|
if [ -d "$INSTALL_DIR" ]; then
|
|
echo "WebsiteBox directory already exists at ${INSTALL_DIR}"
|
|
echo "Pulling latest changes..."
|
|
cd "$INSTALL_DIR"
|
|
git pull || true
|
|
else
|
|
echo "Cloning WebsiteBox..."
|
|
git clone https://github.com/websitebox/websitebox.git "$INSTALL_DIR"
|
|
cd "$INSTALL_DIR"
|
|
fi
|
|
|
|
# Make scripts executable
|
|
chmod +x setup.sh install.sh scripts/*.sh
|
|
|
|
# --- Run Setup Wizard ---
|
|
|
|
echo ""
|
|
if [ "$DOCKER_JUST_INSTALLED" = true ] && [ "$ACTUAL_USER" != "root" ]; then
|
|
# Activate docker group for this session without requiring logout/login
|
|
echo "Activating Docker permissions for current session..."
|
|
sg docker -c "./setup.sh"
|
|
else
|
|
./setup.sh
|
|
fi
|
|
|
|
echo ""
|
|
echo "If 'docker compose' commands fail later, log out and back in"
|
|
echo "to permanently activate Docker permissions, then try again."
|
|
echo ""
|