#!/usr/bin/env bash # # Создание нового gbrain instance # ================================ # Создаёт изолированную БД + пользователя Postgres + systemd unit # для gbrain serve --http на отдельном порту. # # Использование: # sudo bash scripts/create-brain.sh "" # # Примеры: # sudo bash scripts/create-brain.sh zetit "ZETIT MSP" 3001 # sudo bash scripts/create-brain.sh telerapharma "TeleraPharma" 3002 # sudo bash scripts/create-brain.sh personal "Personal" 3003 # sudo bash scripts/create-brain.sh community "Smolenskaya 10" 3004 set -euo pipefail # ============================================================ # Аргументы # ============================================================ if [[ $# -lt 3 ]]; then cat < "" Arguments: name slug-имя брейна (только [a-z0-9_], <=32 символов) display-name человекочитаемое имя в кавычках port TCP-порт для gbrain serve --http (3001-3099) Example: $0 zetit "ZETIT MSP" 3001 EOF exit 1 fi BRAIN_NAME="$1" BRAIN_DISPLAY="$2" BRAIN_PORT="$3" # Валидация if [[ ! "$BRAIN_NAME" =~ ^[a-z0-9_]{1,32}$ ]]; then echo "ERROR: name должно содержать только [a-z0-9_] и быть не длиннее 32 символов" >&2 exit 1 fi if [[ ! "$BRAIN_PORT" =~ ^[0-9]+$ ]] || [[ $BRAIN_PORT -lt 3001 ]] || [[ $BRAIN_PORT -gt 3099 ]]; then echo "ERROR: port должен быть числом в диапазоне 3001-3099" >&2 exit 1 fi # ============================================================ # Константы # ============================================================ ZBRAIN_USER="zbrain" ZBRAIN_DATA_DIR="/var/lib/zbrain" ZBRAIN_CONFIG_DIR="/etc/zbrain" GBRAIN_DIR="$ZBRAIN_DATA_DIR/gbrain" DB_NAME="gbrain_${BRAIN_NAME}" DB_USER="gbrain_${BRAIN_NAME}" SYSTEMD_UNIT="zbrain-gbrain-${BRAIN_NAME}" BRAIN_HOME="$ZBRAIN_DATA_DIR/brains/$BRAIN_NAME" log() { echo -e "\033[1;34m[$(date +'%H:%M:%S')] $*\033[0m"; } err() { echo -e "\033[1;31m[ERROR] $*\033[0m" >&2; } # ============================================================ # Проверки # ============================================================ [[ $EUID -eq 0 ]] || { err "Требуется sudo"; exit 1; } [[ -d "$GBRAIN_DIR" ]] || { err "gbrain не установлен. Запусти сначала bootstrap-vm.sh"; exit 1; } [[ -f "$ZBRAIN_CONFIG_DIR/.env" ]] || { err "$ZBRAIN_CONFIG_DIR/.env не существует"; exit 1; } # Проверка занятости порта if ss -tln | grep -q ":${BRAIN_PORT} "; then err "Порт $BRAIN_PORT уже занят" exit 1 fi # Проверка существования if sudo -u postgres psql -lqt | cut -d \| -f 1 | grep -qw "$DB_NAME"; then err "БД $DB_NAME уже существует" exit 1 fi # ============================================================ # Создание Postgres пользователя и БД # ============================================================ log "Создаю Postgres пользователя $DB_USER и БД $DB_NAME" DB_PASSWORD=$(openssl rand -hex 24) sudo -u postgres psql < "$BRAIN_HOME/config.json" < "/etc/systemd/system/${SYSTEMD_UNIT}.service" </dev/null 2>&1; then log "✓ Health check OK" else log "⚠ Health endpoint недоступен (возможно gbrain ещё стартует или endpoint называется иначе)" fi # ============================================================ # Финальный отчёт # ============================================================ cat <