fine tuning
This commit is contained in:
@@ -11,11 +11,10 @@ echo ""
|
|||||||
# --- Step 1: Install system packages ---
|
# --- Step 1: Install system packages ---
|
||||||
echo "[1/4] Installing system packages..."
|
echo "[1/4] Installing system packages..."
|
||||||
sudo apt update -qq
|
sudo apt update -qq
|
||||||
sudo apt install -y -qq \
|
sudo DEBIAN_FRONTEND=noninteractive apt install -y -qq \
|
||||||
xfce4 xfce4-goodies \
|
xfce4 xfce4-goodies \
|
||||||
tigervnc-standalone-server tigervnc-common \
|
tigervnc-standalone-server tigervnc-common \
|
||||||
dbus-x11 \
|
dbus-x11
|
||||||
> /dev/null 2>&1
|
|
||||||
echo " Done."
|
echo " Done."
|
||||||
|
|
||||||
# --- Step 2: Install Brave browser (native .deb, not snap) ---
|
# --- Step 2: Install Brave browser (native .deb, not snap) ---
|
||||||
@@ -26,7 +25,7 @@ if ! command -v brave-browser-stable > /dev/null 2>&1; then
|
|||||||
echo "deb [signed-by=/usr/share/keyrings/brave-browser-archive-keyring.gpg] https://brave-browser-apt-release.s3.brave.com/ stable main" \
|
echo "deb [signed-by=/usr/share/keyrings/brave-browser-archive-keyring.gpg] https://brave-browser-apt-release.s3.brave.com/ stable main" \
|
||||||
| sudo tee /etc/apt/sources.list.d/brave-browser-release.list > /dev/null
|
| sudo tee /etc/apt/sources.list.d/brave-browser-release.list > /dev/null
|
||||||
sudo apt update -qq
|
sudo apt update -qq
|
||||||
sudo apt install -y -qq brave-browser > /dev/null 2>&1
|
sudo DEBIAN_FRONTEND=noninteractive apt install -y -qq brave-browser
|
||||||
fi
|
fi
|
||||||
# Fix launcher symlink
|
# Fix launcher symlink
|
||||||
if [ -f /opt/brave.com/brave/brave-browser ]; then
|
if [ -f /opt/brave.com/brave/brave-browser ]; then
|
||||||
|
|||||||
@@ -13,6 +13,13 @@
|
|||||||
|
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
|
# Resolve the real user's home even when running under sudo
|
||||||
|
if [[ -n "${SUDO_USER:-}" ]]; then
|
||||||
|
REAL_HOME=$(getent passwd "$SUDO_USER" | cut -d: -f6)
|
||||||
|
else
|
||||||
|
REAL_HOME="$HOME"
|
||||||
|
fi
|
||||||
|
|
||||||
GREEN='\033[0;32m'
|
GREEN='\033[0;32m'
|
||||||
YELLOW='\033[1;33m'
|
YELLOW='\033[1;33m'
|
||||||
RED='\033[0;31m'
|
RED='\033[0;31m'
|
||||||
@@ -72,7 +79,7 @@ if [[ "$SERVICES" == "all" ]]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# ─── compose directory ──────────────────────────────────────────────────────
|
# ─── compose directory ──────────────────────────────────────────────────────
|
||||||
prompt_value COMPOSE_DIR "Docker Compose directory" "$HOME/.local/dockers"
|
prompt_value COMPOSE_DIR "Docker Compose directory" "$REAL_HOME/.local/dockers"
|
||||||
mkdir -p "$COMPOSE_DIR"
|
mkdir -p "$COMPOSE_DIR"
|
||||||
|
|
||||||
# ─── build compose file ─────────────────────────────────────────────────────
|
# ─── build compose file ─────────────────────────────────────────────────────
|
||||||
|
|||||||
+35
-12
@@ -20,6 +20,13 @@ has() { command -v "$1" &>/dev/null; }
|
|||||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
|
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
|
||||||
|
|
||||||
|
# Resolve the real user's home even when running under sudo
|
||||||
|
if [[ -n "${SUDO_USER:-}" ]]; then
|
||||||
|
REAL_HOME=$(getent passwd "$SUDO_USER" | cut -d: -f6)
|
||||||
|
else
|
||||||
|
REAL_HOME="$HOME"
|
||||||
|
fi
|
||||||
|
|
||||||
# ─── detect package manager ────────────────────────────────────────────────────
|
# ─── detect package manager ────────────────────────────────────────────────────
|
||||||
if has apt; then
|
if has apt; then
|
||||||
PM=apt
|
PM=apt
|
||||||
@@ -239,7 +246,7 @@ esac
|
|||||||
|
|
||||||
# symlink fdfind → fd (apt installs as fdfind)
|
# symlink fdfind → fd (apt installs as fdfind)
|
||||||
if has fdfind && ! has fd; then
|
if has fdfind && ! has fd; then
|
||||||
sudo ln -sf "$(which fdfind)" /usr/local/bin/fd
|
sudo ln -sf "$(command -v fdfind)" /usr/local/bin/fd
|
||||||
ok "Symlinked fdfind → fd"
|
ok "Symlinked fdfind → fd"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -310,11 +317,11 @@ echo ""
|
|||||||
echo "── Auto-suspend (disable for server) ──"
|
echo "── Auto-suspend (disable for server) ──"
|
||||||
|
|
||||||
# Disable system suspend/hibernate
|
# Disable system suspend/hibernate
|
||||||
if systemctl is-enabled sleep.target 2>/dev/null | grep -q "enabled\|masked"; then
|
if systemctl is-enabled sleep.target 2>/dev/null | grep -q "masked"; then
|
||||||
|
skip "sleep targets already masked"
|
||||||
|
else
|
||||||
sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target 2>/dev/null
|
sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target 2>/dev/null
|
||||||
ok "Masked sleep/suspend targets"
|
ok "Masked sleep/suspend targets"
|
||||||
else
|
|
||||||
skip "sleep targets already masked"
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Configure logind to ignore idle — patch individual keys, don't overwrite the file
|
# Configure logind to ignore idle — patch individual keys, don't overwrite the file
|
||||||
@@ -375,8 +382,8 @@ case $PM in
|
|||||||
install_node22_apt
|
install_node22_apt
|
||||||
if [ -f "$SYSTEM_NODE" ] && [ "$("$SYSTEM_NODE" -v 2>/dev/null | cut -d. -f1 | tr -d 'v')" = "22" ]; then
|
if [ -f "$SYSTEM_NODE" ] && [ "$("$SYSTEM_NODE" -v 2>/dev/null | cut -d. -f1 | tr -d 'v')" = "22" ]; then
|
||||||
ok "node v$("$SYSTEM_NODE" -v) installed at $SYSTEM_NODE"
|
ok "node v$("$SYSTEM_NODE" -v) installed at $SYSTEM_NODE"
|
||||||
if has node && [ "$(which node)" != "$SYSTEM_NODE" ]; then
|
if has node && [ "$(command -v node)" != "$SYSTEM_NODE" ]; then
|
||||||
warn "Shell resolves 'node' to $(which node) — system node is at $SYSTEM_NODE"
|
warn "Shell resolves 'node' to $(command -v node) — system node is at $SYSTEM_NODE"
|
||||||
warn "nvm may shadow it in interactive shells; systemd services will use $SYSTEM_NODE"
|
warn "nvm may shadow it in interactive shells; systemd services will use $SYSTEM_NODE"
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
@@ -449,8 +456,9 @@ install_go() {
|
|||||||
esac
|
esac
|
||||||
echo " Installing Go ${GOLANG_VERSION} from official tarball..."
|
echo " Installing Go ${GOLANG_VERSION} from official tarball..."
|
||||||
curl -fsSL "https://go.dev/dl/go${GOLANG_VERSION}.linux-${GO_ARCH}.tar.gz" -o /tmp/go.tar.gz
|
curl -fsSL "https://go.dev/dl/go${GOLANG_VERSION}.linux-${GO_ARCH}.tar.gz" -o /tmp/go.tar.gz
|
||||||
rm -rf "$HOME/.local/go"
|
|
||||||
mkdir -p "$HOME/.local"
|
mkdir -p "$HOME/.local"
|
||||||
|
# Only remove old installation after successful download
|
||||||
|
rm -rf "$HOME/.local/go"
|
||||||
tar -C "$HOME/.local" -xzf /tmp/go.tar.gz
|
tar -C "$HOME/.local" -xzf /tmp/go.tar.gz
|
||||||
rm /tmp/go.tar.gz
|
rm /tmp/go.tar.gz
|
||||||
export GOPATH="$HOME/.local/go-path"
|
export GOPATH="$HOME/.local/go-path"
|
||||||
@@ -522,6 +530,21 @@ case $PM in
|
|||||||
brew) ;; # not needed on macOS
|
brew) ;; # not needed on macOS
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
# Vorbis/OGG/FLAC dev headers (needed by cliamp's Go dependencies)
|
||||||
|
case $PM in
|
||||||
|
apt)
|
||||||
|
for pkg in libvorbis-dev libogg-dev libflac-dev; do
|
||||||
|
if dpkg -s "$pkg" &>/dev/null 2>&1; then skip "$pkg"; else PULSE_PKGS+=("$pkg"); fi
|
||||||
|
done
|
||||||
|
;;
|
||||||
|
pacman)
|
||||||
|
for pkg in libvorbis libogg flac; do
|
||||||
|
if pacman -Qi "$pkg" &>/dev/null 2>&1; then skip "$pkg"; else PULSE_PKGS+=("$pkg"); fi
|
||||||
|
done
|
||||||
|
;;
|
||||||
|
brew) ;; # not needed on macOS
|
||||||
|
esac
|
||||||
|
|
||||||
if [ ${#PULSE_PKGS[@]} -gt 0 ]; then
|
if [ ${#PULSE_PKGS[@]} -gt 0 ]; then
|
||||||
install_pkg "${PULSE_PKGS[@]}"
|
install_pkg "${PULSE_PKGS[@]}"
|
||||||
ok "Installed: ${PULSE_PKGS[*]}"
|
ok "Installed: ${PULSE_PKGS[*]}"
|
||||||
@@ -535,7 +558,7 @@ GOPATH_BIN="${GOPATH:-$HOME/.local/go-path}/bin"
|
|||||||
export PATH="$GOPATH_BIN:$PATH"
|
export PATH="$GOPATH_BIN:$PATH"
|
||||||
|
|
||||||
if has cliamp; then
|
if has cliamp; then
|
||||||
skip "cliamp ($(which cliamp))"
|
skip "cliamp ($(command -v cliamp))"
|
||||||
else
|
else
|
||||||
if ! has go; then
|
if ! has go; then
|
||||||
warn "Go not installed — skipping cliamp build"
|
warn "Go not installed — skipping cliamp build"
|
||||||
@@ -548,7 +571,7 @@ else
|
|||||||
if [ -f "$GOPATH_BIN/cliamp" ]; then
|
if [ -f "$GOPATH_BIN/cliamp" ]; then
|
||||||
ok "cliamp installed at $GOPATH_BIN/cliamp"
|
ok "cliamp installed at $GOPATH_BIN/cliamp"
|
||||||
else
|
else
|
||||||
fail "cliamp build failed"
|
warn "cliamp build failed"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
@@ -708,7 +731,7 @@ else
|
|||||||
# Use explicit path to system npm if available, to avoid nvm conflicts
|
# Use explicit path to system npm if available, to avoid nvm conflicts
|
||||||
SYSTEM_NPM="/usr/bin/npm"
|
SYSTEM_NPM="/usr/bin/npm"
|
||||||
if [ ! -f "$SYSTEM_NPM" ]; then
|
if [ ! -f "$SYSTEM_NPM" ]; then
|
||||||
SYSTEM_NPM="$(which npm)"
|
SYSTEM_NPM="$(command -v npm)"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Set npm prefix to system location so all users can access packages
|
# Set npm prefix to system location so all users can access packages
|
||||||
@@ -817,9 +840,9 @@ if [ "$GENERATE_ENV" = true ]; then
|
|||||||
read -r ENV_PUBLIC_URL
|
read -r ENV_PUBLIC_URL
|
||||||
done
|
done
|
||||||
|
|
||||||
echo -n " DATA_PATH [/mnt/data]: "
|
echo -n " DATA_PATH [$REAL_HOME/.local/data]: "
|
||||||
read -r ENV_DATA_PATH
|
read -r ENV_DATA_PATH
|
||||||
ENV_DATA_PATH="${ENV_DATA_PATH:-/mnt/data}"
|
ENV_DATA_PATH="${ENV_DATA_PATH:-$REAL_HOME/.local/data}"
|
||||||
|
|
||||||
MAIL_DEFAULT="${DOCKER_MAIL_TRANSPORT:-smtp://127.0.0.1:1025}"
|
MAIL_DEFAULT="${DOCKER_MAIL_TRANSPORT:-smtp://127.0.0.1:1025}"
|
||||||
echo -n " MAIL_TRANSPORT [$MAIL_DEFAULT]: "
|
echo -n " MAIL_TRANSPORT [$MAIL_DEFAULT]: "
|
||||||
|
|||||||
+6
-14
@@ -33,20 +33,7 @@ type ProbeResult = {
|
|||||||
error?: string;
|
error?: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
const PI_PROVIDERS: { key: string; piId: string }[] = [
|
type PiProvider = { key: string; piId: string };
|
||||||
{ key: 'Anthropic', piId: 'anthropic' },
|
|
||||||
{ key: 'OpenAI', piId: 'openai' },
|
|
||||||
{ key: 'Google', piId: 'google' },
|
|
||||||
{ key: 'Groq', piId: 'groq' },
|
|
||||||
{ key: 'Mistral', piId: 'mistral' },
|
|
||||||
{ key: 'xAI', piId: 'xai' },
|
|
||||||
{ key: 'OpenRouter', piId: 'openrouter' },
|
|
||||||
{ key: 'MiniMax', piId: 'minimax' },
|
|
||||||
{ key: 'Hugging Face', piId: 'huggingface' },
|
|
||||||
{ key: 'Azure OpenAI', piId: 'azure-openai-responses' },
|
|
||||||
{ key: 'ZAI', piId: 'zai' },
|
|
||||||
{ key: 'Cerebras', piId: 'cerebras' },
|
|
||||||
];
|
|
||||||
|
|
||||||
type ProbeState = { step: 'url' } | { step: 'probing' } | { step: 'auth'; probe: ProbeResult } | { step: 'saving' };
|
type ProbeState = { step: 'url' } | { step: 'probing' } | { step: 'auth'; probe: ProbeResult } | { step: 'saving' };
|
||||||
|
|
||||||
@@ -55,6 +42,11 @@ export const AIHarnessesSection = () => {
|
|||||||
const queryClient = useQueryClient();
|
const queryClient = useQueryClient();
|
||||||
const [installing, setInstalling] = useState(false);
|
const [installing, setInstalling] = useState(false);
|
||||||
|
|
||||||
|
const { data: PI_PROVIDERS = [] as PiProvider[] } = useQuery({
|
||||||
|
queryKey: ['PI_MONO_PROVIDERS'],
|
||||||
|
queryFn: () => client.get<PiProvider[]>('/server-settings/pi-mono/providers'),
|
||||||
|
});
|
||||||
|
|
||||||
const { data: piMonoVersion, isLoading: piMonoLoading } = useQuery({
|
const { data: piMonoVersion, isLoading: piMonoLoading } = useQuery({
|
||||||
queryKey: ['PI_MONO_VERSION'],
|
queryKey: ['PI_MONO_VERSION'],
|
||||||
queryFn: () => client.get<VersionInfo>('/server-settings/pi-mono/version'),
|
queryFn: () => client.get<VersionInfo>('/server-settings/pi-mono/version'),
|
||||||
|
|||||||
@@ -366,6 +366,10 @@ export const PROVIDERS: { key: string; piId: string }[] = [
|
|||||||
{ key: 'Cerebras', piId: 'cerebras' },
|
{ key: 'Cerebras', piId: 'cerebras' },
|
||||||
];
|
];
|
||||||
|
|
||||||
|
piMonoRouter.get('/providers', async (ctx) => {
|
||||||
|
return ctx.json(PROVIDERS);
|
||||||
|
});
|
||||||
|
|
||||||
piMonoRouter.get('/auth', async (ctx) => {
|
piMonoRouter.get('/auth', async (ctx) => {
|
||||||
const auth = await readAuthJson();
|
const auth = await readAuthJson();
|
||||||
const providers = PROVIDERS.filter((p) => auth[p.piId]?.key?.trim()).map((p) => p.key);
|
const providers = PROVIDERS.filter((p) => auth[p.piId]?.key?.trim()).map((p) => p.key);
|
||||||
|
|||||||
Reference in New Issue
Block a user