{"id":49662471,"url":"https://github.com/trevorsandy/ai-suite","last_synced_at":"2026-05-06T13:07:40.071Z","repository":{"id":327622916,"uuid":"1110049618","full_name":"trevorsandy/ai-suite","owner":"trevorsandy","description":"AI-Suite -  n8n, Open WebUI, OpenCode, Llama.cpp/Ollama, Flowise, Langfuse, MCP Gateway and more!","archived":false,"fork":false,"pushed_at":"2026-05-03T20:26:21.000Z","size":4500,"stargazers_count":19,"open_issues_count":1,"forks_count":5,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-03T22:23:11.972Z","etag":null,"topics":["ai","ai-agents","automation","cag","integrations","llms","low-code","mcp","mcp-server","n8n","no-code","ollama","open-webui","openapi","opencode","orchestration","python","rag","typescript","workflow"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/trevorsandy.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-12-04T16:35:49.000Z","updated_at":"2026-04-29T17:06:28.000Z","dependencies_parsed_at":"2026-03-29T17:01:03.426Z","dependency_job_id":null,"html_url":"https://github.com/trevorsandy/ai-suite","commit_stats":null,"previous_names":["trevorsandy/ai-suite"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/trevorsandy/ai-suite","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trevorsandy%2Fai-suite","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trevorsandy%2Fai-suite/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trevorsandy%2Fai-suite/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trevorsandy%2Fai-suite/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/trevorsandy","download_url":"https://codeload.github.com/trevorsandy/ai-suite/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trevorsandy%2Fai-suite/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32695025,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-06T08:33:17.875Z","status":"ssl_error","status_checked_at":"2026-05-06T08:33:17.221Z","response_time":117,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai","ai-agents","automation","cag","integrations","llms","low-code","mcp","mcp-server","n8n","no-code","ollama","open-webui","openapi","opencode","orchestration","python","rag","typescript","workflow"],"created_at":"2026-05-06T13:07:36.910Z","updated_at":"2026-05-06T13:07:40.053Z","avatar_url":"https://github.com/trevorsandy.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# AI-Suite\n\n**AI-Suite** is intended to provide an **end-to-end path from zero to working\nAI workflows** for developers and those who want to enable a local, private\n**AI solution**.\n\nIt provides an open, curated, pre-configured **Docker Compose** configuration\nfile that bootstraps fully featured Local AI Agents and a Low/No Code environment\non a self-hosted **n8n** platform, enabling users to focus on building solutions\nthat employ robust AI workflows.\n\nPortions of AI-Suite extends [Cole Medin's](https://github.com/coleam00)\n[Self-hosted AI Package](https://github.com/coleam00/local-ai-packaged)\nwhich is built on the [n8n-io](https://github.com/n8n-io)\n[Self-hosted AI Starter Kit](https://github.com/n8n-io/self-hosted-ai-starter-kit).\n\n![n8n.io - n8n](https://raw.githubusercontent.com/trevorsandy/ai-suite/main/assets/n8n-demo.gif)\n\nCurated by [Trevor SANDY - https://github.com/trevorsandy](https://github.com/trevorsandy).\n\n## What’s included\n\n✅ [**Self-hosted n8n**](https://n8n.io/) - Automation platform with over 400\nintegrations and advanced AI components.\n\n✅ [**Open WebUI**](https://openwebui.com/) - ChatGPT-like interface to\nprivately interact with your local models and N8N agents.\n\n✅ [**OpenCode**](https://opencode.ai/) - open source agent that helps you write\ncode in your terminal.\n\n✅ [**Ollama**](https://ollama.com/) - Cross-platform LLM platform to install\nand run the latest LLMs.\n\n✅ [**LLaMA.cpp**](https://github.com/ggml-org/llama.cpp/) - Cross-platform LLaMA.cpp\nHTTP Server platform to install and run the latest LLMs in gguf format.\n\n✅ [**Supabase**](https://supabase.com/) - Open source database as a service,\nmost widely used database for AI agents.\n\n✅ [**Flowise**](https://flowiseai.com/) - No/low-code AI agent builder that\npairs very well with n8n.\n\n✅ [**Qdrant**](https://qdrant.tech/) - Open source, high performance vector\nstore with an comprehensive API.\n\n✅ [**PostgreSQL**](https://www.postgresql.org/) -  Workhorse of the Data\nEngineering world, backend for Langfuse.\n\n✅ [**MCP Gateway**](https://github.com/microsoft/mcp-gateway/) - Reverse proxy\nand management layer for MCP servers.\n\n✅ [**Neo4j**](https://neo4j.com/) - Knowledge graph engine that powers tools\nlike GraphRAG, LightRAG, and Graphiti.\n\n✅ [**Redis (Valkey)**](https://valkey.io/) - High-performance key/value datastore,\nsupports caching and message queues workloads.\n\n✅ [**SearXNG**](https://searxng.org/) - Open source internet metasearch\nengine, aggregates results from up to 229 search services.\n\n✅ [**Langfuse**](https://langfuse.com/) - Open source LLM engineering platform\nfor agent observability.\n\n✅ [**MinIO**](https://www.min.io/) - High-performance, S3-compatible object\nstorage solution.\n\n✅ [**ClickHouse**](https://clickhouse.com/) - Open source, database management\nsystem that can generate analytical data reports in real-time.\n\n✅ [**Caddy**](https://caddyserver.com/) - Managed HTTPS/TLS for custom domains.\n\n## Prerequisites\n\nSystem specifications:\n\n- **32GB** RAM recommended (8GB minimum)\n- **20GB** free disk space\n\nBefore you begin, make sure you have the following software installed:\n\n- [Git](https://git-scm.com/install/) - For easy repository management.\n- [Python 3.10+](https://www.python.org/downloads/) - To run the setup script.\n\n   \u003cdetails\u003e\n   \u003csummary\u003eImport modules\u003c/summary\u003e\n\n   ```python\n   import os\n   import sys\n   import argparse\n   import datetime\n   import dotenv\n   import logging\n   import pathlib\n   import platform\n   import re\n   import shutil\n   import subprocess\n   import textwrap\n   import time\n   ```\n\n  \u003c/details\u003e\n\n- [Docker/Docker Desktop](https://www.docker.com/products/docker-desktop/) - Required\n  to setup and run all AI-Suite services.\n\n   \u003cdetails\u003e\n   \u003csummary\u003eDocker Compose commands\u003c/summary\u003e\n\n   If you are using a machine without the `docker compose` application available\n   by default, run these commands to install Docker compose:\n\n   ```bash\n   DOCKER_COMPOSE_VERSION=$(curl -s https://api.github.com/repos/docker/compose/\n   releases/latest | grep 'tag_name' | cut -d\\\\\" -f4)\n   sudo curl -L \"https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-linux-x86_64\" -o /usr/local/bin docker-compose\n   sudo chmod +x /usr/local/bin/docker-compose\n   sudo mkdir -p /usr/local/lib/docker/cli-plugins\n   sudo ln -s /usr/local/bin/docker-compose /usr/local/lib/docker/cli-plugins/docker-compose\n   ```\n\n   \u003c/details\u003e\n\nAlso consider the following optional software:\n\n- [VSCode](https://code.visualstudio.com/download) - Python development.\n- [GitKraken](https://www.gitkraken.com/download-b) - Superior Git SCM platform\n\n## Installation\n\n### Step 1: Clone the repository and set environment variables\n\n1. Clone the repository and navigate to the project directory:\n\n   ```powershell\n   git clone https://github.com/trevorsandy/ai-suite.git\n   cd ai-suite\n   ```\n\n2. Make a copy of `.env.example` renamed to `.env` in the project directory.\n\n   ```powershell\n   cp .env.example .env # update secrets and passwords inside\n   ```\n\n3. Set the following required `.env` environment variables:\n\n    \u003cdetails\u003e\n    \u003csummary\u003eCredential environment variables\u003c/summary\u003e\n\n    If you will install **Supabase**, setup the Supabase environment variables\n    using their [self-hosting guide](https://supabase.com/docs/guides/self-hosting/docker#securing-your-services).\n\n    ```ini\n    ############\n    # Generating Credentials\n    # OpenSSL: Available by default on Linux/Mac via command 'openssl rand -hex 32'\n    #   For Windows, use 'WSL2', 'Git Bash' terminal installed with git or from cmd\n    #   run the command: python -c \"import secrets; print(secrets.token_hex(32))\"\n    #\n    # Password: Use Python command to generate 16-character strong password:\n    #   python3 -c \"import secrets;import string; alphabet = string.ascii_letters + string.   digits;\\\n    #               password = ''.join(secrets.choice(alphabet) for i in range(16));\\\n    #               print(password)\"\n    #\n    # JWT Tokens: Use https://jwtsecrets.com/#generator to generate keys and tokens\n    #   ranging from 8 to 128 characters long.\n    ############\n\n    ############\n    # [required]\n    # n8n credentials - use OpenSSL for both\n    ############\n\n    # Master key used to encrypt sensitive credentials that n8n stores\n    N8N_ENCRYPTION_KEY=change_me_to_a_long_super-secret-key\n    # Shared secret between n8n containers and runners sidecars\n    N8N_RUNNERS_AUTH_TOKEN=change_me_to_a_long_super-secret-key\n    # Specific JWT secret. By default, n8n generates one on start\n    N8N_USER_MANAGEMENT_JWT_SECRET=change_me_to_a_longer_even-more-secret\n\n    ############\n    # [required]\n    # Supabase Secrets\n    ############\n\n    JWT_SECRET=your-super-secret-jwt-token-at-least-40-characters-long\n    ANON_KEY=your-super-secret-jwt-key-see-https://supabase.com/docs/guides/self-hosting/docker#generate-api-keys\n    SERVICE_ROLE_KEY=your-super-secret-jwt-key-see-https://supabase.com/docs/guides/self-hosting/docker#generate-api-keys\n    DASHBOARD_USERNAME=supabase\n    DASHBOARD_PASSWORD=your-super-secret-password\n    POOLER_TENANT_ID=your-tenant-id\n\n    ############\n    # [required]\n    # PostgreSQL database user password\n    ############\n\n    POSTGRES_PASSWORD=your-super-secret-postgres-password\n\n    ############\n    # [required]\n    # Flowise - authentication configuration\n    ############\n\n    FLOWISE_PASSWORD=your-super-secret-flowise-password\n\n    ############\n    # [required]\n    # Neo4j - username and password combination\n    ############\n\n    NEO4J_AUTH=neo4j-user/your-super-secret-password\n\n    ############\n    # [required]\n    # Langfuse credentials\n    ############\n\n    CLICKHOUSE_PASSWORD=your-super-secret-password-1\n    MINIO_ROOT_PASSWORD=your-super-secret-password-2\n    LANGFUSE_SALT=your-super-secret-key-1   # use OpenSSL\n    NEXTAUTH_SECRET=your-super-secret-key-2 # use OpenSSL\n    ENCRYPTION_KEY=your-super-secret-key-3  # use OpenSSL\n\n    ############\n    # [required for production]\n    # Caddy Config\n    ############\n\n    # N8N_HOSTNAME=n8n.yourdomain.com\n    # WEBUI_HOSTNAME=openwebui.yourdomain.com\n    # FLOWISE_HOSTNAME=flowise.yourdomain.com\n    # SUPABASE_HOSTNAME=supabase.yourdomain.com\n    # LANGFUSE_HOSTNAME=langfuse.yourdomain.com\n    # OLLAMA_HOSTNAME=ollama.yourdomain.com\n    # LLAMACPP_HOSTNAME=llama.cpp.yourdomain.com\n    # SEARXNG_HOSTNAME=searxng.yourdomain.com\n    # NEO4J_HOSTNAME=neo4j.yourdomain.com\n    # LETSENCRYPT_EMAIL=internal\n\n    ...\n\n    ############\n    # Logs - Configuration for Analytics\n    # Please refer to https://supabase.com/docs/reference/self-hosting-analytics/introduction\n    ############\n\n    # Change vector.toml sinks to reflect this change\n    # these cannot be the same value\n    LOGFLARE_PUBLIC_ACCESS_TOKEN=your-super-secret-and-long-logflare-key-public\n    LOGFLARE_PRIVATE_ACCESS_TOKEN=your-super-secret-and-long-logflare-key-private\n\n    ...\n    ```\n\n   \u003c/details\u003e\n\n4. Review and update the other `.env` environment variables taking into account\n   your installation platform specifications. Particularly pay attention to the\n   _Ollama_ or _LLaMA.cpp_ (depending on which LLM you are using) configuration\n   settings.\n\n    \u003cdetails\u003e\n    \u003csummary\u003eOllama .env configuration\u003c/summary\u003e\n\n    ```ini\n    ############\n    # Ollama - LLM\n    ############\n\n    OLLAMA_PORT=11434\n\n    # When running Ollama in the Host:\n    #OLLAMA_HOST=host.docker.internal:11434\n    # When running Ollama in Docker:\n    #OLLAMA_HOST=ollama:11434\n    OLLAMA_HOST=host.docker.internal:11434\n\n    # Tuning\n    OLLAMA_CONTEXT_LENGTH=8192\n    OLLAMA_FLASH_ATTENTION=1\n    OLLAMA_KV_CACHE_TYPE=q4_0\n    OLLAMA_MAX_LOADED_MODELS=2\n\n    # Models\n    OLLAMA_DEFAULT_MODEL=llama3.2\n    OLLAMA_SUPPLEMENT_MODEL=qwen3:8b\n    OLLAMA_EMBEDDING_MODEL=nomic-embed-text\n\n    # Ollama server arguments - use ollama serve --help for available 'serve' arguments\n    OLLAMA_SERVER_ARGS=serve\n\n    ############\n    # LLAMA (Ollama/LLaMA.cpp) - Shared environment variables\n    ############\n\n    # Application Installation path\n    # Set for LLaMA.cpp or if using custom Ollama installation path\n    # e.g. LLAMA_PATH=~\\Projects\\ai-suite\\llama.cpp\\bin\\llama-server.exe\n    # Omit '\u003cvalue\u003e' to return 'False' when queried\n    LLAMA_PATH=\n    ```\n\n    \u003c/details\u003e\n\n    \u003cdetails\u003e\n    \u003csummary\u003eLLaMA.cpp .env configuration\u003c/summary\u003e\n\n    ```ini\n    ############\n    # LLaMA.cpp - LLM\n    ############\n\n    LLAMA_ARG_PORT=8040\n\n    # When running LLaMA.cpp in the host:\n    #LLAMA_ARG_HOST=host.docker.internal\n    # When running LLaMA.cpp in Docker:\n    #LLAMA_ARG_HOST=0.0.0.0\n    LLAMA_ARG_HOST=0.0.0.0\n\n    # Backend connect\n    LLAMACPP_HOST=${LLAMA_ARG_HOST}:${LLAMA_ARG_PORT}\n\n    # Model names - Dictionary keys for model download identifier values below.\n    # Keys, and values below include an empty slot for a user-defined model\n    LLAMACPP_MODEL_GEMMA=gemma-4b  # Default\n    LLAMACPP_MODEL_DEEPSEEK=deepseek-7b\n    LLAMACPP_MODEL_MISTRAL=mistral-7b\n    LLAMACPP_MODEL_LLAMA=llama-8b\n    LLAMACPP_MODEL_QWEN=qwen-8b\n    LLAMACPP_MODEL_USER=\n\n    # Model download identifier - Dictionary values for model keys above.\n    # Model selected by 'best match' to LLAMACPP_MODEL_NAME\n    # To specify a local model, change '-hf' to '-m' in LLAMACPP_SERVER_ARGS below\n    # and replace the respective model id value below with 'models/\u003cmodel filename\u003e'.\n    LLAMACPP_MODEL_GEMMA_ID=ggml-org/gemma-3-4b-it-GGUF\n    LLAMACPP_MODEL_DEEPSEEK_ID=mradermacher/DeepSeek-R1-Distill-Qwen-7B-Uncensored-i1-GGUF\n    LLAMACPP_MODEL_MISTRAL_ID=bartowski/mistralai_Ministral-3-8B-Instruct-2512-GGUF\n    LLAMACPP_MODEL_LLAMA_ID=bartowski/allura-forge_Llama-3.3-8B-Instruct-GGUF\n    LLAMACPP_MODEL_QWEN_ID=bartowski/Qwen_Qwen3-8B-GGUF\n    LLAMACPP_MODEL_USER_ID=\n\n    # Model and paths\n    LLAMACPP_PATH=llama.cpp\n    LLAMACPP_MODEL_NAME=${LLAMACPP_MODEL_GEMMA}  # IMPORTANT: should reasonably match Dictionary model name above.\n    LLAMACPP_MODELS_DIR=${LLAMACPP_PATH}/models\n    LLAMACPP_MODEL_PATH=${LLAMACPP_MODELS_DIR}/${LLAMACPP_MODEL_NAME}\n\n    # Model management - automatically download specified model if not downloaded.\n    LLAMA_ARG_HF_REPO=${LLAMACPP_MODEL_GEMMA_ID}\n\n    # Tuning\n    LLAMA_ARG_CTX_SIZE=8192\n    LLAMA_ARG_FLASH_ATTN=1\n    LLAMA_ARG_N_GPU_LAYERS=0\n    LLAMA_ARG_THREADS=4\n    LLAMA_ARG_MODELS_MAX=4\n\n    # LLaMA.cpp server arguments - use 'llama-server --help' for available arguments\n    # To specify a local model, append '-m' or '––model'.\n    # To auto-download model (if not already downloaded) and if LLAMA_ARG_HF_REPO is\n    # not used (commented), append '-hf' or '--hf-file'.\n    LLAMACPP_SERVER_ARGS=--jinja\n    ```\n\n    \u003c/details\u003e\n\n\u003e [!IMPORTANT]\n\u003e Make sure to generate secure random values for all secrets. Never use the\n\u003e example values in production.\n\n---\n\n### Step 2: Run the setup script\n\n**AI-Suite** uses the `suite_services.py` script for the _installation_ command\nthat handles the AI-Suite functional module selection, **LLAMA** (_Ollama_/_LLaMA.cpp_)\nCPU/GPU configuration, and starting Supabase and Open WebUI Filesystem when specified.\n\nAdditionally, this script is used to perform _operational_ actions such as stopping\nor pausing the running suite stack and updating its container images.\n\n\u003e [!NOTE]\n\u003e The following example commands will use the `n8n` and `OpenCode` functional\n\u003e modules. Simply substitute these modules for your desired options if you elect\n\u003e to use these examples in your environment.\n\n---\n\n#### The _profile_ command arguments\n\nBoth installation and operation commands utilize the optional `--profile`\narguments to specify which AI-Suite functional modules and which **LLAMA** CPU/GPU\nconfiguration to use. When no functional profile argument is specified, the\ndefault functional module `open-webui` is used, Likewise, if no CPU/GPU configuration\nprofile argument is specified, it is assumed LLAMA is being run from the **Host**.\n**Multiple profile arguments for functional modules are supported**.\n\n`suite_services.py` `--profile` functional module arguments\n\n| Argument | Functional Module |\n| -----------------------: | ------: |\n| `n8n` | n8n - automation platform |\n| `opencode` | OpenCode - low-code, no-code agent |\n| `open-webui` | Open WebUI - chatbot interface |\n| `open-webui-mcpo` | Open WebUI MCPO - MCP to OpenAPI translator |\n| `open-webui-pipe` | Open WebUI Pipelines - agent tools and functions |\n| `flowise` | Flowise - complementary agent builder |\n| `supabase` | Supabase - alternative database |\n| `searxng` | SearXNG - internet metasearch |\n| `langfuse` | Langfuse - agent observability platform |\n| `neo4j` | Neo4j - knowledge graph |\n| `caddy` | Caddy - managed https/tls server |\n| `n8n-all` | n8n - complete bundle |\n| `open-webui-all` | Open WebUI - complete bundle |\n| `ai-all` | AI-Suite full stack - all modules |\n\n`suite_services.py` `--profile` LLAMA CPU/GPU in Docker argument:\n\n| Argument | LLAMA CPU/GPU |\n| -----------------------: | ------: |\n| `cpu` | Ollama - run on CPU |\n| `gpu-nvidia` | Ollama - run on Nvidia GPU |\n| `gpu-amd` | Ollama - run on AMD GPU |\n| `cpp-cpu` | LLaMA.cpp - run on CPU |\n| `cpp-gpu-nvidia` | LLaMA.cpp - run on Nvidia GPU |\n| `cpp-gpu-amd` | LLaMA.cpp - run on AMD GPU |\n\nExample command:\n\n```powershell\n# Ollama\npython suite_services.py --profile n8n opencode gpu-nvidia\n# LLaMA.cpp\npython suite_services.py --profile n8n opencode cpp-gpu-nvidia\n```\n\n`suite_services.py` `--profile` LLAMA running on Host argument:\n\n| Argument | LLAMA CPU/GPU |\n| -----------------------: | ------: |\n| `ollama` | Ollama - run on Host (Default) |\n| `llama.cpp` | LLaMA.cpp - run on Host |\n\nExample command:\n\n```powershell\n# Ollama - As the default LLAMA option, the argument is not required\npython suite_services.py --profile n8n opencode\n# LLaMA.cpp\npython suite_services.py --profile n8n opencode llama.cpp\n```\n\n---\n\nIf you intend to install **Supabase**, before running `suite_services.py`, setup\nthe Supabase environment variables using their [self-hosting guide](https://supabase.com/docs/guides/self-hosting/docker#securing-your-services).\n\n#### For Docker LLAMA with Nvidia GPU users\n\n```powershell\n# Ollama\npython suite_services.py --profile gpu-nvidia n8n opencode\n# LLaMA.cpp\npython suite_services.py --profile cpp-gpu-nvidia n8n opencode\n```\n\n\u003e [!NOTE]\n\u003e If you have not used your Nvidia GPU with Docker before, please follow the\n\u003e [Ollama Docker instructions](https://github.com/ollama/ollama/blob/main/docs/docker.mdx).\n\u003e [LLaMA.cpp Docker instructions](https://github.com/ggml-org/llama.cpp/blob/master/docs/docker.md)\n\n#### For Docker LLAMA with AMD GPU users\n\n```powershell\n# Ollama\npython suite_services.py --profile gpu-amd n8n opencode\n# LLaMA.cpp\npython suite_services.py --profile cpp-gpu-amd n8n opencode\n```\n\n#### For LLAMA on Mac running Apple Silicon users\n\nIf you're using a Mac with an M1 or newer processor, you cannot expose your GPU\nto the Docker instance, unfortunately. There are two options in this case:\n\n1. Run ai-suite fully on CPU:\n\n   ```powershell\n   # Ollama\n   python suite_services.py --profile cpu n8n opencode\n   # LLaMA.cpp\n   python suite_services.py --profile cpp-cpu n8n opencode\n   ```\n\n2. Run LLAMA on your Host for faster inference, and connect to that from the\n   n8n instance:\n\n   ```powershell\n   # Ollama\n   python suite_services.py --profile n8n opencode\n   # LLaMA.cpp\n   python suite_services.py --profile n8n opencode llama.cpp\n   ```\n\n   If you want to run LLAMA on your Mac, check the [Ollama homepage](https://ollama.com/)\n   or [LLaMA.cpp install](https://github.com/ggml-org/llama.cpp/blob/master/docs/install.md)\n   for installation instructions.\n\n#### For LLAMA running on the Host users\n\nIf you're running LLAMA on your Host (not in Docker), the `suite_services.py`\nscript will automatically set your `OLLAMA_HOST`/`LLAMA_ARG_HOST` environment\nvariable in the `.env` file. Using interpolation, these settings will also be set\nfor the n8n service configuration.\n\nTo manually configure the **Ollama** settings and update the x-n8n section in\nyour `.env` file:\n\n\u003cdetails\u003e\n\u003csummary\u003eManual Ollama .env Host configuration\u003c/summary\u003e\n\n```ini\nOLLAMA_HOST=host.docker.internal:11434\n#OLLAMA_HOST=ollama:11434\n\n# ... other configurations ...\n\n# When running Ollama in the Host and Open WebUI in Docker:\nOLLAMA_BASE_URL=http://host.docker.internal:11434\n#OLLAMA_BASE_URL=http://localhost:11434\n```\n\n... or youe Docker Compose file:\n\n```yaml\nx-n8n: \u0026service-n8n\n  # ... other configurations ...\n  environment:\n    # ... other environment variables ...\n    - OLLAMA_HOST=host.docker.internal:11434\n```\n\n\u003c/details\u003e\n\nThe `suite_services.py` script will similiarly set the `OPENAI_API_BASE_URL`\nenvironment variable to use the _HOST_ and _PORT_ of the selected LLAMA LLM\n(_Ollama_/_LLaMA.cpp_). This option will enable n8n backend connections to\n**LLaMA.cpp**.\n\n\u003cdetails\u003e\n\u003csummary\u003eManual LLaMA.cpp .env Host configuration\u003c/summary\u003e\n\n```ini\nLLAMA_ARG_PORT=8040\n\n# When running LLaMA.cpp in the host:\n#LLAMA_ARG_HOST=host.docker.internal\n# When running LLaMA.cpp in Docker:\n#LLAMA_ARG_HOST=0.0.0.0\nLLAMA_ARG_HOST='host.docker.internal'\n\n# Backend connect\nLLAMACPP_HOST=${LLAMA_ARG_HOST}:${LLAMA_ARG_PORT}\n\n# ... other configurations ...\n\n# Conecting to LLAMA using OpenAI API connection\n# When running Ollama:    ${OLLAMA_HOST}\n# When running LLaMA.cpp: ${LLAMA_ARG_HOST}:${LLAMA_ARG_PORT}\nOPENAI_API_BASE_URL='${LLAMACPP_HOST}'\n```\n\n\u003c/details\u003e\n\n#### For everyone else (...using CPU)\n\n```powershell\n# Ollama\npython suite_services.py --profile n8n opencode cpu\n# LLaMA.cpp\npython suite_services.py --profile n8n opencode cpp-cpu\n```\n\n\u003e [!NOTE]\n\u003e Script examples beyond this point will use _Ollama_ or _LLaMA.cpp_ interchangeably.\n\n---\n\n#### The _operation_ command argument\n\nThere are also operation commands that _start_, _stop_, _stop-llama_, _pause_,\n_unpause_, _update_ and _install_ the AI-Suite services using the optional\n`--operation` argument. A **LLAMA** (_Ollama_/_LLaMA.cpp_) check is performed when\nit is assumed LLAMA is running from the Host. If **LLAMA** is determined to be\ninstalled but not running, an attempt to launch the Ollama/LLaMA.cpp service\nis executed on _install_, _start_ and _unpause_. The check will also attempt to\n_stop_ the running LLAMA service (in addition to stopping the AI-Suite services)\nwhen the _stop-llama_ operational command argument is specified.\n\n`suite_services.py` ... `--operation` argument:\n\n| Argument | Operation |\n| -----------------------: | ------: |\n| `start` | Start - start the previously stopped, specified profile containers |\n| `stop` | Stop - shut down the specified profile containers |\n| `stop-llama` | Stop - perform `stop` and shut down Ollama/LLaMA.cpp on Host |\n| `pause` | Pause - pause the specified profile containers |\n| `unpause` | Unpause - unpause the previously paused profile containers |\n\nExample command:\n\n```powershell\n# Ollama\npython suite_services.py --profile n8n opencode gpu-nvidia --operation stop\n# LLaMA.cpp\npython suite_services.py --profile n8n opencode llama.cpp --operation stop-llama\n```\n\n---\n\n#### The _environment_ command argument\n\nThe `--environment` command allows the installation to be defined as _private_\n(default) or _public_. A public install restricts the communication ports exposed\nto the network.\n\nThe `suite_services.py` script supports the `private` (default) and `public`\nenvironment argument:\n\n- **private:** you are deploying the stack in a safe environment, all AI-Suite\nports are accessible\n- **public:** the stack is deployed in a public environment, all AI-Suite ports\nexcept _80_ and _443_ are closed\n\n`suite_services.py` ... `--environment` argument:\n\n| Argument | Scope |\n| -----------------------: | ------: |\n| `private` | Private network |\n| `public` | Public network |\n\nExample command:\n\nThe AI-Suite stack initialized with...\n\n```powershell\npython suite_services.py --profile n8n opencode cpp-cpu --environment private\n```\n\nis equal to being initialized with:\n\n```powershell\npython suite_services.py --profile gpu-nvidia\n```\n\n#### The _log_ command argument\n\nThe `suite_services.py` script enables stream (console) logging and setting the\nlogging level. File logging is always enabled at **DEBUG** and is not affected\nby this argument. The default console logging level is **INFO**.\n\nenvironment argument:\n\n`suite_services.py` ... `--log` argument:\n\n| Argument | Scope |\n| -----------------------: | ------: |\n| `OFF` | Console logging is disabled |\n| `DEBUG` | Debug logging level |\n| `INFO` | Standard output logging level |\n| `WARNING` | Warning logging level |\n| `ERROR` | Error logging level |\n| `CRITICAL` | Critical logging level |\n\nExample command:\n\n```powershell\npython suite_services.py --profile n8n opencode cpp-cpu --operation update --log DEBUG\n```\n\n---\n\n## Deploying to the Cloud\n\n### Prerequisite\n\n- Linux machine (preferably Unbuntu) with Nano, Git, and Docker installed\n\n### Extra steps\n\nBefore running the above commands to pull the repo and install everything:\n\n\u003e [!WARNING]\n\u003e ufw does not shield ports published by Docker, because the iptables rules\n\u003e configured by Docker are analyzed before those configured by ufw. There is a\n\u003e solution to change this behavior, but that is out of scope for this project.\n\u003e Just make sure that all traffic runs through the Caddy service via port _443_.\n\u003e Port _80_ should only be used to redirect to port _443_.\n\n1. Run the commands as root to open up the necessary ports:\n\n    ```bash\n    ufw enable\n    ufw allow 80 \u0026\u0026 ufw allow 443\n    ufw reload\n    ```\n\n2. Run the `suite_services.py` script with the environment argument **public**\n   to indicate you are going to run the package in a public environment. The\n   script will make sure that all ports, except for _80_ and _443_, are closed\n   down, e.g.\n\n   ```bash\n   python3 suite_services.py --profile gpu-nvidia --environment public\n   ```\n\n3. Set up A records for your DNS provider to point your subdomains you'll set\n   up in the `.env` file for Caddy to the IP address of your cloud instance.\n\n   For example, A record to point n8n to [cloud instance IP] for n8n.yourdomain.com\n\n\u003e [!NOTE]\n\u003e If you are using a cloud machine without the \"docker compose\" command\n\u003e available by default such as a Ubuntu GPU instance on DigitalOcean, run these\n\u003e commands before running suite_services.py:\n\n\u003cdetails\u003e\n\u003csummary\u003eDocker Compose setup commands\u003c/summary\u003e\n\n```bash\nDOCKER_COMPOSE_VERSION=$(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep 'tag_name' | cut -d\\\\\" -f4)\nsudo curl -L \"https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-linux-x86_64\" -o /usr/local/bin/docker-compose\nsudo chmod +x /usr/local/bin/docker-compose\nsudo mkdir -p /usr/local/lib/docker/cli-plugins\nsudo ln -s /usr/local/bin/docker-compose /usr/local/lib/docker/cli-plugins/docker-compose\n```\n\n\u003c/details\u003e\n\n## ⚡️ Quick start and usage\n\nAll components of the self-hosted **AI-Suite**, except if running LLAMA from your\nhost, is installed through `suite_services.py` and managed through a Docker Compose\nfile pre-configured with network and disk so there isn’t much else you need to\ninstall. After completing the installation steps above, follow the steps below\nto get started. First, start with **n8n**.\n\nUse the following settings to confirm or upate **n8n Credentials**.\n\n- Local Ollama service: base URL \u003chttp://ollama:11434/\u003e (n8n config), \u003chttp://localhost:11434/\u003e\n(browser)\n\n- Local LLaMA.cpp service: base URL \u003chttp://llamacpp:8040/\u003e (n8n config), \u003chttp://localhost:8040/\u003e\n(browser)\n\n- Local QdrantApi database: base URL \u003chttp://qdrant:6333/\u003e (n8n config), \u003chttp://localhost:6333/\u003e\n(browser)\n\n- Postgres account: use _POSTGRES_HOST_, _POSTGRES_USER_, and _POSTGRES_PASSWORD_\n  from your `.env` file.\n\n- Google Drive: This credential is optional. Follow [this guide from n8n](https://docs.n8n.io/integrations/builtin/credentials/google/).\n\n- \u003cdetails\u003e\n  \u003csummary\u003eFull list of AI-Suite service endpoints:\u003c/summary\u003e\n\n  | Service | Container | Docker | Host |\n  | -----------------------: | ------: | ------: | ------: |\n  | `n8n` | \u003chttp://n8n:5678\u003e | \u003chttp://host.docker.internal:5678\u003e | \u003chttp://localhost:5678\u003e |\n  | `Open WebUI` | \u003chttp://open-webui:8080/\u003e | \u003chttp://host.docker.internal:8080/\u003e | \u003chttp://localhost:8080/\u003e |\n  | `Opencode` | ./opencode/run_opencode_docker.py | | |\n  | `Flowise` | \u003chttp://flowise:3001/\u003e | \u003chttp://host.docker.internal:3001/\u003e | \u003chttp://localhost:3001/\u003e |\n  | `Open webUI MCPO` | \u003chttp://open-webui-mcpo:8090/\u003e | \u003chttp://host.docker.internal:8090/\u003e | \u003chttp://localhost:8090/\u003e |\n  | `Ollama` | \u003chttp://ollama:11434/\u003e | \u003chttp://host.docker.internal:11434/\u003e | \u003chttp://localhost:11434/\u003e |\n  | `LLaMA.cpp` | \u003chttp://llamacpp:8040\u003e | \u003chttp://host.docker.internal:8040\u003e | \u003chttp://localhost:8040\u003e |\n  | `QDrant` | \u003chttp://qdrant:6333/dashboard\u003e | \u003chttp://host.docker.internal:6333/dashboard\u003e | \u003chttp://localhost:6333/dashboard\u003e |\n  | `Subabase` | \u003chttp://supabase-kong:8000\u003e | \u003chttp://host.docker.internal:8000\u003e | \u003chttp://localhost:8000\u003e |\n  | `Postgres` | \u003chttp://postgres:5432\u003e | \u003chttp://host.docker.internal:5432/\u003e | \u003chttp://localhost:5432/\u003e |\n  | `MCP Gateway` | \u003chttp://mcp-gateway:8060/\u003e | \u003chttp://host.docker.internal:8090/\u003e | \u003chttp://localhost:8060/\u003e |\n  | `Open webUI Filesystem` | \u003chttp://open-webui-filesystem:8091/docs\u003e | \u003chttp://host.docker.internal:8091/docs\u003e | \u003chttp://localhost:8091/docs\u003e |\n  | `Redis` | \u003chttp://redis:6379/\u003e | \u003chttp://host.docker.internal:6379/\u003e | \u003chttp://localhost:6379/\u003e |\n  | `MinIO` | \u003chttp://minio:9001/\u003e | \u003chttp://host.docker.internal:9001/\u003e | \u003chttp://localhost:9001/\u003e |\n  | `Langfuse Web` | \u003chttp://langfuse-web:3000/\u003e | \u003chttp://host.docker.internal:3000/\u003e | \u003chttp://localhost:3000/\u003e |\n  | `Langfuse Worker` | \u003chttp://langfuse-worker:3030/\u003e | \u003chttp://host.docker.internal:3030/\u003e | \u003chttp://localhost:3030/\u003e |\n  | `Logflare` | \u003chttp://supabase-analytics:4000/dashboard\u003e | \u003chttp://host.docker.internal:4000/dashboard\u003e | \u003chttp://localhost:4000/dashboard\u003e |\n  | `ClickHouse` | \u003chttp://clickhouse:8123/\u003e | \u003chttp://host.docker.internal:8123/\u003e | \u003chttp://localhost:8123/\u003e |\n  | `SearXNG` | \u003chttp://searxng:8081/\u003e | \u003chttp://host.docker.internal:8081/\u003e | \u003chttp://localhost:8081/\u003e |\n  | `Neo4j` | \u003chttp://neo4j:7473/\u003e | \u003chttp://host.docker.internal:7473/\u003e | \u003chttp://localhost:7473/\u003e |\n  | `Caddy` | \u003chttp://caddy:443/\u003e | \u003chttp://host.docker.internal:443/\u003e | \u003chttp://localhost:443/\u003e |\n\n  \u003c/details\u003e\n\n\u003e [!IMPORTANT]\n\u003e For **Supabase**, _POSTGRES_HOST_ is 'db' since that is the name of the\n\u003e service running Supabase.\n\u003c!-- --\u003e\n\u003e [!NOTE]\n\u003e If you are running LLAMA on your Host, for the credential _Local Ollama\n\u003e service_, set the base URL to \u003chttp://host.docker.internal:11434/\u003e and set\n\u003e _Local QdrantApi database_ to \u003chttp://host.docker.internal:6333/\u003e. For a\n\u003e LLaMA.cpp service, you can create a _Local LLaMA service_ node using the\n\u003e connection credential \u003chttp://host.docker.internal:8040/\u003e or simply point\n\u003e the _Local Ollama service_ to this credential.\n\u003e\n\u003e Don't use _localhost_ for the redirect URI, instead, use another domain.\n\u003e It will still work!\n\u003e Alternatively, you can set up [local file triggers](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.localfiletrigger/).\n\n1. Open \u003chttp://localhost:5678/\u003e in your browser to initialize and  set up n8n.\n   You’ll only have to set your admin login credentials once. You are NOT creating\n   an account with n8n in the setup here, it is only a local account for your\n   instance!\n\n   - Go to \u003chttp://localhost:5678/home/credentials\u003e to configure credentials.\n   - Click on **Local QdrantApi database** and set the base URL as specified above.\n   - Click on **Local Ollama/LLaMA service** and set the base URL as specified above.\n   - Click on **Create credential**, enter _Postgres_ in the search field and\n     follow the subsequent dialogs to setup the _Postgres account_ as specified\n     above.\n\n2. Open the [Demo workflow](http://localhost:5678/workflow/srOnR8PAY3u4RSwb) and\n   confirm the credentials for _Local Ollama/LLaMA service_ is properly configured.\n\n3. Select **Test workflow** to confirm the workflow is properly configured.\n   If this is the first time you’re running the workflow, you may need to wait\n   until Ollama finishes downloading the specified model. You can inspect the\n   docker console logs to check on the progress.\n\n4. Toggle the _Demo workflow_ as active and treat the _RAG AI Agent_ workflows.\n\n   \u003cdetails\u003e\n   \u003csummary\u003eConfigure additional n8n workflows as desired:\u003c/summary\u003e\n\n   [V1 Local RAG AI Agent](\u003chttp://localhost:5678/workflow/vTN9y2dLXqTiDfPT\u003e)\n\n   [V2 Qdrant RAG AI Agent](\u003chttp://localhost:5678/workflow/hrnPh6dXgIbGVzIk\u003e)\n\n   [V3 Local Agentic RAG AI Agent](\u003chttp://localhost:5678/workflow/RssROpqkXOm23GYL\u003e)\n\n   [V4 Local_Get_Postgres_Tables](\u003chttp://localhost:5678/workflow/t15NIcuhUMXOE8DM\u003e)\n\n   \u003c/details\u003e\n\n5. Next, configure **Open WebUI**. Open \u003chttp://localhost:8080/\u003e in your browser\n   to initialize and set up Open WebUI. You’ll only have to set your admin login\n   credentials once. You are NOT creating an account with Open WebUI in the setup\n   here, it is only a local account for your instance!\n\n6. Go to **Workspace → Functions** to setup the n8n Pipes (Pipeline) function.\n   This function will enable integration with n8n as an entry in your model dropdown\n   list.\n\n   - Click on **New Function**\n   - Enter _n8n Pipeline_ at **Function Name** and **Function ID** will auto-populate\n     with _n8n_Pipeline_\n   - Enter _An optimized streaming-enabled pipeline for interacting with n8n workflows_\n     in **Description**\n   - Copy the _n8n_Pipeline function_ code at [n8n.py](https://github.com/owndev/Open-WebUI-Functions/blob/main/pipelines/n8n/n8n.py)\n     (or the downloaded instance at `./open-webui/functions/owndev/pipelines/n8n/n8n.py`)\n     and paste it into the edit dialog.\n\n7. Copy the webhook URL from the _n8n_Pipeline_ function set in step 6.\n\n8. Click on the gear icon and set the n8n_url to the webhook URL you copied\n   in a previous step.\n\n9. Toggle the function on and now it will be available in your model dropdown\n   in the top left.\n\nTo open **n8n**, visit \u003chttp://localhost:5678/\u003e from your browser.\n\nTo open **Open WebUI**, visit \u003chttp://localhost:3000/\u003e from your browser.\n\nTo open **OpenCode** run `./opencode/run_opencode_docker.py` from a new terminal.\n\n## Additional Configuration\n\nWith **n8n**, you have access to over **400** integrations and a suite of basic\nand advanced AI nodes such as:\n[AI Agent](https://docs.n8n.io/integrations/builtin/cluster-nodes/root-nodes/n8n-nodes-langchain.agent/),\n[Text classifier](https://docs.n8n.io/integrations/builtin/cluster-nodes/root-nodes/n8n-nodes-langchain.text-classifier/),\nand [Information Extractor](https://docs.n8n.io/integrations/builtin/cluster-nodes/root-nodes/n8n-nodes-langchain.information-extractor/)\nnodes.\n\nTo keep everything local, use the **Ollama**/**LLaMA.cpp** node for your language\nmodel and **Qdrant** as your vector store.\n\n\u003e [!NOTE]\n\u003e AI-Suite is designed to help you get started with self-hosted AI\n\u003e workflows. While it is not fully optimized for production environments, it\n\u003e combines robust components that work well together for personal porjects.\n\u003e Of course, you can further customize it to meet your specific needs.\n\n### PROJECTS_PATH environment variable\n\nYou can use the `PROJECTS_PATH` environment variable to allow **n8n**,\n**OpenCode**, and **Open WebUI Filesystem** access to your project files.\nDuring the installation process, if the key is not already present (or has no\nvalue) in your `.env` file, the key and value are written to the working\nenvironment variables with the value set to `~/projects`. You can override this\nbehaviour by manually setting your desired path for this key in the .env file.\n\n`PROJECTS_PATH` forms a volume _bind mount_ to container paths for the functional\nmodules described above:\n\n| Module | Container | Bind Mount |\n| ---------: | -----------: | ------: |\n| n8n | n8n | `/home/node/projects` |\n| OpenCode | opencode | `/root/projects` |\n| Open WebUI Tool Filesystem | open-webui-filesystem | `/nonexistent/tmp` |\n\n### n8n\n\n- **MCP Client**\n  - Configure MCP Client credentials.\n\n    - In **Nodes panel**, search for `MCP`.\n    - Select `MCP Client`.\n    - Set _MCP Endpoint URL_: `http://host.docker.internal:8060`.\n\n- **MCP Client (node)**\n\n  - Install community nodes - You may need to restart container.\n\n    - Go to **Settings → Community nodes**\n    - Use npm _Package Name_: _n8n-nodes-mcp_.\n    - Install node.\n\n  - Configure MCP Client (node) credentials.\n\n    - In **Nodes panel**, search for `MCP`.\n    - Select `MCP Client (node)`.\n    - In the node settings, select _Connection Type_: `HTTP Streamable`.\n    - Create new credentials of type _MCP Client (HTTP Streamable) API_.\n    - Set _HTTP Streamable URL_: `http://host.docker.internal:3001/stream`.\n    - Add any required headers for authentication.\n\n### Open WebUI\n\n- **MCPO**\n\n  - Your MCP tool is available at \u003chttp://host.docker.internal:8090\u003e.\n  - Test it live at \u003chttp://host.docker.internal:8090/docs\u003e.\n  - Using the config file [./open-webui/mcpo/config.json](./open-webui/mcpo/config.json),\n    set additional configuration settings as desired.\n  - As we are using the config file _config.json_, each tool will be accessible\n    under its own unique route, e.g. \u003chttp://host.docker.internal:8090/MCP_DOCKER\u003e.\n\n- **Locally available functions**\n\n  Pipes:\n\n  - \u003cdetails\u003e\n    \u003csummary\u003en8n\u003c/summary\u003e\n\n    ```sh\n    ./open-webui/functions/owndev/pipelines/n8n/\n    ```\n\n    \u003c/details\u003e\n\n  - \u003cdetails\u003e\n    \u003csummary\u003eAnthropic\u003c/summary\u003e\n\n    ```sh\n    ./open-webui/functions/open-webui/functions/pipes/anthropic/\n    ```\n\n    \u003c/details\u003e\n\n  - \u003cdetails\u003e\n    \u003csummary\u003eOpen AI\u003c/summary\u003e\n\n    ```sh\n    ./open-webui/functions/open-webui/functions/pipes/openai/\n    ```\n\n    \u003c/details\u003e\n\n  Filters:\n\n  - \u003cdetails\u003e\n    \u003csummary\u003eVarious filters\u003c/summary\u003e\n\n    ```sh\n    ./open-webui/functions/owndev/filters/\n    ```\n\n    \u003c/details\u003e\n\n  - \u003cdetails\u003e\n    \u003csummary\u003eAgent hotswap\u003c/summary\u003e\n\n    ```sh\n    ./open-webui/functions/open-webui/functions/filters/agent_hotswap/\n    ```\n\n    \u003c/details\u003e\n\n  - \u003cdetails\u003e\n    \u003csummary\u003eContext clip\u003c/summary\u003e\n\n    ```sh\n    ./open-webui/functions/open-webui/functions/filters/context_clip/\n    ```\n\n    \u003c/details\u003e\n\n  - \u003cdetails\u003e\n    \u003csummary\u003eDynamic vision router\u003c/summary\u003e\n\n    ```sh\n    ./open-webui/functions/open-webui/functions/filters/dynamic_vision_router/\n    ```\n\n    \u003c/details\u003e\n\n  - \u003cdetails\u003e\n    \u003csummary\u003eMax turns\u003c/summary\u003e\n\n    ```sh\n    ./open-webui/functions/open-webui/functions/filters/max_turns/\n    ```\n\n    \u003c/details\u003e\n\n  - \u003cdetails\u003e\n    \u003csummary\u003eModeration\u003c/summary\u003e\n\n    ```sh\n    ./open-webui/functions/open-webui/functions/filters/moderation/\n    ```\n\n    \u003c/details\u003e\n\n  - \u003cdetails\u003e\n    \u003csummary\u003eSummarizer\u003c/summary\u003e\n\n    ```sh\n    ./open-webui/functions/open-webui/functions/filters/summarizer/\n    ```\n\n  \u003c/details\u003e\n\n  - Manual Configuration.\n\n    - Navigate to the _locally available functions_ folder containing your desired\n      function `.py` file.\n    - Copy the complete code from the function file (e.g. main.py)\n    - Add as a new Function in **OpenWebUI → Admin Panel → Functions**\n    - Configure function-specific settings as needed - follow function README for\n      details.\n    - Enable the Function (also be sure to enable to Agent Swapper Icon in chat)\n\n- **Filesystem** (Server Tool)\n\n  - Your Filesystem server is available at \u003chttp://host.docker.internal:8091/docs\u003e.\n\n- **Pipelines**\n\n  - Connect to Open WebUI.\n\n    - Navigate to the **Settings → Connections → OpenAI API** section in Open WebUI.\n    - Set the _API URL_ to `http:\\\\host.docker.internal:9099` and the _API key_\n      to `0p3n-w3bu!`. Your pipelines should now be active.\n\n  - Manage Configurations.\n\n    - In the _admin panel_, go to **Admin Settings → Pipelines tab**.\n    - Select your desired pipeline and modify the valve values directly from WebUI.\n\n### Open Code\n\n- **run_opencode_docker.py**\n\n  - Copy `./opencode/run_opencode_docker.py` to or run it from your current work\n    project.\n\n- **opencode.jsonc**\n\n  - Using the config file at [./opencode/opencode.jsonc](./opencode/opencode.jsonc)\n  - Set additional configuration settings as desired.\n\n- **PROJECT_PATH environment variable**\n\n  - Set the `PROJECT_PATH` env variable to your working project directory before\n    running OpenCode if you wish to set the work path to your current project but\n    you will _NOT_ launch OpenCode from the root of your working project.\n    If the `PROJECT_PATH` var is not defined, the currend working directory from\n    which OpenCode was launched is assumed.\n\n- **project_path argument**\n\n  - You can also pass a _project_path_ argument to `./opencode/run_opencode_docker.py`\n    with `-p`, `--project_path` so an example command would be:\n\n    ```powershell\n    python run_opencode_docker.py --project_path 'opencode'\n    ```\n\n\u003e [!NOTE]\n\u003e It is recommended that your working project directory be within and relative to\n\u003e the path set for `PROJECTS_PATH` in the AI-Suite `.env` file - see\n\u003e **PROJECTS_PATH environment variable** section described above.\n\u003e\n\u003e **Important**: The format of the `PROJECT_PATH` entry must be the portion of\n\u003e your project path that is relative to the entry specified in `PROJECTS_PATH`.\n\u003e For example, if the _full path_ to your project is `~/projects/ai-suite/opencode`\n\u003e , your `PROJECT_PATH` entry must be `ai-suite/opencode`, if your `PROJECTS_PATH`\n\u003e entry is `~/projects`.\n\u003e\n\u003e When set, `PROJECT_PATH` is appended to the OpenCode container bind mounted\n\u003e path `/root/projects` and the resulting path is set as _work_dir_ to form the\n\u003e OpenCode Docker exec command's _workdir=work_dir_ keyword argument.\n\n### Ollama or LLaMA.cpp - running on host\n\n- **LLAMA_PATH environment variable**\n\n  - If _Ollama_ is installed in a custom location or you are using _LLaMA.cpp_,\n    Add `LLAMA_PATH` with its absolute path (including the file name) to your\n    _.env_ file.\n\n- **OLLAMA_SERVER_ARGS environment variable**\n\n  - Add _OLLAMA_SERVER_ARGS_ with additional Ollama server process start arguments\n    to your `.env` file.\n\n- **LLAMACPP_MODELS_DIR environment variable**\n\n  - If you are using _LLaMA.cpp_ with models that were **not** downloaded with\n    that instance of _LLaMA.cpp_, add `LLAMACPP_MODELS_DIR` with said models path\n    to your `.env` file.\n\n- **LLAMACPP_SERVER_ARGS environment variable**\n  - Add _LLAMACPP_SERVER_ARGS_ with additional LLaMA.cpp server process start arguments\n    to your `.env` file.\n\n## Upgrading\n\nTo update **AI-Suite** images to their latest versions (n8n, Open WebUI, etc.),\nrun the _update_ operation command argument optionally preceded by the specified\nprofile arguments (functional modules).\nAlternatively, you run the install_ operation argument to perform an update without\nthe confirmation prompt. Using _install_, AI-Suite will assume you are proceeding\nas if performing a new installation - i.e. no previous installation exists.\n\n`suite_services.py` [`--profile` arguments] `--operation` argument:\n\n| Argument | Operation |\n| -----------: | ------: |\n| `update` | Update - for specified containers, stop, pull images, and restart |\n| `install` | Install - proceed as if performing a new installation |\n\n\u003e [!CAUTION]\n\u003e Installation updates can impact the AI-Suite integrity. Consider backing\n\u003e up your volumes to enable rollback. Performing an _install_ will prune both\n\u003e named and anonymous volumes. Volumes are not disturbed when performing\n\u003e an _update_.\n\u003c!-- --\u003e\n\u003e [!NOTE]\n\u003e The `suite_services.py` _update_ operation argument will stop, pull the\n\u003e image and restart containers for the specified `--profile` arguments.\n\u003e However, to update the entire suite, simply omit the profile arguments.\n\u003e\n\u003e If no profile arguments are specified, container images for all functional\n\u003e modules plus Docker LLAMA (_Ollama_/_LLaMA.cpp_) will be _pulled_ but only\n\u003e functional module containers (n8n, Open WebUI, OpenCode etc.) will be\n\u003e _started_. Docker LLAMA containers will not be started unless they are\n\u003e explicitly specified as a profile argument.\n\nExample command to full update:\n\n```powershell\npython suite_services.py --operation update\n```\n\nExample command for full (new) install with Docker Ollama running on CPU:\n\n```powershell\npython suite_services.py --profile ai-all cpu --operation install\n```\n\n### Manual steps to upgrade\n\n- \u003cdetails\u003e\n  \u003csummary\u003eStop services for running containers\u003c/summary\u003e\n\n  ```powershell\n  # Before starting the update, stop services for running containers\n  docker compose -p ai-suite -f docker-compose.yml --profile \u003carguments\u003e down --volumes\n  ```\n\n  \u003c/details\u003e\n\n- \u003cdetails\u003e\n  \u003csummary\u003eUpdate images built locally (Supabase, Open WebUI Filesystem)\u003c/summary\u003e\n\n  ```powershell\n  # First, pull the Supabase GitHub repository\n  cd ai-suite/supabase\n  git pull\n  ```\n\n  \u003c/details\u003e\n\n- \u003cdetails\u003e\n  \u003csummary\u003ePerform the Supabase Docker Compose build\u003c/summary\u003e\n\n  ```powershell\n  # Next, perform the Supabase Docker Compose build\n  # Note: If in public environment, add '-f ../docker-compose.override.public.yml'\n  docker compose -p ai-suite -f docker/docker-compose.yml up -d --build --remove-orphans\n  ```\n\n  \u003c/details\u003e\n\n- \u003cdetails\u003e\n  \u003csummary\u003ePull the Open WebUI Tools Fileserver repository\u003c/summary\u003e\n\n  ```powershell\n  # Next, pull the Open WebUI Tools Fileserver\n  cd ../open-webui/tools\n  git pull\n  ```\n\n  \u003c/details\u003e\n\n- \u003cdetails\u003e\n  \u003csummary\u003ePerform the, Fileserver Docker Compose build\u003c/summary\u003e\n\n  ```powershell\n  # Next, perform the, Fileserver Docker Compose build\n  # Note: If in public environment, add '-f ../../../../docker-compose.override.public.yml'\n  docker compose -p ai-suite -f servers/filesystem/compose.yaml up -d --build --remove-orphans\n  ```\n\n  \u003c/details\u003e\n\n- \u003cdetails\u003e\n  \u003csummary\u003eReturn to AI-Suite root directory\u003c/summary\u003e\n\n  ```powershell\n  # Return to AI-Suite root directory\n  cd ../../\n  ```\n\n  \u003c/details\u003e\n\n- \u003cdetails\u003e\n  \u003csummary\u003ePull latest versions of container images\u003c/summary\u003e\n\n  ```powershell\n  # Pull latest versions of container images for specified profile arguments\n  docker compose -p ai-suite -f docker-compose.yml --profile \u003carguments\u003e pull\n  ```\n\n  \u003c/details\u003e\n\n- \u003cdetails\u003e\n  \u003csummary\u003eStart services again for specified profile arguments\u003c/summary\u003e\n\n  ```powershell\n  # Start services again for specified profile arguments\n  # Note: If in public environment, replace 'docker-compose.override.private.yml' with 'docker-compose.override.public.yml'\n  docker compose -p ai-suite -f docker-compose.yml -f docker-compose.override.private.yml --profile \u003carguments\u003e up -d --build --remove-orphans\n  ```\n\n  \u003c/details\u003e\n\nReplace profile `\u003carguments\u003e` with `ai-all` to update all container images or\nwith your desired functional modules, e.g. `n8n`, `opencode` etc, plus your CPU/GPU\nargument [`cpu` | `gpu-nvidia` | `gpu-amd`] if you are running Ollama in Docker.\nSee the profile arguments table above for all arguments.\n\n## Accessing local files\n\nSome **AI-Suite** functional modules require access to a project workspace, a\nshared data folder and/or its configuration file located on the Docker host.\nThese resources are mounted from the host to the module container the using a\nDocker Compose _volume_ _bind mount_.\n\n\u003cdetails\u003e\n\u003csummary\u003eAI-Suite Docker Compose bind mounts\u003c/summary\u003e\n\n```yaml\n\u003ccontainer\u003e:\n   - \u003chost path\u003e:\u003ccontainer path\u003e[:\u003cread/write access\u003e]\n```\n\n**n8n** creates a `shared` folder located at `/data/shared` - use this path in\nnodes that interact with the host filesystem. Additional folders include the\n`n8n-files` folder located at `/home/node/.n8n-files`, the `projects` folder\nlocated at `/home/node/projects` and the `data` folder located at `/data`.\nThe host root path is `./n8n/data`.\n\n```yaml\nn8n:\n   - ./n8n/local-files:/home/node/.n8n-files\n   - ./n8n/data:/data\n   - ${PROJECTS_PATH:-./n8n/local-files}:/home/node/projects\n\nn8n-import:\n   - ./n8n/data:/data\n```\n\n**Open WebUI MCPO** OpenAPI configuration file.\n\n```yaml\nopen-webui-mcpo:\n   - ./open-webui/mcpo/config.json:/app/config.json\n```\n\n**Open WebUI Filesystem** local project files access.\n\n```yaml\nopen-webui-filesystem:\n   - ${PROJECTS_PATH:-../shared}:/nonexistent/tmp\n```\n\n**Open WebUI Pipelines** shared files access.\n\n```yaml\nopen-webui-pipelines:\n   - ./open-webui/piplines:/root/.pipelines\n```\n\n**OpenCode** configuration file and local project files access.\n\n```yaml\nopencode:\n   - ./opencode/opencode.jsonc:/root/.config/opencode/opencode.jsonc\n   - ${PROJECTS_PATH:-./opencode}:/root/projects\n```\n\n**Flowise** shared files access.\n\n```yaml\nflowise:\n   - ./flowise:/root/.flowise\n```\n\n**SearXNG** shared files access.\n\n```yaml\nsearxng:\n   - ./searxng:/etc/searxng:rw\n```\n\n**Caddy** configuration file and addond folder access.\n\n```yaml\ncaddy:\n   - ./caddy/Caddyfile:/etc/caddy/Caddyfile:ro\n   - ./caddy/addons:/etc/caddy/addons:ro\n```\n\n\u003c/details\u003e\n\n### n8n Nodes that interact with the local filesystem\n\n- [MCP Client](https://docs.docker.com/ai/mcp-catalog-and-toolkit/dynamic-mcp/)\n- [MCP Client (node)](https://modelcontextprotocol.io/docs/getting-started/intro/)\n- [Read/Write Files from Disk](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.filesreadwrite/)\n- [Local File Trigger](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.localfiletrigger/)\n- [Execute Command](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.executecommand/)\n\n## Troubleshooting\n\nHere are solutions to common issues you might encounter:\n\n### Supabase Issues\n\n- **Supabase Pooler Restarting**: If the supabase-pooler container keeps\n  restarting itself, follow the instructions in [this GitHub issue](https://github.com/supabase/supabase/issues/30210#issuecomment-2456955578).\n\n- **Supabase Analytics Startup Failure**: If the supabase-analytics container\n  fails to start after changing your Postgres password, delete the folder `supabase/docker/volumes/db/data`.\n\n- **If using Docker Desktop**: Go into the Docker settings and make sure\n  \"Expose daemon on tcp://localhost:2375 without TLS\" is turned on\n\n- **Supabase Service Unavailable** - Make sure you don't have an \"@\" character\n  in your Postgres password! If the connection to the kong container is working\n  (the container logs say it is receiving requests from n8n) but n8n says it\n  cannot connect, this is generally the problem from what the community has\n  shared. Other characters might not be allowed too, the @ symbol is just the\n  one I know for sure!\n\n- **SearXNG Restarting**: If the SearXNG container keeps restarting, run the\n  command \"chmod 755 searxng\" within the ai-suite folder so SearXNG has the\n  permissions it needs to create the uwsgi.ini file.\n\n- **Files not Found in Supabase Folder** - If you get any errors around files\n  missing in the supabase/ folder like `.env`, docker/docker-compose.yml, etc. This\n  most likely means you had a \"bad\" pull of the Supabase GitHub repository when\n  you ran the suite_services.py script. Delete the supabase/ folder within the\n  Local AI Package folder entirely and try again.\n\n### GPU Support Issues\n\n- **Windows GPU Support**: If you're having trouble running Ollama with GPU\n  support on Windows with Docker Desktop:\n\n  1. Open Docker Desktop settings\n  2. Ensure 'Enable WSL2 backend' is enabled\n  3. See the [Docker GPU documentation](https://docs.docker.com/desktop/features/gpu/)\n     for more details\n\n- **Linux GPU Support**: If you're having trouble running Ollama with GPU\n  support on Linux, follow the [Ollama Docker instructions](https://github.com/ollama/ollama/blob/main/docs/docker.md).\n\n## 🛍️ More AI templates\n\nFor more AI workflow ideas, visit the [**official n8n AI template\ngallery**](https://n8n.io/workflows/?categories=AI). From each workflow,\nselect the **Use workflow** button to automatically import the workflow into\nyour local n8n instance.\n\n## 👓 Recommended reading\n\nUseful content for deeper understanding AI concepts.\n\n- [AI agents for developers: from theory to practice with n8n](https://blog.n8n.io/ai-agents/)\n- [Tutorial: Build an AI workflow in n8n](https://docs.n8n.io/advanced-ai/intro-tutorial/)\n- [Langchain Concepts in n8n](https://docs.n8n.io/advanced-ai/langchain/langchain-n8n/)\n- [Demonstration of key differences between agents and chains](https://docs.n8n.io/advanced-ai/examples/agent-chain-comparison/)\n\n## 📜 License\n\nThis project (portions of which were adapted from content produced by the n8n\nteam, then Cole Medin, links at the top of the README) is licensed under the\nApache License 2.0 - see the [LICENSE](LICENSE) file for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftrevorsandy%2Fai-suite","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftrevorsandy%2Fai-suite","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftrevorsandy%2Fai-suite/lists"}