Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
85 changes: 85 additions & 0 deletions ct/bifrost.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
#!/usr/bin/env bash
_CS_DEFAULT_URL="https://raw.githubusercontent.com/community-scripts/DevScripts/main"
_cs_boot="${COMMUNITY_SCRIPTS_CORE_DIR:-$(dirname "${BASH_SOURCE[0]}")/../../core}/core/build.func"
source "$_cs_boot" 2>/dev/null || source <(curl -fsSL "${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}/core/build.func")
# Copyright (c) 2021-2026 community-scripts ORG
# Author: cheesejaguar
# License: MIT | https://github.com/community-scripts/DevScripts/raw/main/LICENSE
# Source: https://github.com/maximhq/bifrost

APP="Bifrost"
var_tags="${var_tags:-ai;proxy}"
var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-1024}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"

header_info "$APP"
variables
color
catch_errors

function update_script() {
header_info
check_container_storage
check_container_resources

if [[ ! -x /opt/bifrost/bifrost-http || ! -f /opt/bifrost_data/config.json ]]; then
msg_error "No Bifrost Installation Found!"
exit 1
fi

if check_for_gh_release "bifrost" "maximhq/bifrost" "${var_appversion:-}" "" "transports/v"; then
# Gateway binaries are published to the upstream CDN, not as GitHub assets.
BIFROST_URL="https://downloads.getmaxim.ai/bifrost/${CHECK_UPDATE_RELEASE##*/}/linux/$(arch_resolve)"
msg_info "Downloading Bifrost Gateway"
mkdir -p /opt/bifrost-update
chmod 700 /opt/bifrost-update
curl_with_retry "${BIFROST_URL}/bifrost-http" /opt/bifrost-update/bifrost-http
curl_with_retry "${BIFROST_URL}/bifrost-http.sha256" /opt/bifrost-update/bifrost-http.sha256
cd /opt/bifrost-update || exit 1
$STD sha256sum --check bifrost-http.sha256
msg_ok "Verified Bifrost Gateway"

msg_info "Stopping Bifrost"
systemctl stop bifrost
msg_ok "Stopped Bifrost"

BACKUP_DIR="/opt/bifrost-backup-$(date +%Y%m%d-%H%M%S)" create_backup /opt/bifrost_data /opt/bifrost/bifrost-http ~/.bifrost

msg_info "Installing Bifrost Gateway"
install -m 755 /opt/bifrost-update/bifrost-http /opt/bifrost/bifrost-http
cd /opt/bifrost || exit 1
rm -rf /opt/bifrost-update
msg_ok "Installed Bifrost Gateway"

msg_info "Starting Bifrost"
systemctl start bifrost
$STD curl --fail --silent --show-error --retry 30 --retry-connrefused --retry-delay 2 --retry-max-time 120 --max-time 5 http://127.0.0.1:8080/health
systemctl is-active --quiet bifrost
cat <<EOF >~/.bifrost
${CHECK_UPDATE_RELEASE}
EOF
msg_ok "Started Bifrost"
msg_ok "Updated Bifrost successfully!"
else
RELEASE_CHECK_STATUS=$?
if [[ "$RELEASE_CHECK_STATUS" -ne 1 ]]; then
exit "$RELEASE_CHECK_STATUS"
fi
fi
exit
}

start
build_container
description

msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW}Access it using the following URL:${CL}"
echo -e "${GATEWAY}${BGN}http://${IP}:8080${CL}"
echo -e "${INFO}${YW}Bifrost username: admin. Find BIFROST_ADMIN_PASSWORD in /opt/bifrost_data/.env inside the container.${CL}"
93 changes: 93 additions & 0 deletions install/bifrost-install.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
#!/usr/bin/env bash

# Copyright (c) 2021-2026 community-scripts ORG
# Author: cheesejaguar
# License: MIT | https://github.com/community-scripts/DevScripts/raw/main/LICENSE
# Source: https://github.com/maximhq/bifrost

source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
color
verb_ip6
catch_errors
setting_up_container
network_check
update_os

# Gateway binaries live on the upstream CDN; GitHub also releases unrelated SDKs and plugins.
if ! check_for_gh_release "bifrost" "maximhq/bifrost" "${var_appversion:-}" "" "transports/v"; then
msg_error "Could not select a Bifrost gateway release"
exit 1
fi

msg_info "Installing Bifrost Gateway"
BIFROST_URL="https://downloads.getmaxim.ai/bifrost/${CHECK_UPDATE_RELEASE##*/}/linux/$(arch_resolve)"
mkdir -p /opt/bifrost /opt/bifrost-update
chmod 700 /opt/bifrost-update
curl_with_retry "${BIFROST_URL}/bifrost-http" /opt/bifrost-update/bifrost-http
curl_with_retry "${BIFROST_URL}/bifrost-http.sha256" /opt/bifrost-update/bifrost-http.sha256
cd /opt/bifrost-update || exit 1
$STD sha256sum --check bifrost-http.sha256
install -m 755 /opt/bifrost-update/bifrost-http /opt/bifrost/bifrost-http
cd /opt/bifrost || exit 1
rm -rf /opt/bifrost-update
msg_ok "Installed Bifrost Gateway"

msg_info "Configuring Bifrost"
mkdir -p /opt/bifrost_data
chmod 700 /opt/bifrost_data
cat <<EOF >/opt/bifrost_data/.env
BIFROST_ADMIN_PASSWORD=$(random_password 32)
BIFROST_ENCRYPTION_KEY=$(random_password 64)
BIFROST_SETUP_TOKEN=$(random_password 32)
EOF
cat <<'EOF' >/opt/bifrost_data/config.json
{
"encryption_key": "env.BIFROST_ENCRYPTION_KEY",
"setup_token": "env.BIFROST_SETUP_TOKEN",
"client": {
"enforce_auth_on_inference": true
},
"governance": {
"auth_config": {
"admin_username": "admin",
"admin_password": "env.BIFROST_ADMIN_PASSWORD",
"is_enabled": true
}
}
}
EOF
chmod 600 /opt/bifrost_data/.env /opt/bifrost_data/config.json
msg_ok "Configured Bifrost"

msg_info "Creating Bifrost Service"
cat <<EOF >/etc/systemd/system/bifrost.service
[Unit]
Description=Bifrost AI Gateway
Wants=network-online.target
After=network-online.target

[Service]
Type=simple
User=root
WorkingDirectory=/opt/bifrost_data
EnvironmentFile=/opt/bifrost_data/.env
UMask=0077
ExecStart=/opt/bifrost/bifrost-http -host 0.0.0.0 -port 8080 -app-dir /opt/bifrost_data
Restart=on-failure
RestartSec=5
TimeoutStopSec=60

[Install]
WantedBy=multi-user.target
EOF
systemctl enable -q --now bifrost
$STD curl --fail --silent --show-error --retry 30 --retry-connrefused --retry-delay 2 --retry-max-time 120 --max-time 5 http://127.0.0.1:8080/health
systemctl is-active --quiet bifrost
cat <<EOF >~/.bifrost
${CHECK_UPDATE_RELEASE}
EOF
msg_ok "Created Bifrost Service"

motd_ssh
customize
cleanup_lxc
48 changes: 48 additions & 0 deletions json/bifrost.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
{
"name": "Bifrost",
"slug": "bifrost",
"categories": [20],
"date_created": "2026-11-01",
"type": "ct",
"updateable": true,
"privileged": false,
"architectures": ["amd64", "arm64"],
"interface_port": 8080,
"documentation": "https://docs.getbifrost.ai/",
"website": "https://www.getmaxim.ai/bifrost",
"repository": "https://github.com/maximhq/bifrost",
"logo": "https://raw.githubusercontent.com/maximhq/bifrost/dev/docs/media/bifrost-logo.png",
"description": "Bifrost is an AI gateway with a unified API for multiple model providers. It provides a web dashboard, virtual keys, usage budgets, request logs, load balancing, and automatic fallbacks.",
"install_methods": [
{
"type": "default",
"script": "ct/bifrost.sh",
"config_path": "/opt/bifrost_data/config.json",
"resources": {
"cpu": 2,
"ram": 1024,
"hdd": 4,
"os": "Debian",
"version": "13"
}
}
],
"default_credentials": {
"username": "admin",
"password": null
},
"notes": [
{
"text": "Find the generated BIFROST_ADMIN_PASSWORD in /opt/bifrost_data/.env inside the container. Add provider credentials and create virtual keys in the dashboard.",
"type": "info"
},
{
"text": "Use an HTTPS reverse proxy for access beyond a trusted network. Authentication is enabled for both the dashboard and inference API.",
"type": "warning"
},
{
"text": "Keep a backup of /opt/bifrost_data, including .env. Losing or changing BIFROST_ENCRYPTION_KEY makes stored provider credentials unreadable.",
"type": "warning"
}
]
}
Loading