#!/bin/bash set -euo pipefail ## Discourse Installation Script for Netcup RS 8000 ## Run this ON the Netcup server: ssh netcup "bash -s" < scripts/install.sh ## Or: ssh netcup, then cd /opt/discourse && bash scripts/install.sh DISCOURSE_DIR="/opt/discourse" REPO_URL="https://github.com/discourse/discourse_docker.git" echo "=== Discourse Installation for cadCAD Community Forum ===" echo "" # 1. Check for swap (Discourse needs it for 2GB RAM limit) echo "[1/6] Checking swap space..." SWAP_TOTAL=$(free -m | awk '/^Swap:/ {print $2}') if [ "$SWAP_TOTAL" -lt 2000 ]; then echo " WARNING: Less than 2GB swap detected (${SWAP_TOTAL}MB)." echo " Creating 2GB swap file..." if [ ! -f /swapfile ]; then fallocate -l 2G /swapfile chmod 600 /swapfile mkswap /swapfile swapon /swapfile echo '/swapfile none swap sw 0 0' >> /etc/fstab echo " Swap file created and enabled." else echo " /swapfile already exists. Enabling if not active..." swapon /swapfile 2>/dev/null || true fi else echo " Swap OK: ${SWAP_TOTAL}MB" fi # 2. Clone discourse_docker echo "" echo "[2/6] Setting up Discourse Docker..." if [ -d "$DISCOURSE_DIR/.git" ]; then echo " discourse_docker already cloned at $DISCOURSE_DIR" cd "$DISCOURSE_DIR" git pull else echo " Cloning discourse_docker..." git clone "$REPO_URL" "$DISCOURSE_DIR" cd "$DISCOURSE_DIR" fi # 3. Copy app.yml config echo "" echo "[3/6] Installing app.yml configuration..." if [ -f "containers/app.yml" ]; then echo " Backing up existing app.yml to containers/app.yml.backup" cp containers/app.yml "containers/app.yml.backup.$(date +%Y%m%d%H%M%S)" fi # The app.yml should already be in the repo root from our config if [ -f "app.yml" ]; then cp app.yml containers/app.yml echo " app.yml copied to containers/" else echo " ERROR: app.yml not found in repo root." echo " Please copy it manually: cp /path/to/app.yml containers/app.yml" exit 1 fi # 4. Ensure traefik-public network exists echo "" echo "[4/6] Checking Docker networks..." if docker network inspect traefik-public >/dev/null 2>&1; then echo " traefik-public network exists." else echo " Creating traefik-public network..." docker network create traefik-public fi # 5. Bootstrap Discourse (this takes 5-10 minutes) echo "" echo "[5/6] Bootstrapping Discourse container..." echo " This will take 5-10 minutes. Building image and precompiling assets..." echo "" ./launcher bootstrap app # 6. Start and connect to Traefik network echo "" echo "[6/6] Starting Discourse and connecting to Traefik..." ./launcher start app # Connect to traefik-public network CONTAINER_ID=$(docker ps -q -f name=app) if [ -n "$CONTAINER_ID" ]; then docker network connect traefik-public "$CONTAINER_ID" 2>/dev/null || echo " Already connected to traefik-public" echo " Container connected to traefik-public network." else echo " WARNING: Could not find running discourse container." fi echo "" echo "=== Discourse Installation Complete ===" echo "" echo "Next steps:" echo " 1. Add cadcad-forum.jeffemmett.com to Cloudflare tunnel" echo " 2. Create admin account:" echo " cd /opt/discourse && ./launcher enter app" echo " rake admin:create" echo " 3. Configure SMTP in containers/app.yml when ready" echo " 4. Visit https://cadcad-forum.jeffemmett.com" echo "" echo "Useful commands:" echo " ./launcher logs app # View logs" echo " ./launcher restart app # Restart" echo " ./launcher rebuild app # Rebuild after config changes" echo " ./launcher enter app # Shell into container" echo " ./launcher stop app # Stop"