Suna 开源 AI Agent 安装配置过程全解析(输出与交互详解)
温馨提示:
本次笔记记录的比较详尽,请结合目录查看,谢谢!
一、完整配置过程一览
(一)交互配置部分
Microsoft Windows [Version 10.0.27871.1000]
(c) Microsoft Corporation. All rights reserved.(suna-py3.12) F:\PythonProjects\suna>python setup.py '--admin'███████╗██╗ ██╗███╗ ██╗ █████╗ ██╔════╝██║ ██║████╗ ██║██╔══██╗███████╗██║ ██║██╔██╗ ██║███████║╚════██║██║ ██║██║╚██╗██║██╔══██║███████║╚██████╔╝██║ ╚████║██║ ██║╚══════╝ ╚═════╝ ╚═╝ ╚═══╝╚═╝ ╚═╝Setup WizardThis wizard will guide you through setting up Suna, an open-source generalist AI agent.Step 1/8: Checking requirements
==================================================✅ git is installed
✅ docker is installed
✅ python3 is installed
✅ poetry is installed
✅ pip3 is installed
✅ node is installed
✅ npm is installed
✅ Docker is running
✅ Suna repository detectedStep 2/8: Collecting Supabase information
==================================================ℹ️ You'll need to create a Supabase project before continuing
ℹ️ Visit https://supabase.com/dashboard/projects to create one
ℹ️ After creating your project, visit the project settings -> Data API and you'll need to get the following information:
ℹ️ 1. Supabase Project URL (e.g., https://abcdefg.supabase.co)
ℹ️ 2. Supabase anon key
ℹ️ 3. Supabase service role key
Press Enter to continue once you've created your Supabase project...
Enter your Supabase Project URL (e.g., https://abcdefg.supabase.co): https://[脱敏].supabase.co
Enter your Supabase anon key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.[脱敏]
Enter your Supabase service role key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.[脱敏]
Step 3/8: Collecting Daytona information
==================================================ℹ️ You'll need to create a Daytona account before continuing
ℹ️ Visit https://app.daytona.io/ to create one
ℹ️ Then, generate an API key from 'Keys' menu
ℹ️ After that, go to Images (https://app.daytona.io/dashboard/images)
ℹ️ Click '+ Create Image'
ℹ️ Enter 'kortix/suna:0.1.3' as the image name
ℹ️ Set '/usr/bin/supervisord -n -c /etc/supervisor/conf.d/supervisord.conf' as the Entrypoint
Press Enter to continue once you've completed these steps...
Enter your Daytona API key: dtn_[脱敏]Step 4/8: Collecting LLM API keys
==================================================ℹ️ You need at least one LLM provider API key to use Suna
ℹ️ Available LLM providers: OpenAI, Anthropic, OpenRouterSelect LLM providers to configure:
[1] OpenAI
[2] Anthropic
[3] OpenRouter (access to multiple models)
Enter numbers separated by commas (e.g., 1,2,3)Select providers (required, at least one): 3
ℹ️
Configuring OPENROUTER
Enter your OpenRouter API key: sk-or-v1-5405[脱敏]Recommended OpenRouter models:
[1] openrouter/google/gemini-2.5-pro-preview
[2] openrouter/deepseek/deepseek-chat-v3-0324:free
[3] openrouter/openai/gpt-4o-2024-11-20
Select default model (1-3) or press Enter for gemini-2.5-flash: 2
✅ Using openrouter/deepseek/deepseek-chat-v3-0324:free as the default modelStep 5/8: Collecting search and web scraping API keys
==================================================ℹ️ You'll need to obtain API keys for search and web scraping
ℹ️ Visit https://tavily.com/ to get a Tavily API key
ℹ️ Visit https://firecrawl.dev/ to get a Firecrawl API key
Enter your Tavily API key: tvly-dev-[脱敏]
Enter your Firecrawl API key: fc-[脱敏]
Are you self-hosting Firecrawl? (y/n): nStep 6/8: Collecting RapidAPI key
==================================================ℹ️ To enable API services like LinkedIn, and others, you'll need a RapidAPI key
ℹ️ Each service requires individual activation in your RapidAPI account:
ℹ️ 1. Locate the service's `base_url` in its corresponding file (e.g., https://linkedin-data-scraper.p.rapidapi.com in backend/agent/tools/data_providers/LinkedinProvider.py)
ℹ️ 2. Visit that specific API on the RapidAPI marketplace
ℹ️ 3. Subscribe to th`e service (many offer free tiers with limited requests)
ℹ️ 4. Once subscribed, the service will be available to your agent through the API Services tool
ℹ️ A RapidAPI key is optional for API services like LinkedIn
ℹ️ Visit https://rapidapi.com/ to get your API key if needed
ℹ️ You can leave this blank and add it later if desired
Enter your RapidAPI key (optional, press Enter to skip): 9361[脱敏]Step 7/8: Setting up Supabase
==================================================ℹ️ Setting up Supabase database...
✅ Extracted project reference 'gcnijvljsutcxwgcedjz' from your Supabase URL
ℹ️ Changing to backend directory: F:\PythonProjects\suna\backend
ℹ️ Logging into Supabase CLI...
Hello from Supabase! Press Enter to open browser and login automatically.Here is your login link in case browser did not open https://supabase.com/dashboard/cli/login?session_id=[脱敏]Enter your verification code: 714c8ac1
Token cli_AI\love@AI_[脱敏] created successfully.You are now logged in. Happy coding!
ℹ️ Linking to Supabase project gcnijvljsutcxwgcedjz...
Enter your database password (or leave blank to skip):
Connecting to remote database...
NOTICE (42P06): schema "supabase_migrations" already exists, skipping
NOTICE (42P07): relation "schema_migrations" already exists, skipping
NOTICE (42701): column "statements" of relation "schema_migrations" already exists, skipping
NOTICE (42701): column "name" of relation "schema_migrations" already exists, skipping
NOTICE (42P06): schema "supabase_migrations" already exists, skipping
NOTICE (42P07): relation "seed_files" already exists, skipping
Finished supabase link.
ℹ️ Pushing database migrations...
Connecting to remote database...
Remote database is up to date.
✅ Supabase database setup completed
⚠️ IMPORTANT: You need to manually expose the 'basejump' schema in Supabase
ℹ️ Go to the Supabase web platform -> choose your project -> Project Settings -> Data API
ℹ️ In the 'Exposed Schema' section, add 'basejump' if not already there
Press Enter once you've completed this step...Step 8/8: Installing dependencies
==================================================ℹ️ Installing required dependencies...
ℹ️ Installing frontend dependencies...up to date in 1s292 packages are looking for fundingrun `npm fund` for details
✅ Frontend dependencies installed successfully
ℹ️ Locking dependencies...
Resolving dependencies... (0.3s)
ℹ️ Installing backend dependencies...
Installing dependencies from lock fileNo dependencies to install or updateInstalling the current project: suna (1.0)
✅ Backend dependencies installed successfully
ℹ️ Configuring environment files...
✅ Backend .env file created at backend\.env
ℹ️ Redis host is set to: redis
ℹ️ RabbitMQ host is set to: rabbitmq
✅ Frontend .env.local file created at frontend\.env.local
ℹ️ Backend URL is set to: http://localhost:8000/apiStep 8/8: Starting Suna
==================================================ℹ️ You can start Suna using either Docker Compose or by manually starting the frontend, backend and worker.How would you like to start Suna?
[1] Docker Compose (recommended, starts all services)
[2] Manual startup (requires Redis, RabbitMQ & separate terminals) Enter your choice (1 or 2): 1
(二) Docker构建部分
Enter your choice (1 or 2): 1
ℹ️ Starting Suna with Docker Compose...
ℹ️ Building images locally...
Compose can now delegate builds to bake for better performance.To do so, set COMPOSE_BAKE=true.
[+] Building 9.7s (34/34) FINISHED docker:desktop-linux=> [worker internal] load build definition from Dockerfile 0.0s=> => transferring dockerfile: 1.63kB 0.0s=> [backend internal] load metadata for docker.io/library/python:3.11-slim 3.5s=> [worker internal] load .dockerignore 0.0s=> => transferring context: 2B 0.0s=> [backend 1/7] FROM docker.io/library/python:3.11-slim@sha256:7a3ed1226224bcc1fe5443262363d42f48cf832a540c1836ba 0.1s=> => resolve docker.io/library/python:3.11-slim@sha256:7a3ed1226224bcc1fe5443262363d42f48cf832a540c1836ba8ccbeaad 0.0s=> [worker internal] load build context 0.0s=> => transferring context: 378.92kB 0.0s=> CACHED [backend 2/7] WORKDIR /app 0.0s=> CACHED [backend 3/7] RUN apt-get update && apt-get install -y --no-install-recommends build-essential c 0.0s=> CACHED [backend 4/7] RUN useradd -m -u 1000 appuser && mkdir -p /app/logs && chown -R appuser:appuser / 0.0s=> CACHED [worker 5/7] COPY --chown=appuser:appuser requirements.txt . 0.0s=> CACHED [worker 6/7] RUN pip install --no-cache-dir -r requirements.txt gunicorn 0.0s=> [worker 7/7] COPY --chown=appuser:appuser . . 0.1s=> [worker] exporting to image 0.3s=> => exporting layers 0.1s=> => exporting manifest sha256:f44b1916aecdf7e601a9ebe772fdfe3f7b9c7824a60dd66c28dae291bf1e1dfc 0.0s=> => exporting config sha256:9728c8d6b6125caaaf2dc116bb98542b504f2ead2d6ec1e1e0365ce2ec736fd7 0.0s=> => exporting attestation manifest sha256:625d7f6d1f95f8dcef025221b4c09acdd09fe36ad90701933437661e19d97201 0.0s=> => exporting manifest list sha256:81fcf132ef0709746e6bfa863a33accf01331c92b576bfd81d666490f4d3629c 0.0s=> => naming to docker.io/library/suna-worker:latest 0.0s=> => unpacking to docker.io/library/suna-worker:latest 0.0s=> [worker] resolving provenance for metadata file 0.0s=> [backend internal] load build definition from Dockerfile 0.0s=> => transferring dockerfile: 1.63kB 0.0s => [backend internal] load .dockerignore 0.0s=> => transferring context: 2B 0.0s => [backend internal] load build context 0.0s => => transferring context: 11.49kB 0.0s => CACHED [backend 5/7] COPY --chown=appuser:appuser requirements.txt . 0.0s => CACHED [backend 6/7] RUN pip install --no-cache-dir -r requirements.txt gunicorn 0.0s => CACHED [backend 7/7] COPY --chown=appuser:appuser . . 0.0s => [backend] exporting to image 0.1s => => exporting layers 0.0s => => exporting manifest sha256:84b8dfb58ef3e2223d9441cb66cba3a2f46e04d849e043c2c41c66150c578d20 0.0s => => exporting config sha256:659b5f6ba415fe441c3a58fa4502040282f09489265e6f2af680396a9f54018a 0.0s => => exporting attestation manifest sha256:b83b5d5b810a4d156c94afa49352013e57d2022d27297fbfdbfff0465b246500 0.0s => => exporting manifest list sha256:bcbac3552d0db9f463be4c2af24974c5226b7012b005e213d64566115e05f307 0.0s => => naming to docker.io/library/suna-backend:latest 0.0s=> => unpacking to docker.io/library/suna-backend:latest 0.0s => [backend] resolving provenance for metadata file 0.0s => [frontend internal] load build definition from Dockerfile 0.0s=> => transferring dockerfile: 704B 0.0s => [frontend internal] load metadata for docker.io/library/node:20-slim 1.0s => [frontend internal] load .dockerignore 0.0s=> => transferring context: 2B 0.0s => [frontend 1/7] FROM docker.io/library/node:20-slim@sha256:cb4abfbba7dfaa78e21ddf2a72a592e5f9ed36ccf98bdc8ad3ff9 0.0s => => resolve docker.io/library/node:20-slim@sha256:cb4abfbba7dfaa78e21ddf2a72a592e5f9ed36ccf98bdc8ad3ff945673d288 0.0s => [frontend internal] load build context 3.4s => => transferring context: 8.63MB 3.0s=> CACHED [frontend 2/7] WORKDIR /app 0.0s=> CACHED [frontend 3/7] COPY package*.json ./ 0.0s => CACHED [frontend 4/7] RUN apt-get update && apt-get install -y --no-install-recommends python3 make 0.0s => CACHED [frontend 5/7] RUN npm install 0.0s => CACHED [frontend 6/7] COPY . . 0.0s => CACHED [frontend 7/7] RUN npm run build 0.0s => [frontend] exporting to image 0.1s => => exporting layers 0.0s => => exporting manifest sha256:e11438b808ea84b58c682c717acb770ec86e91bf2e4f729e753f9cc62f6197ca 0.0s => => exporting config sha256:fa45c13e02f6722025f58e1327de347b959d3584c798434d26001d798c8f1e4f 0.0s => => exporting attestation manifest sha256:755f47d4e868607bee4a872f9ebb036f7742efb00a8bd2f7591a217ab68730ea 0.0s => => exporting manifest list sha256:28b09bc843d2be1a680b5bccff6631c24ade20993a40cd3a934db8729cd8240c 0.0s=> => naming to docker.io/library/suna-frontend:latest 0.0s => => unpacking to docker.io/library/suna-frontend:latest 0.0s => [frontend] resolving provenance for metadata file 0.0s
[+] Running 8/8✔ backend Built 0.0s ✔ frontend Built 0.0s ✔ worker Built 0.0s ✔ Container suna-rabbitmq-1 Healthy 15.1s ✔ Container suna-redis-1 Healthy 15.1s ✔ Container suna-worker-1 Started 14.6s ✔ Container suna-backend-1 Started 15.7s ✔ Container suna-frontend-1 Started 16.2s
ℹ️ Waiting for services to start...✨ Suna Setup Complete! ✨ℹ️ Suna is configured to use openrouter/deepseek/deepseek-chat-v3-0324:free as the default LLM model
ℹ️ Your Suna instance is now running!
ℹ️ Access it at: http://localhost:3000
ℹ️ Create an account using Supabase authentication to start using SunaUseful Docker commands:docker compose ps - Check the status of Suna servicesdocker compose logs - View logs from all servicesdocker compose logs -f - Follow logs from all servicesdocker compose down - Stop Suna servicesdocker compose up -d - Start Suna services (after they've been stopped)
二、配置过程完整解析
(一)环境信息
Microsoft Windows [Version 10.0.27871.1000]
(c) Microsoft Corporation. All rights reserved.(suna-py3.12) F:\PythonProjects\suna>python setup.py '--admin'
代码输出对照:
- 1、系统版本:
Microsoft Windows [Version 10.0.27871.1000]
- 说明:Windows 10 预览版(Build 27871),需确保 Docker Desktop 启用 WSL 2 后端。
- 2、虚拟环境:
(suna-py3.12)
- 说明:通过
poetry
创建的 Python 3.12 隔离环境,避免依赖冲突。
- 说明:通过
- 3、执行命令:
python setup.py '--admin'
- 说明:启动管理员模式安装脚本,允许修改系统配置文件。
python setup.py '--admin'
(二)Step 1/8:检查依赖项
代码输出原文
Step 1/8: Checking requirements
==================================================✅ git is installed # 版本控制工具,用于克隆和更新Suna代码仓库
✅ docker is installed # 容器化平台,用于部署Suna微服务(如Redis、RabbitMQ)
✅ python3 is installed # 主运行环境,需>=3.10版本支持最新语法特性
✅ poetry is installed # Python依赖管理工具,替代传统pip+requirements.txt
✅ pip3 is installed # Python包安装工具,用于安装基础依赖
✅ node is installed # JavaScript运行环境,用于构建前端React应用
✅ npm is installed # Node包管理器,用于安装前端依赖
✅ Docker is running # 检查Docker守护进程是否启动(必须状态)
✅ Suna repository detected # 确认当前目录包含Suna项目文件结构
用户操作
按回车键继续
# 操作:确认所有依赖检查均显示✅后,按回车键继续
# 注意:若某项显示❌,需安装对应工具后重新运行脚本
(三)Step 2/8:收集 Supabase 信息
代码输出原文
Step 2/8: Collecting Supabase information
==================================================ℹ️ You'll need to create a Supabase project before continuing # 提示需先在Supabase官网创建项目
ℹ️ Visit https://supabase.com/dashboard/projects to create one # 项目创建入口链接
ℹ️ After creating your project, visit the project settings -> Data API # 指引获取API密钥的路径
ℹ️ and you'll need to get the following information: # 列出需要收集的3项关键信息
ℹ️ 1. Supabase Project URL (e.g., https://abcdefg.supabase.co) # 项目唯一访问端点
ℹ️ 2. Supabase anon key (public, read-only access) # 前端公开密钥(只读权限)
ℹ️ 3. Supabase service role key (private, full access) # 后端服务密钥(完全权限)
Press Enter to continue once you've created your Supabase project... # 等待用户确认项目已创建
用户输入内容
# 操作:按回车键确认已创建Supabase项目
Press Enter to continue once you've created your Supabase project...# 输入:Supabase项目URL(格式:https://{project_id}.supabase.co)
# 来源:Supabase项目Dashboard页面顶部的"Project URL"字段
# 用途:作为数据库连接的基础URL
Enter your Supabase Project URL (e.g., https://abcdefg.supabase.co): https://[脱敏].supabase.co # 输入:Supabase匿名密钥(JWT格式,用于前端只读访问)
# 来源:Supabase项目Settings > API > Project API keys > anon (public)
# 权限:仅允许SELECT操作,防止前端代码直接修改数据库
Enter your Supabase anon key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.[脱敏] # 输入:Supabase服务角色密钥(JWT格式,用于后端全权限访问)
# 来源:Supabase项目Settings > API > Project API keys > service_role
# 权限:允许所有数据库操作(INSERT/UPDATE/DELETE),需严格保密
Enter your Supabase service role key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.[脱敏]
(四)Step 3/8:收集 Daytona 信息
代码输出原文
Step 3/8: Collecting Daytona information
==================================================ℹ️ You'll need to create a Daytona account before continuing # 提示需先注册Daytona账户
ℹ️ Visit https://app.daytona.io/ to create one # Daytona注册链接
ℹ️ Then, generate an API key from 'Keys' menu # 指引生成API密钥的路径
ℹ️ After that, go to Images (https://app.daytona.io/dashboard/images) # 镜像管理页面
ℹ️ Click '+ Create Image' # 创建新镜像操作
ℹ️ Enter 'kortix/suna:0.1.3' as the image name # 指定Suna官方镜像名称及版本
ℹ️ Set '/usr/bin/supervisord -n -c /etc/supervisor/conf.d/supervisord.conf' as the Entrypoint # 容器启动命令
Press Enter to continue once you've completed these steps... # 等待用户确认操作完成
用户输入内容
# 操作:按回车键确认已完成Daytona镜像配置
Press Enter to continue once you've completed these steps...# 输入:Daytona API密钥(格式:dtn_开头的字符串)
# 来源:Daytona账户Settings > API Keys > Generate New Key
# 用途:授权Suna访问Daytona镜像仓库
Enter your Daytona API key: dtn_[脱敏]
(五)Step 4/8:收集 LLM API keys
代码输出原文
Step 4/8: Collecting LLM API keys
==================================================ℹ️ You need at least one LLM provider API key to use Suna # 提示必须配置至少一个大语言模型
ℹ️ Available LLM providers: OpenAI, Anthropic, OpenRouter # 支持的LLM提供商列表Select LLM providers to configure: # 提示选择要配置的提供商
[1] OpenAI # 选项1:OpenAI(GPT系列模型)
[2] Anthropic # 选项2:Anthropic(Claude系列模型)
[3] OpenRouter (access to multiple models) # 选项3:OpenRouter(聚合多模型平台)
Enter numbers separated by commas (e.g., 1,2,3): # 允许多选,用逗号分隔
用户输入内容
# 选择:输入3选择OpenRouter(多模型聚合平台,支持免费模型)
# 优势:无需单独申请各模型API,提供免费额度测试
Select providers (required, at least one): 3# 输入:OpenRouter API密钥(格式:sk-or-v1-开头的字符串)
# 来源:OpenRouter官网注册后,在Dashboard > API Keys生成
# 用途:认证Suna对OpenRouter服务的访问权限
Enter your OpenRouter API key: sk-or-v1-[脱敏] # 选择:输入2选择免费的DeepSeek模型(deepseek-chat-v3-0324:free)
# 替代方案:若需更高性能,可选择1(Gemini Pro)或3(GPT-4o),但需付费
Recommended OpenRouter models:
[1] openrouter/google/gemini-2.5-pro-preview # Google Gemini专业版(付费)
[2] openrouter/deepseek/deepseek-chat-v3-0324:free # 深度求索免费模型
[3] openrouter/openai/gpt-4o-2024-11-20 # OpenAI GPT-4o(付费)
Select default model (1-3) or press Enter for gemini-2.5-flash: 2
(六)Step 5/8:收集搜索和 web scraping API keys
代码输出原文
Step 5/8: Collecting search and web scraping API keys
==================================================ℹ️ You'll need to obtain API keys for search and web scraping # 提示需要搜索和网页抓取API
ℹ️ Visit https://tavily.com/ to get a Tavily API key # Tavily搜索API注册链接
ℹ️ Visit https://firecrawl.dev/ to get a Firecrawl API key # Firecrawl网页抓取API注册链接
Enter your Tavily API key: # 提示输入搜索API密钥
Enter your Firecrawl API key: # 提示输入网页抓取API密钥
Are you self-hosting Firecrawl? (y/n): # 是否自托管Firecrawl服务
用户输入内容
# 输入:Tavily搜索API密钥(格式:tvly-dev-开头的字符串)
# 来源:Tavily官网注册后,在Dashboard > API Keys获取
# 用途:提供实时网络搜索能力给Suna代理
Enter your Tavily API key: tvly-dev-[脱敏] # 输入:Firecrawl网页抓取API密钥(格式:fc-开头的字符串)
# 来源:Firecrawl官网注册后,在Account > API Keys获取
# 用途:解析和提取网页内容给Suna代理
Enter your Firecrawl API key: fc-[脱敏] # 选择:输入n表示使用Firecrawl官方云服务(不自托管)
# 自托管选项:若选择y,需自行部署Firecrawl Docker镜像并配置访问地址
Are you self-hosting Firecrawl? (y/n): n
(七)Step 6/8:收集 RapidAPI key
代码输出原文
Step 6/8: Collecting RapidAPI key
==================================================ℹ️ To enable API services like LinkedIn, and others, you'll need a RapidAPI key # 启用第三方API的前提
ℹ️ Each service requires individual activation in your RapidAPI account # 需在RapidAPI市场单独订阅服务
ℹ️ A RapidAPI key is optional for API services like LinkedIn # 非必需,可后续添加
ℹ️ Visit https://rapidapi.com/ to get your API key if needed # 注册获取API密钥的链接
ℹ️ You can leave this blank and add it later if desired # 允许跳过,后续通过管理界面配置
Enter your RapidAPI key (optional, press Enter to skip): # 提示输入(可留空)
用户输入内容
# 输入:RapidAPI密钥(可选,用于LinkedIn等第三方API服务)
# 来源:RapidAPI官网注册后,在Dashboard > My Apps > Default-App获取
# 用途:若需要Suna访问LinkedIn等服务,需提供此密钥
Enter your RapidAPI key (optional, press Enter to skip): [脱敏]
(八)Step 7/8:Setting up Supabase
1、第1段输出(验证码登录授权)
代码输出原文
Step 7/8: Setting up Supabase
==================================================ℹ️ Setting up Supabase database... # 开始配置Supabase数据库连接
✅ Extracted project reference 'gcnijvljsutcxwgcedjz' from your Supabase URL # 从URL解析项目ID(格式:https://{project_id}.supabase.co)
ℹ️ Changing to backend directory: F:\PythonProjects\suna\backend # 切换到后端代码目录(包含数据库迁移文件)
ℹ️ Logging into Supabase CLI... # 启动Supabase命令行工具登录流程
Hello from Supabase! Press Enter to open browser and login automatically. # 提示按回车打开浏览器登录Here is your login link in case browser did not open https://supabase.com/dashboard/cli/login?session_id=a3931bff-31b6-4cec-9369-eed54a30e305&token_name=cli_AI\love@AI_1749527270&public_key=048da1ff3073da96ee9a4d45b9d78f7392b2098c00b5dc6f0907f50f3b605e5fedf1432ac17d2c450df21db9317d106407d775aa50315b0503cff0289b29b9ac1d # OAuth登录链接(包含会话ID和令牌信息)Enter your verification code: # 提示输入浏览器中显示的验证码


用户输入内容
# 操作:按回车键打开浏览器,跳转到Supabase登录授权页面
# 注意:需使用创建Supabase项目时的同一账户登录
Press Enter to open browser and login automatically.# 输入:浏览器中显示的6位验证码(格式:如714c8ac1)
# 来源:Supabase授权页面生成的临时验证码(有效期5分钟)
# 用途:验证用户身份,允许CLI访问Supabase项目
# 安全提示:请勿分享此验证码,仅在受信任环境输入
Enter your verification code: 714c8ac1 # 操作:直接按回车键跳过数据库密码设置(使用默认密钥认证)
# 替代方案:若需使用密码认证,可输入自定义密码并配置Supabase项目
# 注意:Supabase默认使用密钥认证,无需数据库密码
Enter your database password (or leave blank to skip):
2、第2段输出(暴露basejump模式)
后续代码输出原文
Token cli_AI\love@AI_1749527270 created successfully. # CLI认证令牌创建成功(有效期24小时)
You are now logged in. Happy coding! # 登录成功提示ℹ️ Linking to Supabase project gcnijvljsutcxwgcedjz... # 将本地项目与远程Supabase项目关联
Enter your database password (or leave blank to skip): # 再次提示输入数据库密码(可跳过)Connecting to remote database... # 尝试连接Supabase托管的PostgreSQL数据库
NOTICE (42P06): schema "supabase_migrations" already exists, skipping # 迁移管理模式已存在,跳过创建
NOTICE (42P07): relation "schema_migrations" already exists, skipping # 迁移记录表已存在,跳过创建
NOTICE (42701): column "statements" of relation "schema_migrations" already exists, skipping # 迁移语句列已存在,跳过创建
NOTICE (42701): column "name" of relation "schema_migrations" already exists, skipping # 迁移名称列已存在,跳过创建
NOTICE (42P06): schema "supabase_migrations" already exists, skipping # 重复提示(幂等操作)
NOTICE (42P07): relation "seed_files" already exists, skipping # 种子数据文件表已存在,跳过创建
Finished supabase link. # 项目链接完成ℹ️ Pushing database migrations... # 开始推送本地数据库迁移文件到远程
Connecting to remote database... # 再次连接数据库
Remote database is up to date. # 远程数据库已是最新版本(无需迁移)
✅ Supabase database setup completed # 数据库设置完成⚠️ IMPORTANT: You need to manually expose the 'basejump' schema in Supabase # 重要提示:需手动暴露basejump模式
ℹ️ Go to the Supabase web platform -> choose your project -> Project Settings -> Data API # 操作指引
ℹ️ In the 'Exposed Schema' section, add 'basejump' if not already there # 添加basejump到暴露模式列表
Press Enter once you've completed this step... # 完成后按回车键继续
后续用户输入内容
# 操作:直接按回车键跳过密码设置(使用默认密钥认证)
# 说明:仅在启用数据库密码认证时需要输入(非默认配置)
Enter your database password (or leave blank to skip): # 操作:打开浏览器,访问Supabase后台,手动暴露basejump schema
# 步骤:
# 1. 登录 https://supabase.com/dashboard
# 2. 选择对应项目
# 3. 进入 Settings > Data API
# 4. 在 "Exposed Schema" 中添加 "basejump"
# 5. 点击 Save 保存设置# 操作:完成上述步骤后,按回车键继续安装流程
Press Enter once you've completed this step...
技术原理与安全说明
-
Supabase CLI 认证机制:
- 使用 OAuth 2.0 授权码模式,通过浏览器获取临时令牌(Token)。
- 令牌存储在本地
~/.supabase/credentials.json
,有效期 24 小时。
-
数据库迁移系统:
- Suna 使用
supabase db push
命令同步迁移文件。 - 迁移文件位于
backend/migrations
目录,采用时间戳命名(如20231001000000_initial_setup.sql
)。
- Suna 使用
-
Schema 暴露的必要性:
- Supabase 默认仅暴露
public
schema,需手动添加basejump
以允许后端访问。 - 未暴露可能导致错误:
42P01: relation "basejump.agent_tasks" does not exist
。
- Supabase 默认仅暴露
-
安全最佳实践:
- 避免使用数据库密码认证,优先使用
service_role key
。 - 定期轮换
service_role key
(Supabase 后台可操作)。 - 生产环境建议启用行级安全策略(RLS)限制数据访问。
- 避免使用数据库密码认证,优先使用
3、常见问题排查
问题现象 | 可能原因 | 解决方案 |
---|---|---|
验证码输入后提示 Invalid code | 验证码过期或输入错误 | 刷新浏览器授权页面获取新验证码 |
ERROR: schema "basejump" does not exist | 未暴露 basejump schema | 按提示在 Supabase 后台暴露 basejump schema |
迁移失败提示 401 Unauthorized | CLI 令牌过期或权限不足 | 执行 supabase logout 后重新登录 |
浏览器无法自动打开 | 终端环境无图形界面或浏览器权限问题 | 手动复制链接到浏览器打开 |
(九)Step 8/8:Installing dependencies & Starting Suna

代码输出原文
Step 8/8: Installing dependencies
==================================================ℹ️ Installing frontend dependencies... # 开始安装前端依赖
...(省略npm安装日志) # 实际输出包含大量npm包安装信息
✅ Frontend dependencies installed successfully # 前端依赖安装成功
ℹ️ Installing backend dependencies... # 开始安装后端依赖
...(省略poetry安装日志) # 实际输出包含Python包解析和安装信息
✅ Backend dependencies installed successfully # 后端依赖安装成功
ℹ️ Configuring environment files... # 开始配置环境变量文件
✅ Backend .env file created at backend\.env # 后端环境变量文件创建成功
✅ Frontend .env.local file created at frontend\.env.local # 前端环境变量文件创建成功Step 8/8: Starting Suna
==================================================ℹ️ You can start Suna using either Docker Compose or by manually starting the services. # 启动方式说明
How would you like to start Suna? # 提示选择启动方式
[1] Docker Compose (recommended, starts all services) # 选项1:Docker Compose(推荐)
[2] Manual startup (requires Redis, RabbitMQ & separate terminals) # 选项2:手动启动(需单独启动各服务)
Enter your choice (1 or 2): # 提示输入选择
用户输入内容
# 选择:输入1选择Docker Compose方式启动(一键启动所有微服务)
# 优势:自动管理服务依赖关系,简化部署流程
# 注意:需确保Docker服务已启动
Enter your choice (1 or 2): 1
(十)Suna Docker 构建与服务启动解析
以下是对 Docker 构建与服务启动阶段 的完整解析,包含代码输出原文、逐行注释、服务架构说明及验证方法:
代码输出原文
……
[+] Running 8/8✔ backend Built 0.0s ✔ frontend Built 0.0s ✔ worker Built 0.0s ✔ Container suna-redis-1 Healthy 25.6s ✔ Container suna-rabbitmq-1 Healthy 25.6s ✔ Container suna-worker-1 Started 25.1s ✔ Container suna-backend-1 Started 20.4s ✔ Container suna-frontend-1 Started 18.9s
ℹ️ Waiting for services to start... ✨ Suna Setup Complete! ✨ℹ️ Suna is configured to use openrouter/openai/gpt-4o-2024-11-20 as the default LLM model
ℹ️ Your Suna instance is now running!
ℹ️ Access it at: http://localhost:3000
ℹ️ Create an account using Supabase authentication to start using Suna Useful Docker commands:docker compose ps - Check the status of Suna servicesdocker compose logs - View logs from all servicesdocker compose logs -f - Follow logs from all servicesdocker compose down - Stop Suna servicesdocker compose up -d - Start Suna services (after they've been stopped)
逐行注释与服务解析
1. 服务构建阶段
✔ backend Built 0.0s ✔ frontend Built 0.0s ✔ worker Built 0.0s
- backend:基于 FastAPI 的 Python 后端服务,提供 API 接口与业务逻辑
- frontend:基于 React 的前端应用,构建为静态文件由 Nginx 服务
- worker:异步任务处理服务,负责执行 LLM 调用、网页抓取等耗时操作
- 构建时间:显示 0.0s 是因为使用了 Docker 缓存,首次构建通常需要 3-5 分钟
2. 基础设施服务启动
✔ Container suna-redis-1 Healthy 25.6s ✔ Container suna-rabbitmq-1 Healthy 25.6s
- redis-1:内存数据库,用于缓存中间结果与会话数据
- 端口映射:6379(容器内)→ 6379(宿主机)
- 健康检查:通过 ping 命令验证服务可用性
- rabbitmq-1:消息队列服务,协调 backend 与 worker 通信
- 端口映射:5672(AMQP 协议)、15672(管理界面)
- 健康检查:通过 HTTP API 验证管理服务状态
3. 核心服务启动
✔ Container suna-worker-1 Started 25.1s ✔ Container suna-backend-1 Started 20.4s ✔ Container suna-frontend-1 Started 18.9s
- worker-1:依赖 rabbitmq 和 redis,启动稍慢(25.1s)
- 功能:消费队列任务,调用 LLM 模型与外部 API
- backend-1:依赖 redis,启动时间中等(20.4s)
- 功能:处理 HTTP 请求,管理用户会话,调度任务到队列
- frontend-1:纯静态服务,启动最快(18.9s)
- 端口映射:3000(容器内 Nginx)→ 3000(宿主机)
4. 服务验证信息
ℹ️ Suna is configured to use openrouter/openai/gpt-4o-2024-11-20 as the default LLM model
ℹ️ Your Suna instance is now running!
ℹ️ Access it at: http://localhost:3000
ℹ️ Create an account using Supabase authentication to start using Suna
- 默认 LLM 模型:显示配置的默认大语言模型(示例中为 GPT-4o)
- 访问地址:前端服务地址,通过 Nginx 代理到 React 应用
- 认证方式:使用 Supabase 提供的 OAuth / 密码认证系统
5. 常用 Docker 命令
Useful Docker commands:docker compose ps - Check the status of Suna servicesdocker compose logs - View logs from all servicesdocker compose logs -f - Follow logs from all servicesdocker compose down - Stop Suna servicesdocker compose up -d - Start Suna services (after they've been stopped)
- ps:查看容器状态(健康检查、CPU / 内存占用)
- logs:诊断服务问题(如 backend 无法连接到 redis)
- down:停止并移除所有容器(数据不会丢失)
- up -d:后台启动服务(生产环境推荐方式)
服务架构与通信流程
验证服务运行状态
-
检查容器状态:
docker compose ps
预期输出:
NAME COMMAND SERVICE STATUS PORTS suna-backend-1 "uvicorn main:app --…" backend running (healthy) 0.0.0.0:8000->8000/tcp suna-frontend-1 "nginx -g 'daemon of…" frontend running (healthy) 0.0.0.0:3000->80/tcp suna-rabbitmq-1 "docker-entrypoint.s…" rabbitmq running (healthy) 0.0.0.0:15672->15672/tcp, 0.0.0.0:5672->5672/tcp suna-redis-1 "docker-entrypoint.s…" redis running (healthy) 0.0.0.0:6379->6379/tcp suna-worker-1 "python -m app.work…" worker running (healthy) 8000/tcp
-
验证前端访问:
- 访问:http://localhost:3000
- 预期看到 Suna 登录页面,尝试注册账号(通过 Supabase 认证)
- 访问:http://localhost:3000
-
检查后端 API:
curl http://localhost:8000/health
预期输出:
{"status":"healthy","version":"0.1.3","timestamp":"2025-06-10T14:30:00Z"}
常见问题排查
-
前端无法访问:
- 检查端口占用:
netstat -ano | grep 3000
- 查看 frontend 容器日志:
docker compose logs frontend
- 检查端口占用:
-
后端报错 500:
- 检查 backend 日志:
docker compose logs backend
- 确认 Supabase 连接信息是否正确(检查
.env
文件)
- 检查 backend 日志:
-
任务队列无响应:
- 检查 rabbitmq 管理界面:http://localhost:15672 (默认账号:guest/guest)
- 查看 worker 日志:
docker compose logs worker
通过以上解析,可全面理解 Suna 的 Docker 部署架构、服务依赖关系及验证方法,确保系统正常运行。
三、安全与合规说明
-
密钥脱敏规则:
- 所有密钥保留格式前缀(如
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
),中间部分用[脱敏]
替代。 - URL 中的项目 ID(如
supabase.co
前的部分)全部脱敏。
- 所有密钥保留格式前缀(如
-
操作规范:
- 每行用户输入后需按回车键确认,脚本会验证格式有效性。
- 敏感信息(如密钥)切勿分享,若泄露需立即在对应平台重置。
-
故障排查:
- 若安装失败,可查看
backend/logs/setup.log
获取详细错误堆栈。 - 常见问题:端口冲突(修改
.env
中的BACKEND_PORT
)、网络连接超时。
- 若安装失败,可查看
通过此格式,可清晰区分脚本输出与用户输入,同时通过完整注释明确每个步骤的技术含义、操作要求和安全注意事项,便于理解与复现。