Files
beaver_project/app-instance/run-standalone.sh

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