Files
cfw-autumn/scripts/setup/agent-services.sh

102 lines
4.0 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
log() { echo "[agent-services] $*"; }
OS="$(uname -s)"
# =============================================================
# 1. Start postgres + redis + clickhouse (OS-specific)
# =============================================================
log "Starting system services"
if [ "$OS" = "Darwin" ]; then
brew services start postgresql@18 >/dev/null 2>&1 || true
brew services start redis-stack >/dev/null 2>&1 || true
brew services start clickhouse >/dev/null 2>&1 || true
else
sudo service postgresql start >/dev/null 2>&1 || true
sudo service clickhouse-server start >/dev/null 2>&1 || true
# redis-stack-server ships a systemd unit but no SysV init script.
# Try `service` first (works when systemd is the init), then fall back
# to invoking the binary directly (works in containers without systemd).
if ! redis-cli -p 6379 PING >/dev/null 2>&1; then
if ! sudo service redis-stack-server start >/dev/null 2>&1; then
REDIS_LOG_DIR="${HOME}/.autumn-agent/logs"
mkdir -p "$REDIS_LOG_DIR"
log "Starting redis-stack-server manually"
nohup /opt/redis-stack/bin/redis-stack-server \
>"$REDIS_LOG_DIR/redis-stack.log" 2>&1 &
disown || true
for i in $(seq 1 30); do
redis-cli -p 6379 PING >/dev/null 2>&1 && break
sleep 0.2
done
fi
fi
fi
# =============================================================
# 2. ElasticMQ (cross-platform, per-user dir)
# =============================================================
ELASTICMQ_DIR="${HOME}/.autumn-agent/elasticmq"
ELASTICMQ_JAR="${ELASTICMQ_DIR}/elasticmq.jar"
ELASTICMQ_CONF="${ELASTICMQ_DIR}/elasticmq.conf"
ELASTICMQ_LOG_DIR="${HOME}/.autumn-agent/logs"
mkdir -p "$ELASTICMQ_LOG_DIR"
if ! pgrep -f 'elasticmq.*\.jar' >/dev/null 2>&1; then
log "Starting ElasticMQ on :9324"
nohup java \
-Dconfig.file="$ELASTICMQ_CONF" \
-jar "$ELASTICMQ_JAR" \
>"$ELASTICMQ_LOG_DIR/elasticmq.log" 2>&1 &
disown || true
log "Waiting for ElasticMQ to be ready"
ELASTICMQ_READY=0
for i in $(seq 1 30); do
if curl -sf -o /dev/null 'http://localhost:9324/?Action=ListQueues&Version=2012-11-05'; then
ELASTICMQ_READY=1
break
fi
sleep 0.5
done
if [ "$ELASTICMQ_READY" -eq 0 ]; then
echo "[agent-services] ERROR: ElasticMQ did not become ready after 15s. Check $ELASTICMQ_LOG_DIR/elasticmq.log" >&2
exit 1
fi
fi
# =============================================================
# 3. Ensure Postgres DB + role + pg_trgm
# =============================================================
DB_NAME="autumn"
if [ "$OS" = "Darwin" ]; then
# macOS: brew's postgres runs as the current user, no 'postgres' role by default
psql -d postgres -tAc "SELECT 1 FROM pg_database WHERE datname = '$DB_NAME'" 2>/dev/null \
| grep -q 1 || createdb "$DB_NAME"
psql -d postgres -c "DO \$\$ BEGIN CREATE ROLE postgres WITH LOGIN SUPERUSER PASSWORD 'postgres'; EXCEPTION WHEN duplicate_object THEN ALTER ROLE postgres WITH LOGIN SUPERUSER PASSWORD 'postgres'; END \$\$;" >/dev/null 2>&1 || true
psql -d "$DB_NAME" -c "CREATE EXTENSION IF NOT EXISTS pg_trgm;" >/dev/null 2>&1 || true
else
sudo -u postgres psql -tc "SELECT 1 FROM pg_database WHERE datname = '$DB_NAME'" 2>/dev/null \
| grep -q 1 || sudo -u postgres createdb "$DB_NAME"
sudo -u postgres psql -c "ALTER USER postgres WITH PASSWORD 'postgres';" >/dev/null 2>&1 || true
sudo -u postgres psql -d "$DB_NAME" -c "CREATE EXTENSION IF NOT EXISTS pg_trgm;" >/dev/null 2>&1 || true
fi
# =============================================================
# 4. Write env files (no-op if server/.env already exists)
# =============================================================
bun scripts/setup/writeAgentEnv.ts
# =============================================================
# 5. DB migrations
# =============================================================
log "Running migrations"
bun db:generate >/dev/null 2>&1 || true
bun db:migrate
log "All services ready"