Skip to content

在 AWS Lightsail 上部署 Potato

用 potato deploy 以每月 $12 的价格把 Potato 标注研究放到 AWS Lightsail 上,从设置凭据一直讲到最后拉取标注。

potato deploy up --provider aws 把一项标注研究放到一台 AWS Lightsail 虚拟机上,固定价格每月 $12,并给你一个可以发给标注者的 HTTPS 地址。除非你的账号关闭了 Lightsail,否则在 AWS 上就应该用这个目标。价格包含 IPv4 地址和一块重启后保留的 60 GB 磁盘,而且 Potato 只需要 lightsail:* 和 sts:GetCallerIdentity 两项权限,所以在受限的 IAM 角色下也能使用。本页需要 Potato 2.10 或更高版本,以及一份你已经用 potato start 运行过的配置。

设置 AWS 凭据

Potato 读取 AWS 凭据的方式与 aws 命令行工具相同:先读 AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY,然后是 AWS_PROFILE,再然后是 ~/.aws/credentials 和 ~/.aws/config。安装 AWS extra,用 AWS CLI 登录,并确认 Potato 看到的是你预期的账号:

bash
pip install 'potato-annotation[deploy-aws]'
aws configure                     # or: aws sso login --profile lab
potato deploy providers --verify

providers --verify 会询问每个提供商你的凭据属于谁,并打印答案。如果你所在机构使用单点登录,请在每次部署时用 --aws-profile lab 传入配置文件名,Potato 会把它记录下来,让后续命令使用同一个账号。Potato 从不把 AWS 凭据写入磁盘。

如果你的 IAM 用户或角色受到限制,请向管理员申请 lightsail:* 和 sts:GetCallerIdentity。另外两个 AWS 目标需要的权限比这更多。EC2 目标(--provider aws-ec2,约每月 $18)用于关闭了 Lightsail 的账号,ECS Express 目标(--provider aws-ecs)运行的容器在重启后磁盘不会保留。

决定谁可以登录

potato deploy 不会改动你的登录设置,而 Lightsail 地址是公开的。如果配置允许任何人注册,下面的试运行会报告警告 D003,“Anyone who finds the URL can register and annotate.”(任何找到这个 URL 的人都能注册并标注。)对众包研究来说,开放注册通常是有意为之,因为平台会把工作者引导到这个链接。对于实名标注者,请在部署之前把他们列在 user_config.users 下并设置 allow_all_users: false(密码管理),或者让他们通过 Google、GitHub 或你所在机构登录(SSO 与 OAuth 认证)。

检查计划

试运行不需要 AWS 账号,也不创建任何东西。它会打印预检报告、部署要执行的每一步,以及估算费用:

bash
potato deploy up myproject/config.yaml --provider aws --dry-run

默认部署时,计划会在 us-east-1 创建一个以任务命名的实例,使用 2 GB 的 small_3_0 套餐和 Ubuntu 24.04。它会绑定一个静态 IP,使地址和证书在停止再启动后依然保留,并且只开放 22、80 和 443 端口。Potato 在 Caddy Web 服务器后面监听 8000 端口,部署从不开放 8000 端口。Potato 会为这次部署生成一把 SSH 部署密钥,不会使用你自己的 SSH 密钥。

有三个选项可以改变默认值。--region 接受任何 Lightsail 区域。由于 Potato 把项目集放在内存中,2 GB 放不下的语料需要 --size medium_3_0,它提供 4 GB,每月 $24。--volume-gb 会另加一块 Lightsail 磁盘,每 GB 每月 $0.10,任务数据就存放在这块磁盘上。

部署

去掉 --dry-run 运行同一条命令。Potato 会再次显示计划,等待你确认:

bash
potato deploy up myproject/config.yaml --provider aws

实例启动并安装 Docker 期间,部署需要几分钟。最后它会打印 URL(静态 IP 上的一个 https:// 地址)以及管理员密钥文件的路径,也就是配置旁边的 .potato/secrets.json。用管理员密钥可以打开 /admin 上的管理仪表板。修改配置后再次运行 up,会上传新版本并在同一个实例上重启任务。

没有域名时,Let's Encrypt 会为 IP 地址签发证书。证书有效期约六天,会自动续期。续期失败时 potato deploy status myproject/config.yaml 会报告出来,所以如果研究在无人看管的情况下运行,请每隔几天检查一次。要使用自己的域名,请把一条 DNS A 记录指向静态 IP,然后加上 --domain annotate.example.edu 重新部署。

结束研究

标注存放在实例的磁盘上,这块磁盘能熬过重启,却熬不过 destroy。请先把标注拉取到你的机器上并检查,然后再删除实例:

bash
potato deploy pull myproject/config.yaml
potato deploy destroy myproject/config.yaml

pull 把部署收集到的全部内容写入一个新的 potato-pull-<name>-<timestamp> 目录,并用 SQLite 的备份命令复制数据库。destroy 不会在从未拉取过的部署上运行。它会释放静态 IP,因为 Lightsail 对没有绑定到实例的静态 IP 照样收费。使用了 --volume-gb 时,destroy --keep-data 会保留那块单独的磁盘。

故障排查

“AWS rejected the credentials” 表示 SSO 会话已过期,或者 AWS_PROFILE 指定的配置文件不存在。运行 aws sso login 后重新部署。

“Lightsail does not sell bundle …” 出现在 AWS 调价后给套餐改名的时候。错误信息会列出当前在售的套餐,--size 可以接受其中任何一个。

最初几分钟 HTTPS 无法访问,是因为证书要等实例可以访问之后才会申请。potato deploy status 会把证书错误和服务器宕机分开报告。

延伸阅读