E2E CI / Check Duplicate Run (push) Failing after 3s
🔄 Branch Synchronization / sync-branches (push) Failing after 3s
Test CI / Check Duplicate Run (push) Failing after 3s
E2E CI / Test Web App (push) Has been skipped
Test CI / Test App (shard 1/3) (push) Has been skipped
Test CI / Test Packages (push) Has been skipped
Test CI / Test App (shard 3/3) (push) Has been skipped
Test CI / Test App (shard 2/3) (push) Has been skipped
Test CI / Test Database (push) Has been skipped
Test CI / Test Desktop App (push) Has been skipped
Test CI / Merge and Upload App Coverage (push) Has been skipped
74 lines
3.0 KiB
Bash
Executable File
74 lines
3.0 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Bootstrap every existing LobeChat user with:
|
|
# - Enabled Azure OpenAI provider (encrypted keyVaults)
|
|
# - One Azure chat model matching $AZURE_OPENAI_DEPLOYMENT
|
|
# - "enterprise-gateway" customPlugin pointing at the gateway manifest
|
|
#
|
|
# Usage: ./gateway/scripts/bootstrap-lobechat-users.sh
|
|
# Pre-req: docker compose stack is up; .env populated with Azure + KEY_VAULTS_SECRET.
|
|
# Idempotent: safe to re-run.
|
|
|
|
set -euo pipefail
|
|
|
|
ROOT_DIR="$(cd "$(dirname "$0")/../.." && pwd)"
|
|
SCRIPT_PATH="$ROOT_DIR/gateway/scripts/bootstrap-lobechat-users.js"
|
|
|
|
# Load .env so we get KEY_VAULTS_SECRET, Azure creds, etc.
|
|
# Write a stripped copy to a tempfile (removes inline `# ...` comments), then
|
|
# source it with `set -a` so every assignment becomes exported.
|
|
if [[ -f "$ROOT_DIR/.env" ]]; then
|
|
TMP_ENV="$(mktemp)"
|
|
trap 'rm -f "$TMP_ENV"' EXIT
|
|
# keep only KEY=VALUE lines; strip trailing " # comment"; preserve quotes/slashes in VALUE
|
|
awk '
|
|
/^[[:space:]]*#/ { next }
|
|
/^[[:space:]]*$/ { next }
|
|
{
|
|
# split off trailing comment only if preceded by whitespace
|
|
sub(/[[:space:]]+#.*$/, "")
|
|
if ($0 ~ /^[A-Za-z_][A-Za-z0-9_]*=/) print
|
|
}
|
|
' "$ROOT_DIR/.env" > "$TMP_ENV"
|
|
set -a
|
|
# shellcheck disable=SC1090
|
|
source "$TMP_ENV"
|
|
set +a
|
|
fi
|
|
|
|
: "${KEY_VAULTS_SECRET:?KEY_VAULTS_SECRET must be set (see .env). Must decode to 16/24/32 bytes.}"
|
|
: "${AZURE_OPENAI_API_KEY:?AZURE_OPENAI_API_KEY must be set in .env}"
|
|
: "${AZURE_OPENAI_ENDPOINT:?AZURE_OPENAI_ENDPOINT must be set in .env}"
|
|
AZURE_OPENAI_API_VERSION="${AZURE_OPENAI_API_VERSION:-2025-04-01-preview}"
|
|
AZURE_OPENAI_DEPLOYMENT="${AZURE_OPENAI_DEPLOYMENT:-gpt-5.4}"
|
|
|
|
POSTGRES_USER="${POSTGRES_USER:-eg}"
|
|
POSTGRES_PASSWORD="${POSTGRES_PASSWORD:-eg_pw}"
|
|
LOBE_DB_NAME="${LOBE_DB_NAME:-lobechat}"
|
|
LOBECHAT_DATABASE_URL="postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${LOBE_DB_NAME}"
|
|
|
|
CONTAINER="${LOBECHAT_CONTAINER:-lobechat-lobechat-1}"
|
|
|
|
echo "[bootstrap] using container: $CONTAINER"
|
|
if ! docker ps --format '{{.Names}}' | grep -q "^${CONTAINER}\$"; then
|
|
echo "[bootstrap] ERROR: container '$CONTAINER' not running." >&2
|
|
echo " set LOBECHAT_CONTAINER=<name> or start the stack." >&2
|
|
exit 1
|
|
fi
|
|
|
|
# Copy script into the container (it has pg + node baked in).
|
|
docker cp "$SCRIPT_PATH" "$CONTAINER:/tmp/bootstrap-lobechat-users.js"
|
|
|
|
# Run via node, pointing NODE_PATH at the app's node_modules so `require('pg')` resolves.
|
|
docker exec \
|
|
-e NODE_PATH=/app/node_modules \
|
|
-e LOBECHAT_DATABASE_URL="$LOBECHAT_DATABASE_URL" \
|
|
-e KEY_VAULTS_SECRET="$KEY_VAULTS_SECRET" \
|
|
-e AZURE_OPENAI_API_KEY="$AZURE_OPENAI_API_KEY" \
|
|
-e AZURE_OPENAI_ENDPOINT="$AZURE_OPENAI_ENDPOINT" \
|
|
-e AZURE_OPENAI_API_VERSION="$AZURE_OPENAI_API_VERSION" \
|
|
-e AZURE_OPENAI_DEPLOYMENT="$AZURE_OPENAI_DEPLOYMENT" \
|
|
-e GATEWAY_MANIFEST_URL="${GATEWAY_MANIFEST_URL:-http://gateway:3001/api/lobechat/manifest}" \
|
|
"$CONTAINER" node /tmp/bootstrap-lobechat-users.js
|
|
|
|
echo "[bootstrap] done. Sign in as admin@eg.local or user1@eg.local and open the model + plugin pickers."
|