- Add validate-scaffold.py: automated acceptance proof for #183 - Add HERMES_MATRIX_CLIENT_SPEC.md: end-to-end agent integration spec for #166 Refs #183, #166
204 lines
5.4 KiB
Bash
Executable File
204 lines
5.4 KiB
Bash
Executable File
#!/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
|