diff --git a/infra/matrix/scripts/deploy-conduit.sh b/infra/matrix/scripts/deploy-conduit.sh new file mode 100644 index 00000000..36bb71a2 --- /dev/null +++ b/infra/matrix/scripts/deploy-conduit.sh @@ -0,0 +1,203 @@ +#!/bin/bash +set -euo pipefail + +# Conduit Matrix Homeserver Deployment Script +# Usage: ./deploy-conduit.sh [install|start|stop|logs|status|backup] +# +# See upstream: timmy-config#166, timmy-config#183 +# Dependency: prerequisites.md completed + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +MATRIX_DIR="$(dirname "$SCRIPT_DIR")" +CONDUIT_DIR="$MATRIX_DIR/conduit" +BACKUP_DIR="$MATRIX_DIR/backups" + +# Colors +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +log_info() { echo -e "${GREEN}[INFO]${NC} $1"; } +log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } +log_error() { echo -e "${RED}[ERROR]${NC} $1"; } + +preflight_check() { + log_info "Running preflight checks..." + + # Check Docker + if ! command -v docker &> /dev/null; then + log_error "Docker not found. Install per prerequisites.md" + exit 1 + fi + + # Check Docker Compose + if ! docker compose version &> /dev/null && ! docker-compose version &> /dev/null; then + log_error "Docker Compose not found. Install per prerequisites.md" + exit 1 + fi + + # Check .env exists + if [[ ! -f "$CONDUIT_DIR/.env" ]]; then + log_error ".env file missing at $CONDUIT_DIR/.env" + log_warn "Copy from .env.example and configure:" + log_warn " cp $CONDUIT_DIR/.env.example $CONDUIT_DIR/.env" + log_warn " nano $CONDUIT_DIR/.env" + exit 1 + fi + + # Check config values + if grep -q "CHANGE_THIS" "$CONDUIT_DIR/.env"; then + log_error ".env contains placeholder values" + log_warn "Edit $CONDUIT_DIR/.env and set real values" + exit 1 + fi + + # Check ports + for port in 80 443 8448; do + if ss -tlnp | grep -q ":$port "; then + log_warn "Port $port is already in use" + fi + done + + log_info "Preflight checks passed" +} + +cmd_install() { + log_info "Installing Conduit Matrix homeserver..." + preflight_check + + # Create data directory + mkdir -p "$CONDUIT_DIR/data" + + # Set permissions + # Conduit runs as uid 1000 inside container + sudo chown -R 1000:1000 "$CONDUIT_DIR/data" || true + + # Pull images + cd "$CONDUIT_DIR" + docker compose pull + + log_info "Installation complete. Run './deploy-conduit.sh start' to begin" + log_warn "IMPORTANT: Create admin account immediately after first start" + log_warn " docker exec -it matrix-conduit register_new_matrix_user -c /var/lib/matrix-conduit" +} + +cmd_start() { + log_info "Starting Conduit Matrix homeserver..." + cd "$CONDUIT_DIR" + docker compose up -d + + log_info "Waiting for healthcheck..." + sleep 5 + + # Wait for healthy + for i in {1..30}; do + if docker compose ps conduit | grep -q "healthy"; then + log_info "Conduit is healthy and running!" + log_info "Server URL: https://$(grep DOMAIN .env | cut -d'=' -f2 | tr -d '"')" + return 0 + fi + echo -n "." + sleep 2 + done + + log_error "Conduit failed to become healthy" + docker compose logs --tail=50 conduit + exit 1 +} + +cmd_stop() { + log_info "Stopping Conduit Matrix homeserver..." + cd "$CONDUIT_DIR" + docker compose down + log_info "Conduit stopped" +} + +cmd_logs() { + cd "$CONDUIT_DIR" + docker compose logs -f "$@" +} + +cmd_status() { + log_info "Matrix/Conduit Status:" + cd "$CONDUIT_DIR" + docker compose ps + + # Federation check + DOMAIN=$(grep DOMAIN .env | cut -d'=' -f2 | tr -d '"') + log_info "Federation check:" + curl -s "https://$DOMAIN/.well-known/matrix/server" 2>/dev/null | head -5 || echo "Server info not available (expected if not yet running)" +} + +cmd_backup() { + local backup_name="conduit-$(date +%Y%m%d-%H%M%S).tar.gz" + mkdir -p "$BACKUP_DIR" + + log_info "Creating backup: $backup_name" + + # Stop conduit briefly for consistent backup + cd "$CONDUIT_DIR" + docker compose stop conduit + + tar czf "$BACKUP_DIR/$backup_name" -C "$CONDUIT_DIR" data + + docker compose start conduit + + log_info "Backup complete: $BACKUP_DIR/$backup_name" +} + +cmd_admin() { + log_info "Opening admin shell in Conduit container..." + log_warn "Use: register_new_matrix_user -c /var/lib/matrix-conduit for account creation" + docker exec -it matrix-conduit bash +} + +# Main command dispatcher +case "${1:-help}" in + install) + cmd_install + ;; + start) + cmd_start + ;; + stop) + cmd_stop + ;; + restart) + cmd_stop + sleep 2 + cmd_start + ;; + logs) + shift + cmd_logs "$@" + ;; + status) + cmd_status + ;; + backup) + cmd_backup + ;; + admin) + cmd_admin + ;; + *) + echo "Conduit Matrix Homeserver Deployment" + echo "Usage: $0 {install|start|stop|restart|logs|status|backup|admin}" + echo "" + echo "Commands:" + echo " install - Initial setup and image download" + echo " start - Start the homeserver" + echo " stop - Stop the homeserver" + echo " restart - Restart services" + echo " logs - View container logs" + echo " status - Check service status" + echo " backup - Create data backup" + echo " admin - Open admin shell" + echo "" + echo "Prerequisites: Docker, Docker Compose, configured .env file" + echo "See: infra/matrix/prerequisites.md" + exit 1 + ;; +esac