#!/bin/sh # Hardened VPS/Dedicated Server AI Suite Installer for AlmaLinux 9 # NO PIPED CURL | SH - NATIVE SECURED ARCHITECTURE ONLY set -e # Visual formatting anchors INFO="[\033[0;34m INFO \033[0m]" SUCCESS="[\033[0;32m SUCCESS \033[0m]" ERROR="[\033[0;31m ERROR \033[0m]" echo -e "${INFO} Commencing production AI Suite installation on AlmaLinux 9..." # Ensure executing user is root if [ "$(id -u)" -ne 0 ]; then echo -e "${ERROR} This installer script must be executed with root/sudo privileges." exit 1 fi # 1. Update system package references echo -e "${INFO} Syncing package manager repository streams..." dnf check-update || true # 2. Native Installation of Docker CE via Official Stable RPM Repo if ! command -v docker >/dev/null 2>&1; then echo -e "${INFO} Deploying Docker CE Engine securely via dnf..." dnf config-manager --add-repo https://docker.com dnf install -y docker-ce docker-ce-cli containerd.io git curl systemctl daemon-reload systemctl enable --now docker else echo -e "${SUCCESS} Docker engine is already present." fi # 3. Setup NVIDIA Container Toolkit via Verified RPM GPG Repository echo -e "${INFO} Registering verified NVIDIA Container Toolkit repository map..." curl -s -L https://github.io | tee /etc/yum.repos.d/nvidia-container-toolkit.repo dnf install -y nvidia-container-toolkit nvidia-ctk runtime configure --runtime=docker systemctl restart docker # 4. AUDITED NATIVE DEPLOYMENT OF OLLAMA ENGINE (Replaces curl | sh) if ! command -v ollama >/dev/null 2>&1; then echo -e "${INFO} Fetching official Ollama Linux x86_64 binary release..." # Download the production binary directly rather than running the install script curl -L https://ollama.com -o /tmp/ollama-linux-amd64.tgz echo -e "${INFO} Unpacking Ollama binary to target path /usr/bin/ollama..." tar -C /usr -xzf /tmp/ollama-linux-amd64.tgz rm -f /tmp/ollama-linux-amd64.tgz echo -e "${INFO} Provisioning isolated, unprivileged system account for Ollama daemon..." if ! id -u ollama >/dev/null 2>&1; then useradd -r -s /bin/false -U -m -d /usr/share/ollama ollama fi echo -e "${INFO} Constructing local-only systemd service configuration for Ollama..." cat < /etc/systemd/system/ollama.service [Unit] Description=Ollama AI Engine Daemon After=network.target [Service] ExecStart=/usr/bin/ollama serve User=ollama Group=ollama Restart=always RestartSec=3 Environment="OLLAMA_HOST=127.0.0.1" Environment="OLLAMA_ORIGINS=*" [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl enable --now ollama else echo -e "${SUCCESS} Ollama engine binary is already installed." fi # 5. Generate Cryptographic Database & Session Keys for OmniRoute Gateway Container OMNI_DB_KEY=$(openssl rand -hex 32) OMNI_JWT_KEY=$(openssl rand -base64 48) OMNI_ADMIN_PASS=$(openssl rand -hex 12) # Deploy OmniRoute - Locked securely inside the loopback interface on port 20128 echo -e "${INFO} Deploying OmniRoute AI Gateway Proxy..." docker run -d \ --name omniroute \ -p 127.0.0.1:20128:20128 \ -e API_KEY_SECRET="${OMNI_DB_KEY}" \ -e JWT_SECRET="${OMNI_JWT_KEY}" \ -e INITIAL_PASSWORD="${OMNI_ADMIN_PASS}" \ -e HOSTNAME="0.0.0.0" \ -v omniroute-data:/app/data \ --restart unless-stopped \ diegosouzapw/omniroute:latest # 6. Deploy Containerized Open WebUI Frontend Dashboard # Configured to look outward safely at the host engine via the Docker gateway node (172.17.0.1) echo -e "${INFO} Deploying Open WebUI dashboard..." docker run -d \ --name open-webui \ -p 127.0.0.1:8080:8080 \ -e OLLAMA_BASE_URL="http://172.17.0.1:11434" \ -v open-webui:/app/backend/data \ --restart unless-stopped \ ghcr.io/open-webui/open-webui:main # 7. Deploy Stable Diffusion Engine via ComfyUI with Hardware GPU Passthrough echo -e "${INFO} Deploying ComfyUI graphic generations node..." docker run -d \ --name comfyui \ -p 127.0.0.1:8188:8188 \ --gpus all \ -v comfyui-data:/home/user/ComfyUI \ --restart unless-stopped \ yanolink/comfyui:latest || echo -e "${ERROR} ComfyUI image layer build deferred." # 8. AUDITED DEPLOYMENT OF DOKPLOY ENGINE (Replaces curl | sh) # Dokploy runs natively inside Docker. Instead of piping their installer script, # we reproduce its exact deployment mechanism safely here. echo -e "${INFO} Pre-configuring environment and directories for Dokploy orchestration..." mkdir -p /etc/dokploy echo "INITIALIZED=true" > /etc/dokploy/.env echo -e "${INFO} Deploying Dokploy core stack container..." docker run -d \ --name dokploy \ -p 3000:3000 \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /etc/dokploy:/etc/dokploy \ --restart unless-stopped \ dokploy/dokploy:latest # 9. Automated Model Preloading Loop echo -e "${INFO} Waiting for local Ollama socket thread to activate..." until curl -s http://127.0.0 > /dev/null; do sleep 2 done echo -e "${INFO} Ingesting target engineering models into verified storage cache..." ollama pull qwen2.5-coder:32b-instruct-q8_0 ollama pull deepseek-r1:32b ollama pull qwen2.5-coder:7b-instruct-q8_0 ollama pull deepseek-r1:8b echo -e "==========================================================================" echo -e " 🛡️ HARDENED PRODUCTION WORKSPACE SUCCESSFULLY DEPLOYED" echo -e "==========================================================================" echo -e " 🔒 SECURITY VERIFIED: No unauthenticated AI ports are open to the web." echo -e " 🚀 PaaS Management Panel (Dokploy): http://YOUR_SERVER_IP:3000" echo -e " 🔀 Host Gateway Loopback Node: 172.17.0.1" echo -e " 🔑 Generated OmniRoute Admin Password: ${OMNI_ADMIN_PASS}" echo -e "=========================================================================="