#!/usr/bin/env bash set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ENV_FILE="${ENV_FILE:-$SCRIPT_DIR/.env}" BUILD=0 REPLACE=0 while [[ $# -gt 0 ]]; do case "$1" in --env-file) ENV_FILE="$2" shift 2 ;; --build) BUILD=1 shift ;; --replace) REPLACE=1 shift ;; *) echo "Unknown argument: $1" >&2 exit 2 ;; esac done if [[ -f "$ENV_FILE" ]]; then set -a # shellcheck disable=SC1090 source "$ENV_FILE" set +a fi IMAGE_NAME="${IMAGE_NAME:-beaver/app-instance:keycloak}" CONTAINER_NAME="${CONTAINER_NAME:-beaver-app-instance}" HOST_IP="${HOST_IP:-172.19.0.245}" HOST_PORT="${HOST_PORT:-18080}" HOST_BIND_IP="${HOST_BIND_IP:-0.0.0.0}" DATA_DIR="${DATA_DIR:-runtime/standalone}" DOCKER_NETWORK="${DOCKER_NETWORK:-${NETWORK_NAME:-}}" PUBLIC_URL="${PUBLIC_URL:-http://${HOST_IP}:${HOST_PORT}}" KEYCLOAK_ISSUER="${KEYCLOAK_ISSUER:-https://keycloak.bwgdi.com/realms/beaver}" KEYCLOAK_CLIENT_ID="${KEYCLOAK_CLIENT_ID:-beaver-agnet}" KEYCLOAK_REDIRECT_URI="${KEYCLOAK_REDIRECT_URI:-${PUBLIC_URL}/auth/callback}" KEYCLOAK_POST_LOGOUT_REDIRECT_URI="${KEYCLOAK_POST_LOGOUT_REDIRECT_URI:-${PUBLIC_URL}/logout/callback}" BEAVER_PROVIDER="${BEAVER_PROVIDER:-${PROVIDER:-custom}}" BEAVER_MODEL="${BEAVER_MODEL:-${MODEL:-}}" BEAVER_API_KEY="${BEAVER_API_KEY:-${API_KEY:-}}" BEAVER_API_BASE="${BEAVER_API_BASE:-${API_BASE:-}}" if [[ "$DATA_DIR" = /* ]]; then DATA_ROOT="$DATA_DIR" else DATA_ROOT="$SCRIPT_DIR/$DATA_DIR" fi if [[ "$(basename "$DATA_ROOT")" == "beaver-home" ]]; then BEAVER_HOME_HOST="$DATA_ROOT" else BEAVER_HOME_HOST="$DATA_ROOT/beaver-home" fi CONFIG_PATH="$BEAVER_HOME_HOST/config.json" mkdir -p "$BEAVER_HOME_HOST/workspace" if [[ "${SKIP_PROVIDER_CONFIG:-0}" == "1" && -f "$CONFIG_PATH" ]]; then echo "Keeping existing Beaver config: $CONFIG_PATH" elif [[ ! -f "$CONFIG_PATH" ]]; then cat > "$CONFIG_PATH" < "$tmp_config" <&2 fi if [[ "$BUILD" == "1" ]]; then docker build \ --build-arg "NPM_REGISTRY=${NPM_REGISTRY:-https://registry.npmmirror.com}" \ --build-arg "NPM_FETCH_RETRIES=${NPM_FETCH_RETRIES:-5}" \ --build-arg "NPM_FETCH_RETRY_MIN_TIMEOUT=${NPM_FETCH_RETRY_MIN_TIMEOUT:-20000}" \ --build-arg "NPM_FETCH_RETRY_MAX_TIMEOUT=${NPM_FETCH_RETRY_MAX_TIMEOUT:-120000}" \ --build-arg "APT_MIRROR=${APT_MIRROR:-https://mirrors.tuna.tsinghua.edu.cn/debian}" \ --build-arg "PYPI_INDEX_URL=${PYPI_INDEX_URL:-https://pypi.tuna.tsinghua.edu.cn/simple}" \ --build-arg "NEXT_PUBLIC_KEYCLOAK_ISSUER=$KEYCLOAK_ISSUER" \ --build-arg "NEXT_PUBLIC_KEYCLOAK_CLIENT_ID=$KEYCLOAK_CLIENT_ID" \ --build-arg "NEXT_PUBLIC_KEYCLOAK_REDIRECT_URI=$KEYCLOAK_REDIRECT_URI" \ --build-arg "NEXT_PUBLIC_KEYCLOAK_POST_LOGOUT_REDIRECT_URI=$KEYCLOAK_POST_LOGOUT_REDIRECT_URI" \ -t "$IMAGE_NAME" "$SCRIPT_DIR" fi if docker ps -a --format '{{.Names}}' | grep -Fxq "$CONTAINER_NAME"; then if [[ "$REPLACE" == "1" ]]; then docker rm -f "$CONTAINER_NAME" >/dev/null else echo "Container already exists: $CONTAINER_NAME. Use --replace to recreate it." >&2 exit 1 fi fi docker_args=( run -d --name "$CONTAINER_NAME" -p "${HOST_BIND_IP}:${HOST_PORT}:8080" -v "$BEAVER_HOME_HOST:/root/.beaver" -e "BEAVER_KEYCLOAK_ISSUER=$KEYCLOAK_ISSUER" -e "BEAVER_KEYCLOAK_CLIENT_ID=$KEYCLOAK_CLIENT_ID" -e "BEAVER_FRONTEND_PUBLIC_BASE_URL=$PUBLIC_URL" -e "BEAVER_BACKEND_IDENTITY__PUBLIC_BASE_URL=$PUBLIC_URL" -e "BEAVER_USER_FILES_MAX_UPLOAD_BYTES=${USER_FILES_MAX_UPLOAD_BYTES:-5368709120}" ) if [[ -n "${DOCKER_NETWORK:-}" ]]; then docker_args+=(--network "$DOCKER_NETWORK") fi docker_args+=("$IMAGE_NAME") docker "${docker_args[@]}" >/dev/null cat <