diff --git a/ct/localai.sh b/ct/localai.sh new file mode 100644 index 000000000..20ecfabaf --- /dev/null +++ b/ct/localai.sh @@ -0,0 +1,63 @@ +#!/usr/bin/env bash +_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: Bryan Lieberman (BryanCLieberman) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://localai.io + +APP="LocalAI" +var_tags="${var_tags:-ai;llm;api}" +var_cpu="${var_cpu:-4}" +var_ram="${var_ram:-8192}" +var_disk="${var_disk:-30}" +var_os="${var_os:-debian}" +var_version="${var_version:-13}" +var_arm64="${var_arm64:-yes}" +var_gpu="${var_gpu:-yes}" +var_unprivileged="${var_unprivileged:-1}" + +# Values the install script accepts up front +export var_auth="${var_auth:-no}" +export var_api_key="${var_api_key:-}" +export var_port="${var_port:-8080}" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -d /opt/localai ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + if check_for_gh_release "localai" "mudler/LocalAI"; then + msg_info "Stopping Service" + systemctl stop localai + msg_ok "Stopped Service" + + CLEAN_INSTALL=1 fetch_and_deploy_gh_release "localai" "mudler/LocalAI" "singlefile" "latest" "/opt/localai" "local-ai-v*-linux-$(arch_resolve amd64 arm64)" + + msg_info "Starting Service" + systemctl start localai + msg_ok "Started Service" + msg_ok "Updated successfully!" + 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}Install models from the gallery in the web UI or place GGUF files in /opt/localai_data/models${CL}" diff --git a/install/localai-install.sh b/install/localai-install.sh new file mode 100644 index 000000000..2171e2c1e --- /dev/null +++ b/install/localai-install.sh @@ -0,0 +1,92 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 community-scripts ORG +# Author: Bryan Lieberman (BryanCLieberman) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://localai.io + +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +msg_info "Installing Dependencies" +$STD apt install -y \ + libgomp1 \ + libopenblas0 +msg_ok "Installed Dependencies" + +setup_hwaccel +var_port="${var_port:-8080}" +var_auth="${var_auth:-no}" +var_api_key="${var_api_key:-}" +if [[ "$var_auth" == "yes" ]]; then + setup_postgresql + PG_DB_NAME="localai" PG_DB_USER="localai" setup_postgresql_db +fi + +fetch_and_deploy_gh_release "localai" "mudler/LocalAI" "singlefile" "latest" "/opt/localai" "local-ai-v*-linux-$(arch_resolve amd64 arm64)" + +msg_info "Configuring LocalAI" +mkdir -p /opt/localai_data/models /opt/localai_data/backends +cat </opt/localai.env +LOCALAI_ADDRESS=0.0.0.0:${var_port} +LOCALAI_DATA_PATH=/opt/localai_data +LOCALAI_MODELS_PATH=/opt/localai_data/models +LOCALAI_BACKENDS_PATH=/opt/localai_data/backends +LOCALAI_LOG_LEVEL=info +EOF +# LocalAI refuses to start on a wildcard bind with nothing to identify callers, +# and binding the wildcard is what makes the container reachable at all. +if [[ "$var_auth" == "yes" ]]; then + cat <>/opt/localai.env +LOCALAI_AUTH=true +LOCALAI_AUTH_DATABASE_URL=postgres://${PG_DB_USER}:${PG_DB_PASS}@localhost/${PG_DB_NAME} +LOCALAI_REGISTRATION_MODE=approval +EOF +fi +# A static key grants admin access on its own, so when it is the only thing +# guarding the API, generate one rather than leaving the server open. +if [[ -z "$var_api_key" && "$var_auth" != "yes" ]]; then + var_api_key="sk-$(openssl rand -hex 24)" + { + echo "LocalAI Credentials" + echo "API Key: ${var_api_key}" + } >>~/localai.creds +fi +if [[ -n "$var_api_key" ]]; then + echo "LOCALAI_API_KEY=${var_api_key}" >>/opt/localai.env +else + echo "#LOCALAI_API_KEY=" >>/opt/localai.env +fi +chmod 600 /opt/localai.env +msg_ok "Configured LocalAI" + +msg_info "Creating Service" +cat </etc/systemd/system/localai.service +[Unit] +Description=LocalAI Server +Wants=network-online.target +After=network-online.target + +[Service] +Type=simple +User=root +WorkingDirectory=/opt/localai +EnvironmentFile=/opt/localai.env +ExecStart=/opt/localai/localai run +Restart=on-failure +RestartSec=10 + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable -q --now localai +msg_ok "Created Service" + +motd_ssh +customize +cleanup_lxc