156 lines
4.5 KiB
Bash
Executable File
156 lines
4.5 KiB
Bash
Executable File
#!/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" <<JSON
|
|
{
|
|
"defaultProvider": "${BEAVER_PROVIDER}",
|
|
"defaultModel": "${BEAVER_MODEL}",
|
|
"providers": {
|
|
"custom": {
|
|
"apiKey": "${BEAVER_API_KEY}",
|
|
"apiBase": "${BEAVER_API_BASE}",
|
|
"models": ["${BEAVER_MODEL}"]
|
|
}
|
|
}
|
|
}
|
|
JSON
|
|
elif [[ -w "$CONFIG_PATH" ]]; then
|
|
tmp_config="$(mktemp)"
|
|
cat > "$tmp_config" <<JSON
|
|
{
|
|
"defaultProvider": "${BEAVER_PROVIDER}",
|
|
"defaultModel": "${BEAVER_MODEL}",
|
|
"providers": {
|
|
"custom": {
|
|
"apiKey": "${BEAVER_API_KEY}",
|
|
"apiBase": "${BEAVER_API_BASE}",
|
|
"models": ["${BEAVER_MODEL}"]
|
|
}
|
|
}
|
|
}
|
|
JSON
|
|
mv "$tmp_config" "$CONFIG_PATH"
|
|
else
|
|
echo "Config is not writable, keeping existing: $CONFIG_PATH" >&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 <<EOF
|
|
public_url: $PUBLIC_URL
|
|
redirect_uri: $KEYCLOAK_REDIRECT_URI
|
|
post_logout_redirect_uri: $KEYCLOAK_POST_LOGOUT_REDIRECT_URI
|
|
web_origin: $PUBLIC_URL
|
|
container_name: $CONTAINER_NAME
|
|
data_dir: $BEAVER_HOME_HOST
|
|
config_path: $CONFIG_PATH
|
|
EOF
|