运行平台
让它跑起来。SuperAGI 是六服务的完整平台,今天用 docker compose 启动它,并从两个 entrypoint 脚本看清启动步骤。
一键启动
cd SuperAGI
cp config_template.yaml config.yaml # 填 OPENAI_API_KEY 等
docker compose up --build
# 浏览器打开 http://localhost:3000
config.yaml 填好至少一个 LLM 的 key(OpenAI 等)。六个服务(Day 01 复习+深化)
贯穿今天的类比是"一家餐厅开业":
docker compose up = 拉闸开门营业;六服务 = 六个岗位(大堂经理 proxy、服务员 gui、前台收银 backend、后厨 celery、仓库账本 postgres、订单小票夹 redis);开门前的准备(下工具、跑迁移)= 进货摆桌;seeding = 开业先把招牌菜备好。# docker-compose.yaml 六服务
backend # FastAPI(等 Postgres 就绪后启动)
celery # 同镜像,跑 Celery worker(后台执行智能体)★
gui # Next.js 前端
super__redis # redis-stack-server(broker + 向量存储)
super__postgres # postgres:15(库 super_agi_main)
proxy # nginx,ports "3000:80"(用户入口)
super__redis 用的是 redis-stack-server——不只是普通 Redis,还带向量搜索能力(既做 Celery 消息队列,也能当向量库,Day 13)。proxy(Nginx) 是唯一对外暴露的端口。👶 小白:我就想跑个 demo,能不能别整六个容器,直接 python 跑一个脚本?
👨🏫 老师:跑得起来,但会失去 SuperAGI 的灵魂。少了 celery + redis,就没有"后台一步步自我重排"的循环(Day 02 的啊哈点),智能体没法断点续跑、没法并发;少了 postgres,进度和 Feed 没处存,崩一次全丢。这六个岗位不是摆设,正是它们把"一个会崩的脚本"撑成了"可运维的平台"。本地 docker compose up 一键全拉起,其实并不费事。
API 容器启动步骤
entrypoint.sh 揭示了 backend 容器的启动顺序:
python superagi/tool_manager.py —— 下载工具install_tool_dependencies.sh —— 装工具依赖alembic upgrade head —— 跑数据库迁移uvicorn main:app --port 8001 --reload —— 起 APIalembic upgrade head 把数据库表结构升级到最新——否则新版本的字段没建,代码会报错。这些是"服务能正常工作的前提",必须在起 API 之前就绪。和 AutoGPT/OpenHands 的启动迁移一个道理。wait-for-it.sh super__postgres:5432 确保先等数据库起来。| 启动阶段 | 此刻发生什么 | 餐厅类比 |
|---|---|---|
wait-for-it postgres | 等数据库端口通了才继续 | 等仓库开门 |
tool_manager.py | 下载工具代码到本地 | 进货 |
alembic upgrade head | 把表结构升到最新版 | 按最新菜单改后厨 |
uvicorn main:app | 起 API,开始接单 | 开门营业 |
SELECT ... resource_summary 一查,数据库里根本没这一列,直接 column does not exist 崩溃;或者工具还没下载,智能体一调工具就 ModuleNotFound。就像没进货、没按新菜单改后厨就开门迎客,客人一点菜就露馅。所以这几步必须卡在 uvicorn 之前。Celery 容器
entrypoint_celery.sh:下工具/装依赖后跑 celery -A superagi.worker worker --beat --loglevel=info。
--beat
--beat 表示这个 Celery 进程既是 worker(执行任务)又是 beat(定时调度器)。beat 负责周期性触发任务(Day 17)——比如每 5 分钟检查有没有到点的定时智能体、每 2 分钟唤醒等待中的工作流。backend(接单)和 celery(干活+定时)分成两个容器,同一个镜像——回忆 Day 01 的"接单快、干活慢"分离。uvicorn(接单),一个 celery worker --beat(干活+定时)。同一家餐厅,前台和后厨用的是同一本《员工手册》,但干的活天差地别。startup seeding
main.py 的 @app.on_event("startup")(main.py:194)在启动时做初始化播种:注册本地/市场工具(register_toolkits),并用 AgentWorkflowSeed/IterationWorkflowSeed 内置几套工作流(Goal Based、Fixed/Dynamic Task、Sales、Recruitment、SuperCoder)。
register_toolkits() + AgentWorkflowSeed.build_goal_based_agent() 等一串播种函数。于是新用户零配置打开 GUI 就能看到:工作流下拉里已有
Goal Based Workflow / Fixed Task Workflow / Dynamic Task Workflow;工具区已装好文件、搜索等 toolkit。不播种的话,界面空空如也,新用户根本无从下手。(这些 build_* 函数就在
agent/workflow_seed.py,Day 07 精读。)Nginx 反向代理
nginx/default.conf:对外暴露 3000 端口(映射到容器 80),把 /api 转给 backend、其余转给 GUI。
/api/* 给 backend、其余给 gui。浏览器眼里只有一个同源地址。/api/* 给后端、其余给前端。于是对浏览器来说只有一个地址(同源,无跨域),部署也只暴露一个端口。反向代理是多服务 Web 应用的标准前置。配置文件
config_template.yaml(复制成 config.yaml)集中放所有配置:各家 LLM key(OPENAI/PALM/REPLICATE/HUGGING)、MODEL_NAME、MAX_MODEL_TOKEN_LIMIT、DB/Redis 连接、存储类型(FILE/S3)、TOOLS_DIR、JWT/加密 key、各工具凭据(Google 搜索、邮件、GitHub、Jira、Slack…)。
MODEL_NAME、换存储改 STORAGE_TYPE、接工具填对应凭据。Day 19 会深入配置和部署变体(本地 LLM、GPU 等)。今天记住:所有可调的旋钮都在 config.yaml。今日小结 + 动手
🧠 今天你应该能回答
- 怎么启动平台?六个服务各是什么?
- API 容器启动前为什么要下工具、跑迁移?
- Celery 的 --beat 是什么?为什么 backend/celery 分开?
- startup seeding 为什么重要?
- Nginx 反向代理解决什么?配置在哪?
docker compose up 就是"一家六岗位餐厅拉闸开业"——开门前先进货(下工具)、按最新菜单改后厨(跑迁移)、备好招牌菜(seeding),大堂经理(Nginx)在门口按需分流客人,前台(backend)和后厨(celery)各司其职。✋ 动手
grep -nE '(backend|celery|gui|super__|proxy):' docker-compose.yaml
cat entrypoint.sh entrypoint_celery.sh
sed -n '194,247p' main.py | head -40 # startup seeding
grep -nE 'API_KEY|MODEL_NAME|STORAGE_TYPE|REDIS_URL|DB_URL' config_template.yaml | head