AI-Suite

AI-Suite is intended to provide an end-to-end path from zero to working AI workflows and agents for developers and those who want to enable a local, private AI solution.

It provides an open, curated, pre-configured Docker Compose configuration file along with Python and Bash shell scripts that bootstraps fully featured Local AI Agents, personal AI Assistant and a Low/No Code environment on a self-hosted platform enabling users to focus on building solutions that employ robust AI workflows and agents.

Portions of AI-Suite extends Cole Medin's Self-hosted AI Package which is built on the n8n-io Self-hosted AI Starter Kit.

n8n.io - n8n

Curated by Trevor SANDY - https://github.com/trevorsandy.

What’s included

Self-hosted n8n - Automation platform with over 400 integrations and advanced AI components.

Self-hosted OpenClaw - a personal AI assistant you run on your own devices.

Open WebUI - ChatGPT-like interface to privately interact with your local models and N8N agents.

OpenCode - open source agent that helps you write code in your terminal.

Ollama - Cross-platform LLM platform to install and run the latest LLMs.

LLaMA.cpp - Cross-platform LLaMA.cpp HTTP Server platform to install and run the latest LLMs in gguf format.

Supabase - Open source database as a service, most widely used database for AI agents.

Flowise - No/low-code AI agent builder that pairs very well with n8n.

Qdrant - Open source, high performance vector store with an comprehensive API.

PostgreSQL - Workhorse of the Data Engineering world, backend for Langfuse.

MCP Gateway - Reverse proxy and management layer for MCP servers.

Neo4j - Knowledge graph engine that powers tools like GraphRAG, LightRAG, and Graphiti.

Redis (Valkey) - High-performance key/value datastore, supports caching and message queues workloads.

SearXNG - Open source internet metasearch engine, aggregates results from up to 229 search services.

Langfuse - Open source LLM engineering platform for agent observability.

MinIO - High-performance, S3-compatible object storage solution.

ClickHouse - Open source, database management system that can generate analytical data reports in real-time.

Caddy - Managed HTTPS/TLS for custom domains.

Nginx - HTTPS/TLS server, reverse proxy, TCP/UDP proxy server

Authelia - Authentication and authorization server, identity and access management (IAM).

Prerequisites

System specifications:

  • 32GB RAM recommended (8GB minimum)
  • 40GB free disk space

Before you begin, make sure you have the following software installed:

  • Git - For easy repository management.

  • Python 3.10+ - To run the setup script.

  • Node 22.16+ - For auto-configuration and OpenClaw runtime.

  • Docker 20.10+ - Required to setup and run all AI-Suite services.

    By default, AI-Suite automatic configuration will validate and, if needed, install Docker. However, you can also manually install Docker in advance.

    If you are using a machine without the docker compose application available by default, run these commands to install Docker compose:

    DOCKER_COMPOSE_VERSION=$(curl -s https://api.github.com/repos/docker/compose/
    releases/latest | grep 'tag_name' | cut -d\\" -f4)
    sudo curl -L "https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-linux-x86_64" -o /usr/local/bin docker-compose
    sudo chmod +x /usr/local/bin/docker-compose
    sudo mkdir -p /usr/local/lib/docker/cli-plugins
    sudo ln -s /usr/local/bin/docker-compose /usr/local/lib/docker/cli-plugins/docker-compose
    

Developers may also consider the following optional software:

  • VSCode - Python and Bash shell development.
  • GitKraken - Superior Git SCM platform

Installation

Step 1: Clone the repository and set environment variables

  1. Clone the repository and navigate to the project directory:

    git clone https://github.com/trevorsandy/ai-suite.git
    cd ai-suite
    
  2. AI-Suite will automatically configure the settings and environment variables including generation of secret passwords, tokens and keys needed to successfully perform installation and startup operations.

    However, it is good practice to review your .env environment variables before running install or update taking into account your installation platform components, specifications and requirements. Particularly pay attention to the Ollama or LLaMA.cpp (depending on which LLM you are using) configuration settings and Windows WSL (posix) versus native paths.

    Optionally, you can make a copy of .env.example renamed to .env in the project directory.

    cp .env.example .env
    

    If you install Supabase, all credentials will be auto-generated. If you prefer to manually setup the Supabase credentials, you may use the their self-hosting guide.

    .env.example file

    # Change this file  name to .env after updating it if not using auto-configuration!
    
    ############
    # Auto-Configuration:
    #   AI-Suite uses this file as the .env template. You should update default settings
    #   you wish to set before running install or update using suite_services.py.
    #
    #   If an existing .env is encountered during auto-configuration, defaults from this
    #   file are overlayed with the existing .env values. This means secrets for variables
    #   in the existing .env will not be generated by AI-Suite during install or update.
    #
    #   Variables that hold generated secrets will have a specific default value
    #   format: <variable>=generate using <generator>[:<argument>]
    #   Examples: N8N_RUNNERS_AUTH_TOKEN=generate using gen_hex:32
    #             SERVICE_ROLE_KEY=generate using gen_token:service_role_sym
    #             PROXY_AUTH_PASSWORD=generate using gen_bcrypt
    #
    # Generating Credentials:
    #   All secrets are generated when using auto-configure except N8N_ENCRYPTION_KEY
    #   which can also be set by exporting the environment variable or by placing the
    #   key=value pair in n8n/.n8n.encryption.key.
    
    #   When using your existing n8n encryption key placed in n8n/.n8n.encryption.key,
    #   be sure to properly terminate the line entry with a new line (hit enter key to
    #   move your cursor to the next line). Also ensure the file format is LF (Unix)
    #   and not CRLF (Windows).
    #
    # OpenSSL: Available by default on Linux/Mac via command `openssl rand -hex 32`
    #   For Windows, use 'WSL2', 'Git Bash' terminal installed with git or from cmd
    #   run the command: python -c "import secrets; print(secrets.token_hex(32))"
    #
    # Password: Use Python command to generate 16-character strong password:
    #   python3 -c "import secrets;import string; alphabet = string.ascii_letters + string.digits;\
    #               password = ''.join(secrets.choice(alphabet) for i in range(16));\
    #               print(password)"
    #
    # JWT Tokens: Use https://jwtsecrets.com/#generator to generate keys and tokens
    #   ranging from 8 to 128 characters long.
    ############
    
    ############
    # [required for Auto-Configuration] - automatically set when enabled (AC=True)
    # Access Control - Proxy, Identity and Access Management configuration
    ############
    
    # Enable proxy, identity and access auto-configure mode -credentials are auto-generated
    AC=True
    # Your public/private domain name. An arbitrary name is allowed for private domain
    AC_DOMAIN=local.pc
    # Configure AI-Suite as a local (private) vs. global (public) installation
    AC_LOCAL=True
    # The reverse proxy to use (Caddy or Nginx)
    AC_PROXY=caddy
    # User name for PROXY configuration (alphanumeric characters only)
    AC_USERNAME=AISuiteProxyUser
    # User password for PROXY configuration
    # Keep default '*******' to trigger password prompt during setup
    AC_PASSWORD='*******'
    # Send confirmation email on user registration - SMTP server required
    AC_CONFIRM=False
    # Enable Authelia 2FA (two factor authentication) support
    AC_WITH_AUTHELIA=True
    # User email address for Authelia - required if AC_WITH_AUTHELIA=True
    [email protected]
    # User display name for Authelia - required if AC_WITH_AUTHELIA=True (alphanumeric chars and spaces only)
    AC_DISPLAY_NAME='AI Suite Authelia User'
    # Use Redis with Authelia - recommended if AC_WITH_AUTHELIA=True and public
    AC_WITH_REDIS=False
    # Auto-configuration runtime log relative path without filename
    AC_LOG_PATH=./access
    
    ############
    # [required] - automatically set when auto-configure (AC=True) is enabled
    # n8n credentials - use OpenSSL `openssl rand -hex 32` for all
    ############
    
    # Master key used to encrypt sensitive credentials that n8n stores
    N8N_ENCRYPTION_KEY=generate using gen_n8ncrypt
    # Shared secret between n8n containers and runners sidecars
    N8N_RUNNERS_AUTH_TOKEN=generate using gen_hex:32
    # Specific JWT secret. By default, n8n generates one on start
    N8N_USER_MANAGEMENT_JWT_SECRET=generate using gen_hex:32
    
    ############
    # [required] - automatically set when auto-configure (AC=True) is enabled
    # PostgreSQL database user password - use OpenSSL `openssl rand -hex 16`
    ############
    
    POSTGRES_PASSWORD=generate using gen_hex:16
    
    # Following settings are required if you enable the respective module.
    
       #
       #
    #######
     #####
       #
    
    ############
    # [required for Supabase] - automatically set when auto-configure (AC=True) is enabled
    # Supabase Secrets
    
    # Read these docs for any help: https://supabase.com/docs/guides/self-hosting/docker
    # For the JWT Secret and keys, see: https://supabase.com/docs/guides/self-hosting/docker#generate-api-keys
    # For the other secrets, see: https://supabase.com/docs/guides/self-hosting/docker#update-secrets
    
    # Note that using special symbols (like '%') can complicate things a bit for your Postgres password.
    # If you use special symbols in your Postgres password, you must remember to percent-encode your password later if using the
    # Postgres connection string, for example, postgresql://postgres.projectref:p%[email protected]:6543/postgres
    #
    # To enable the new asymmetric key support, uncomment these lines in docker-compose.yml:
    #   Auth    : GOTRUE_JWT_KEYS: ${JWT_KEYS:-[]}
    #   Realtime: API_JWT_JWKS: ${JWT_JWKS:-{"keys":[]}}
    #   Storage : JWT_JWKS: ${JWT_JWKS:-{"keys":[]}}
    ############
    
    # Legacy symmetric HS256 key
    JWT_SECRET=generate using gen_key:secret
    # Legacy symmetric API key (HS256-signed JWT) for anon role.
    ANON_KEY=generate using gen_key:anon_sym
    # Legacy symmetric API key (HS256-signed JWT) for service role.
    SERVICE_ROLE_KEY=generate using gen_key:service_role_sym
    # Pre-signed ES256 JWT "API key" for anon role.
    ANON_KEY_ASYMMETRIC=generate using gen_key:anon_asym
    # Pre-signed ES256 JWT "API key" for service role.
    SERVICE_ROLE_KEY_ASYMMETRIC=generate using gen_key:service_role_asym
    # Opaque API key for client-side use (anon role).
    SUPABASE_PUBLISHABLE_KEY=generate using gen_key:client
    # Opaque API key for server-side use (service_role). Never expose in client code.
    SUPABASE_SECRET_KEY=generate using gen_key:server
    # JSON array of signing JWKs (EC private + legacy symmetric).
    # Used by Auth.
    JWT_KEYS=generate using gen_key:keys
    # JWKS for token verification (EC public + legacy symmetric).
    # Used by PostgREST, Realtime, Storage to verify tokens.
    JWT_JWKS=generate using gen_key:jwks
    # Encryption key for securing Realtime and Supavisor communications.
    SECRET_KEY_BASE=generate using gen_token:48
    # Encryption key used by Realtime for sensitive fields in the `_realtime` schema.
    REALTIME_DB_ENC_KEY=generate using gen_hex:8
    # Encryption key used by Supavisor for storing encrypted configuration.
    VAULT_ENC_KEY=generate using gen_hex:16
    # Used by Studio to access Postgres via postgres-meta
    PG_META_CRYPTO_KEY=generate using gen_token:24
    # Used by Kong dashboard user
    DASHBOARD_PASSWORD=generate using gen_hex:16
    
    ############
    # [required for Supabase] - automatically set when auto-configure (AC=True) is enabled
    # Logs - Configuration for Supabase Analytics
    # Please refer to https://supabase.com/docs/reference/self-hosting-analytics/introduction
    ############
    
    # Use Supabase docker-compose.logs.yml override to enable Logflare Analytics.
    LOGFLARE_ENABLED=false
    
    # API token for log ingestion used by Logflare and Vector.
    LOGFLARE_PUBLIC_ACCESS_TOKEN=generate using gen_token:24
    # API token used for Logflare management operations. Never expose client-side.
    LOGFLARE_PRIVATE_ACCESS_TOKEN=generate using gen_token:24
    
    ############
    # [required for Supabase S3] - automatically set when auto-configure (AC=True) is enabled
    # S3 - Supabase alternative storage
    ############
    
    # Access key ID (username-like) for accessing the S3 protocol endpoint in Storage.
    S3_PROTOCOL_ACCESS_KEY_ID=generate using gen_hex:16
    # Secret key (password-like) used with S3_PROTOCOL_ACCESS_KEY_ID.
    S3_PROTOCOL_ACCESS_KEY_SECRET=generate using gen_hex:32
    
    ############
    # [required for Supabase and Langfuse] - automatically set when auto-configure (AC=True) is enabled
    # MinIO - authentication configuration - use OpenSSL `openssl rand -hex 16`
    ############
    
    # Root administrator password for the RustFS or MinIO server.
    MINIO_ROOT_PASSWORD=generate using gen_hex:16
    
    ############
    # [required for Flowise] - automatically set when auto-configure (AC=True) is enabled
    # Flowise - authentication configuration - use OpenSSL `openssl rand -hex 16`
    ############
    
    FLOWISE_PASSWORD=generate using gen_hex:16
    
    ############
    # [required for Neo4j] - automatically set when auto-configure (AC=True) is enabled
    # Neo4j admin username and password
    # The admin username must remain "neo4j".
    # Replace "password" with your chosen password.
    # Keep the "/" as a separator between the two.
    ############
    
    NEO4J_PASSWORD=generate using gen_hex:16
    NEO4J_AUTH=neo4j/${NEO4J_PASSWORD}
    
    ############
    # [required for Langfuse] - automatically set when auto-configure (AC=True) is enabled
    # Langfuse credentials
    # Each of the secret keys you can set to whatever you want, just make it secure!
    # For salt, secret and encryption key, use OpenSSL command specified above
    ############
    
    CLICKHOUSE_PASSWORD=generate using gen_hex:16
    LANGFUSE_SALT=generate using gen_hex:16
    NEXTAUTH_SECRET=generate using gen_token:32
    ENCRYPTION_KEY=generate using gen_hex:32
    
    # Following settings are required for production.
    
       #
       #
    #######
     #####
       #
    
    ############
    # [required for production if using Authelia]
    # Automatically set when auto-configure (AC=True) is enabled
    # Authelia Config
    ############
    
    AUTHELIA_SESSION_SECRET=generate using gen_hex:32
    AUTHELIA_STORAGE_ENCRYPTION_KEY=generate using gen_hex:32
    AUTHELIA_IDENTITY_VALIDATION_RESET_PASSWORD_JWT_SECRET=generate using gen_hex:32
    
    AUTHELIA_SCHEMA=authelia
    
    ############
    # [required for production if using TLS Proxy]
    # Automatically set when auto-configure (AC=True) is enabled
    # Config for optional Caddy or Nginx reverse proxy with Let's Encrypt
    ############
    
    # Generated bcrypt password for basic authentication without Authelia
    PROXY_AUTH_PASSWORD=generate using gen_bcrypt
    PROXY_AUTH_USERNAME=AISuiteProxyUser
    
    ############
    # [required for production if using Caddy]
    # Automatically set when auto-configure (AC=True) is enabled
    # Caddy Config
    
    # By default listen on https://localhost:[service port] and don't use an email for SSL
    # To change this for production:
    # Uncomment all of these environment variables for the services you want exposed
    # Note that you might not want to expose Ollama or SearXNG since they aren't secured by default
    ############
    
    # Domain name for the proxy (must point to your server)
    PROXY_DOMAIN=${AC_DOMAIN}
    
    # WEBUI_HOSTNAME=openwebui.${AC_DOMAIN}
    # N8N_HOSTNAME=n8n.${AC_DOMAIN}
    # OPENCLAW_HOSTNAME=openclaw.${AC_DOMAIN}
    # FLOWISE_HOSTNAME=flowise.${AC_DOMAIN}
    # SUPABASE_HOSTNAME=supabase.${AC_DOMAIN}
    # LANGFUSE_HOSTNAME=langfuse.${AC_DOMAIN}
    # OLLAMA_HOSTNAME=ollama.${AC_DOMAIN}
    # LLAMACPP_HOSTNAME=llamacpp.${AC_DOMAIN}
    # SEARXNG_HOSTNAME=searxng.${AC_DOMAIN}
    # NEO4J_HOSTNAME=neo4j.${AC_DOMAIN}
    # WEBHOOK_URL=https:n8n.${AC_DOMAIN}
    # LETSENCRYPT_EMAIL=${AC_EMAIL}
    
    ############
    # [required for production if using Nginx]
    # Automatically set when auto-configure (AC=True) is enabled
    # Ngnix Config
    ############
    
    NGINX_SERVER_NAME=generated-primary-hostname
    [email protected]
    # This must be set to 0 for public installation
    USE_LOCAL_CA=1
    
    # Everything below this point is optional.
    # Default values will suffice unless you need more features/customization.
    
    ...
    
    ############
    # OpenClaw - Setup
    ############
    
    # Set to specific release tag, 'commit' for latest commit or empty for latest release
    OPENCLAW_RELEASE=''
    # Set to 1 to enable onboarding during setup
    OPENCLAW_ONBOARDING=0
    # Set to 0 for default Docker setup
    OPENCLAW_DOCKER_SANDBOX=1
    # Set to 0 for pre-built image download when sandbox is disabled
    OPENCLAW_DOCKER_LOCAL_IMAGE=1
    # Preserve locally updated files when performing clone operation
    OPENCLAW_KEEP_LOCAL_UPDATES=0
    
    ############
    # Ollama - LLM
    ############
    
    OLLAMA_PORT=11434
    
    # Docker backend connect when running Ollama in the Host:
    #OLLAMA_HOST=host.docker.internal:${OLLAMA_PORT}
    # When accessing Ollama from the Host:
    OLLAMA_HOST=localhost:${OLLAMA_PORT}
    # When running Ollama in Docker:
    #OLLAMA_HOST=ollama:${OLLAMA_PORT}
    
    # Tuning
    OLLAMA_CONTEXT_LENGTH=4096
    OLLAMA_FLASH_ATTENTION=1
    OLLAMA_KV_CACHE_TYPE=q4_0
    OLLAMA_MAX_LOADED_MODELS=2
    
    # Models
    OLLAMA_DEFAULT_MODEL=llama3.2
    OLLAMA_SUPPLEMENT_MODEL=qwen3:8b
    OLLAMA_EMBEDDING_MODEL=nomic-embed-text
    
    # Ollama server arguments - use ollama serve --help for available 'serve' arguments
    OLLAMA_SERVER_ARGS=serve
    
    ############
    # LLAMA (Ollama/LLaMA.cpp) - Shared environment variables
    ############
    
    # Application Installation path
    # Set for LLaMA.cpp or if using custom Ollama installation path
    # e.g. LLAMA_PATH=~\Projects\ai-suite\llama.cpp\bin\llama-server.exe
    # Omit '<value>' to return 'False' when queried
    LLAMA_PATH=
    
    ############
    # LLaMA.cpp - LLM
    ############
    
    LLAMA_ARG_PORT=8040
    
    # Docker backend connect when running LLaMA.cpp in the Host:
    #LLAMA_ARG_HOST=host.docker.internal
    # When running LLaMA.cpp in Docker:
    LLAMA_ARG_HOST=0.0.0.0
    
    # Backend connect
    LLAMACPP_HOST=${LLAMA_ARG_HOST}:${LLAMA_ARG_PORT}
    
    # Model names - Dictionary keys for model download identifier values below.
    # Keys, and values below include an empty slot for a user-defined model
    LLAMACPP_MODEL_GEMMA=gemma-4b  # Default
    LLAMACPP_MODEL_DEEPSEEK=deepseek-7b
    LLAMACPP_MODEL_MISTRAL=mistral-7b
    LLAMACPP_MODEL_LLAMA=llama-8b
    LLAMACPP_MODEL_QWEN=qwen-8b
    LLAMACPP_MODEL_USER=
    
    # Model download identifier - Dictionary values for model keys above.
    # Model selected by 'best match' to LLAMACPP_MODEL_NAME
    # To specify a local model, change '-hf' to '-m' in LLAMACPP_SERVER_ARGS below
    # and replace the respective model id value below with 'models/<model filename>'.
    LLAMACPP_MODEL_GEMMA_ID=ggml-org/gemma-3-4b-it-GGUF
    LLAMACPP_MODEL_DEEPSEEK_ID=mradermacher/DeepSeek-R1-Distill-Qwen-7B-Uncensored-i1-GGUF
    LLAMACPP_MODEL_MISTRAL_ID=bartowski/mistralai_Ministral-3-8B-Instruct-2512-GGUF
    LLAMACPP_MODEL_LLAMA_ID=bartowski/allura-forge_Llama-3.3-8B-Instruct-GGUF
    LLAMACPP_MODEL_QWEN_ID=bartowski/Qwen_Qwen3-8B-GGUF
    LLAMACPP_MODEL_USER_ID=
    
    # Model and paths
    LLAMACPP_PATH=llama.cpp
    LLAMACPP_DEFAULT_MODEL=${LLAMACPP_MODEL_GEMMA}  # IMPORTANT: should reasonably match dictionary model name above.
    LLAMACPP_MODELS_DIR=${LLAMACPP_PATH}/models
    LLAMACPP_MODEL_PATH=${LLAMACPP_MODELS_DIR}/${LLAMACPP_DEFAULT_MODEL}
    
    # Model management - automatically download specified model if not downloaded.
    LLAMA_ARG_HF_REPO=${LLAMACPP_MODEL_GEMMA_ID}
    
    # Tuning
    LLAMA_ARG_CTX_SIZE=4096
    LLAMA_ARG_FLASH_ATTN=1
    LLAMA_ARG_N_GPU_LAYERS=0
    LLAMA_ARG_THREADS=4
    LLAMA_ARG_MODELS_MAX=4
    
    # LLaMA.cpp server arguments - use 'llama-server --help' for available arguments
    # To specify a local model, append '-m' or '––model'.
    # To auto-download model (if not already downloaded) and if LLAMA_ARG_HF_REPO is
    # not used (commented), append '-hf' or '--hf-file'.
    LLAMACPP_SERVER_ARGS=--jinja
    
    ############
    # LLAMA (Ollama/LLaMA.cpp) - Shared environment variables
    ############
    
    # Application Installation path
    # Set for LLaMA.cpp or if using custom Ollama installation path
    # e.g. LLAMA_PATH=~\Projects\ai-suite\llama.cpp\bin\llama-server.exe
    # Omit '<value>' to return 'False' when queried
    LLAMA_PATH=
    
    # Conecting to LLAMA using OpenAI API connection
    # When running Ollama:    ${OLLAMA_HOST}
    # When running LLaMA.cpp: ${LLAMACPP_HOST}
    OPENAI_API_BASE_URL=${OLLAMA_HOST}
    #OPENAI_API_KEY -  OpenAI API key declared below at Studio
    

    You may also choose to generate the AI-Suite requirements.txt file and install missing Python modules to ensure your environment meets the Python module dependencies.

    Optionally, setup a Python virtual environment under ai-suite.

    pip install -U virtualenv
    

    Unix

    python3 -m venv .venv
    source ./.venv/bin/activate
    

    Windows

    python -m venv .venv
    

    Powershell

    .venv/Scripts/activate.ps1
    

    Console

    .venv\Scripts\activate
    

    Then run the following commands from ai-suite:

    pip install pipreqs
    pipreqs --encoding=utf8 .
    pip install -r requirements.txt
    

[!IMPORTANT] Make sure to generate secure random values for all secrets. Never use the example values in production.


Step 2: Run suite_services.py

AI-Suite uses the suite_services.py script for the installation command that handles the AI-Suite functional module selection, LLAMA (Ollama/LLaMA.cpp) CPU/GPU configuration, and starting Supabase, OpenClaw and Open WebUI Filesystem when specified.

Additionally, this script is used to perform operational actions such as stopping or pausing the running suite stack, OpenClaw clawdock operations and updating container images.

Command syntax:

suite_services.py --profile <arguments> --environment <argument> --operation
<argument> --log <argument>

[!NOTE] The following example commands will use the n8n and OpenCode functional modules. Simply substitute these modules for your desired options if you elect to use these examples in your environment.


The profile command arguments

Both installation and operation commands utilize the optional --profile arguments to specify which AI-Suite functional modules and which LLAMA CPU/GPU configuration to use. When no functional profile argument is specified, the default functional module open-webui is used, Likewise, if no CPU/GPU configuration profile argument is specified, it is assumed LLAMA is being run from the Host. Multiple profile arguments for functional modules are supported.

suite_services.py --profile functional module arguments

Argument Functional Module
n8n n8n - automation platform
openclaw OpenClaw - your own personal AI assistant
opencode OpenCode - low-code, no-code agent
open-webui Open WebUI - chatbot interface
open-webui-mcpo Open WebUI MCPO - MCP to OpenAPI translator
open-webui-pipe Open WebUI Pipelines - agent tools and functions
flowise Flowise - complementary agent builder
supabase Supabase - alternative database
searxng SearXNG - internet metasearch
langfuse Langfuse - agent observability platform
neo4j Neo4j - knowledge graph
caddy Caddy - managed https/tls server
n8n-all n8n - complete bundle
open-webui-all Open WebUI - complete bundle
ai-all AI-Suite full stack - all modules

suite_services.py --profile LLAMA CPU/GPU in Docker argument:

Argument LLAMA CPU/GPU
cpu Ollama - run on CPU
gpu-nvidia Ollama - run on Nvidia GPU
gpu-amd Ollama - run on AMD GPU
cpp-cpu LLaMA.cpp - run on CPU
cpp-gpu-nvidia LLaMA.cpp - run on Nvidia GPU
cpp-gpu-amd LLaMA.cpp - run on AMD GPU

Example command:

# Ollama
python suite_services.py --profile n8n opencode gpu-nvidia
# LLaMA.cpp
python suite_services.py --profile n8n opencode cpp-gpu-nvidia

suite_services.py --profile LLAMA running on Host argument:

Argument LLAMA CPU/GPU
ollama Ollama - run on Host (Default)
llama.cpp LLaMA.cpp - run on Host

Example command:

# Ollama - As the default LLAMA option, the argument is not required
python suite_services.py --profile n8n opencode
# LLaMA.cpp
python suite_services.py --profile n8n opencode llama.cpp

If you intend to install Supabase, before running suite_services.py, setup the Supabase environment variables using their self-hosting guide.

For Docker LLAMA with Nvidia GPU users

# Ollama
python suite_services.py --profile gpu-nvidia n8n opencode
# LLaMA.cpp
python suite_services.py --profile cpp-gpu-nvidia n8n opencode

[!NOTE] If you have not used your Nvidia GPU with Docker before, please follow the Ollama Docker instructions. LLaMA.cpp Docker instructions

For Docker LLAMA with AMD GPU users

# Ollama
python suite_services.py --profile gpu-amd n8n opencode
# LLaMA.cpp
python suite_services.py --profile cpp-gpu-amd n8n opencode

For LLAMA on Mac running Apple Silicon users

If you're using a Mac with an M1 or newer processor, you cannot expose your GPU to the Docker instance, unfortunately. There are two options in this case:

  1. Run ai-suite fully on CPU:

    # Ollama
    python suite_services.py --profile cpu n8n opencode
    # LLaMA.cpp
    python suite_services.py --profile cpp-cpu n8n opencode
    
  2. Run LLAMA on your Host for faster inference, and connect to that from the n8n instance:

    # Ollama
    python suite_services.py --profile n8n opencode
    # LLaMA.cpp
    python suite_services.py --profile n8n opencode llama.cpp
    

    If you want to run LLAMA on your Mac, check the Ollama homepage or LLaMA.cpp install for installation instructions.

For LLAMA running on the Host users

If you're running LLAMA on your Host (not in Docker), the suite_services.py script will automatically set your OLLAMA_HOST/LLAMA_ARG_HOST environment variable in the .env file. Using interpolation, these settings will also be set for the n8n service configuration.

To manually configure the Ollama settings and update the x-n8n section in your .env file:

OLLAMA_HOST=host.docker.internal:11434
#OLLAMA_HOST=ollama:11434

# ... other configurations ...

# When running Ollama in the Host and Open WebUI in Docker:
OLLAMA_BASE_URL=http://host.docker.internal:11434
#OLLAMA_BASE_URL=http://localhost:11434

... or youe Docker Compose file:

x-n8n: &service-n8n
  # ... other configurations ...
  environment:
    # ... other environment variables ...
    - OLLAMA_HOST=host.docker.internal:11434

The suite_services.py script will similarly set the OPENAI_API_BASE_URL environment variable to use the HOST and PORT of the selected LLAMA LLM (Ollama/LLaMA.cpp). This option will enable n8n backend connections to LLaMA.cpp.

LLAMA_ARG_PORT=8040

# When running LLaMA.cpp in the host:
#LLAMA_ARG_HOST=host.docker.internal
# When running LLaMA.cpp in Docker:
#LLAMA_ARG_HOST=0.0.0.0
LLAMA_ARG_HOST='host.docker.internal'

# Backend connect
LLAMACPP_HOST=${LLAMA_ARG_HOST}:${LLAMA_ARG_PORT}

# ... other configurations ...

# Conecting to LLAMA using OpenAI API connection
# When running Ollama:    ${OLLAMA_HOST}
# When running LLaMA.cpp: ${LLAMA_ARG_HOST}:${LLAMA_ARG_PORT}
OPENAI_API_BASE_URL='${LLAMACPP_HOST}'

For everyone else (...using CPU)

# Ollama
python suite_services.py --profile n8n opencode cpu
# LLaMA.cpp
python suite_services.py --profile n8n opencode cpp-cpu

[!NOTE] Script examples beyond this point will use Ollama or LLaMA.cpp interchangeably.


The operation command argument

There are also operation commands that start, stop, stop-llama, pause, unpause, update and install the AI-Suite services using the optional --operation argument. A LLAMA (Ollama/LLaMA.cpp) check is performed when it is assumed LLAMA is running from the Host. If LLAMA is determined to be installed but not running, an attempt to launch the Ollama/LLaMA.cpp service is executed on install, start and unpause. The check will also attempt to stop the running LLAMA service (in addition to stopping the AI-Suite services) when the stop-llama operational command argument is specified.

suite_services.py ... --operation argument:

Argument Operation
start Start - start the previously stopped, specified profile containers
stop Stop - shut down the specified profile containers
stop-llama Stop - perform stop and shut down Ollama/LLaMA.cpp on Host
pause Pause - pause the specified profile containers
unpause Unpause - unpause the previously paused profile containers
backup-data Backup Data - backup volume mount data to backup file
restore-data Restore Data - restore volume mount data from backup file

Example command:

# Ollama
python suite_services.py --profile n8n opencode gpu-nvidia --operation stop
# LLaMA.cpp
python suite_services.py --profile n8n opencode llama.cpp --operation stop-llama

OpenClaw operation commands are available using clawdock.

suite_services.py --operation clawdock argument

[!IMPORTANT] For Docker setup, the Gateway bearer token is no longer exposed in setup logs or printed in follow-up commands output. The token is stored in <project>/.env and ~/.openclaw/openclaw.json. For AI-Suite, <project> is ./openclaw/.

  • Basic Operations
Argument Operation
clawdock-start Start the gateway
clawdock-stop Stop the gateway
clawdock-restart Restart the gateway
clawdock-status Check container status
clawdock-logs View live logs (follows output)
  • Container Access
Command Description
clawdock-shell Interactive shell inside the gateway container
clawdock-cli <command> Run OpenClaw CLI commands
clawdock-exec <command> Execute arbitrary commands in the container
  • Web UI & Devices
Command Description
clawdock-dashboard Open web UI in browser with authentication
clawdock-devices List device pairing requests
clawdock-approve <id> Approve a device pairing request
  • Setup & Configuration
Command Description
clawdock-fix-token Configure gateway authentication token (run once)
  • Maintenance
Command Description
clawdock-update Pull latest, rebuild image, and restart (one command)
clawdock-rebuild Rebuild the Docker image only
clawdock-clean Remove all containers and volumes (destructive!)
  • Utilities
Command Description
clawdock-health Run gateway health check
clawdock-token Display the gateway authentication token
clawdock-cd Jump to the OpenClaw project directory
clawdock-config Open the OpenClaw config directory
clawdock-show-config Print config files with redacted values
clawdock-workspace Open the workspace directory
clawdock-help Show all available commands with examples

[!NOTE] Clawdoc commands that require an argument, for example clawdock-approve <id>, are executed in two operations. First, enter only the clawdock command: suite_services.py --operation clawdock-approve. Second AI-Suite will generate a prompt for the argument or command: Enter a device pairing: <id> which you will then enter.

Example command:

python suite_services.py --operation clawdock-status

OpenClaw guide (auth, pairing, channels): Getting started


The environment command argument

The --environment command allows the installation to be defined as private (default) or public. A public install restricts the communication ports exposed to the network.

The suite_services.py script supports the private (default) and public environment argument:

  • private: you are deploying the stack in a safe environment, all AI-Suite ports are accessible
  • public: the stack is deployed in a public environment, all AI-Suite ports except 80 and 443 are closed

suite_services.py ... --environment argument:

Argument Scope
private Private network
public Public network

Example command:

The AI-Suite stack initialized with...

python suite_services.py --profile n8n opencode cpp-cpu --environment private

is equal to being initialized with:

python suite_services.py --profile gpu-nvidia

The log command argument

The suite_services.py script enables stream (console) logging and setting the logging level. File logging is always enabled at DEBUG and is not affected by this argument. The default console logging level is INFO.

environment argument:

suite_services.py ... --log argument:

Argument Scope
OFF Console logging is disabled
DEBUG Debug logging level
INFO Standard output logging level
WARNING Warning logging level
ERROR Error logging level
CRITICAL Critical logging level

Example command:

python suite_services.py --profile n8n opencode cpp-cpu --operation update --log DEBUG

Auto-configuration, HTTPS Reverse Proxy and Access Management

By default, auto-configure will generate secrets, the .env file and Docker compose file updates for AI-Suite modules, including Supabase and OpenClaw. Additionally, AI-Suite will automatically configure Caddy (Default) or Nginx HTTPS reverse proxy and Authelia 2FA (Two Factor Authentication) IAM (Identity and Access Management) on install or update. There is no --profile argument to enable automatic configuration as is the default behaviour.

However, you can disable automatic configurati