basecamp/once
GitHub: basecamp/once
一个用于在本地自托管并自动化管理 Docker 化 Web 应用的平台,简化部署、更新与监控流程。
Stars: 1636 | Forks: 69
# ONCE
ONCE 是一个用于安装和管理基于 Docker 的 Web 应用程序的平台。
它的目标是让自托管应用程序变得尽可能简单。
除了简化初始设置,ONCE 还提供自动更新、备份和系统信息。
它提供了一个带有仪表板的 TUI 界面,用于监控和操作你的应用程序,同时也提供 CLI 命令以供常用操作(如果你(或你的 AI 代理)更喜欢这种方式)。
ONCE 运行在 Linux 和 macOS 上,并且可以用于在多种硬件上运行应用程序:物理服务器、云 VPS、Raspberry Pi 或笔记本电脑,这些都适用。
ONCE 内置了一组 37signals 应用程序,但你也可以使用它来安装任何兼容的 Docker 镜像。

## 安装
开始使用 ONCE 的最简单方法是使用安装代码片段来引导工具并选择要安装的应用程序:
```
curl https://get.once.com | sh
```
这将下载适用于你平台的二进制文件,安装它及其对应的后台服务,然后启动它,以便你可以进行第一次应用程序安装。
如果运行此命令的机器尚未安装 Docker,它也会自动安装(在支持的平台上)。
### 自定义安装行为
如果你希望在不启动 `once` 的情况下安装它(例如用于脚本化安装),可以使用 `ONCE_INTERACTIVE=false`:
```
curl https://get.once.com | ONCE_INTERACTIVE=false sh
```
### 手动安装
如果你希望自己设置 ONCE,可以从 GitHub Releases 页面下载相应的二进制文件。
然后按照以下步骤进行安装:
- 使用你喜欢的包管理器安装 Docker(如果尚未安装)
- 将 `once` 二进制文件复制到你希望运行的位置
- 运行 `sudo once background install` 注册后台服务
然后运行 `once` 来安装应用程序,或运行 `once --help` 查看可用命令。
注意,如果你在运行 Docker 命令时需要使用 `sudo`(例如,你的用户不在 `docker` 用户组中),那么每次运行 `once` 时你也需要使用 `sudo`。
## 使用 ONCE 安装和配置应用程序
首次运行时,ONCE 会提示你选择要安装的应用程序。
你可以从内置应用程序中选择,或输入 Docker 镜像的路径。
在输入镜像路径时,你可以选择任何与 ONCE 兼容的应用程序(更多细节见下文),因此你可以运行额外的应用程序,甚至可以运行内置应用程序的自定义分支。
你需要为应用程序输入一个主机名。
如果你在公网机器(如云 VPS)上安装,并且拥有域名,可以使用该域名。
建议使用子域名,以便在同一域名下运行多个应用程序。
例如,如果你拥有 `example.com`,你可以将 Writebook 安装到 `books.example.com`。
无论你选择什么主机名,请确保你有一个 DNS 记录指向你正在安装的机器。
具体操作方法取决于你使用的 DNS 提供商,但通常你需要访问管理界面,设置一个指向你机器 IP 地址的 `A` 记录,并使用你选择的主机名。
如果你计划在同一个机器上安装多个应用程序,可以使用通配符 DNS 记录。
---
选择应用程序并输入主机名后,其余操作将自动完成。
ONCE 将获取、安装并启动应用程序,然后带你进入仪表板界面进行监控。
### 修改应用程序设置
你可以对应用程序进行多种额外设置。
当你在仪表板上选中一个应用程序后,按 `s` 查看设置菜单,然后从菜单中选择一项以打开对应页面。
在那里你可以设置自动备份的位置、更新主机名、切换使用自己的分支镜像、配置邮件提供者等等。
你也可以使用操作菜单(`a`)来启动或停止应用程序,或将其完全移除。
### 自定义 `once` 的外观
首次运行时,`once` 会显示动画 Logo 和背景。
如果你觉得这分散注意力,或者它在你的环境中引起问题,可以通过设置 `ONCE_REDUCED_MOTION=true` 来禁用它:
```
ONCE_REDUCED_MOTION=true once
```
## 制作一个兼容 ONCE 的应用程序
从根本上说,ONCE 适用于任何满足以下条件的 Web 应用程序:
- 被打包为 Docker 容器
- 在 80 端口提供 HTTP 服务
- 在 `/up` 路径提供健康检查端点并返回成功
- 将持久化数据存储在 `/storage` 中
任何满足这些条件的应用程序都应该能与 ONCE 兼容。
但除此之外,还有一些额外的脚本和环境变量可以实现与平台的更好集成:
### 存储路径
ONCE 会将一个持久化卷挂载到 `/storage`。
为了与标准 Rails 应用程序兼容,它也会将同一卷挂载到 `/rails/storage`。
这意味着使用默认 Dockerfile 构建的 Rails 应用程序可以正常运行。
此卷中的数据在重启后仍然存在,并且也会被包含在备份中。
### 钩子脚本
ONCE 使用一些可选的钩子脚本作为集成点。
目前支持的钩子包括:
- `/hooks/pre-backup` —— 因为 ONCE 无法假设在应用程序运行时备份文件是安全的,它会在开始备份前调用此钩子,以便应用程序可以执行任何操作以生成“安全”的数据副本。
如果此脚本存在并成功返回,ONCE 会认为现在可以安全地将文件复制到备份中。
如果脚本不存在或返回错误,ONCE 将暂停应用程序容器以复制文件。
这确保了在任何情况下备份都是一致的,但钩子允许应用程序避免因暂停容器而引入请求延迟。
例如,对于基于 SQLite 的应用程序,可以使用 SQLite 的在线备份功能来获取安全一致的数据库副本。
- `/hooks/post-restore` —— 与 `pre-backup` 相反,`post-restore` 会在从备份恢复数据后、启动应用程序之前被调用。
如果应用程序需要在恢复后执行清理操作(如移动或重命名 `pre-backup` 期间生成的文件),可以在此钩子中完成。
### 环境变量
许多在 ONCE 界面中可配置的设置会以环境变量的形式传递到应用程序中。
这些包括:
- `SECRET_KEY_BASE` —— 一个在安装时生成的唯一标识符,应用程序生命周期内保持不变。
按照惯例,Rails 应用程序将其用作加密签名的基础。
- `DISABLE_SSL` —— 如果应用程序在无 SSL 模式下运行,则设置为 `true`。
这对于生成重定向或 URL 的应用程序很有用,这些 URL 默认假设使用了 SSL。
- `VAPID_PUBLIC_KEY` / `VAPID_PRIVATE_KEY` —— 对于使用 WebPush 的应用程序,会自动生成唯一的 VAPID 凭证并通过这些变量传递。
- `SMTP_ADDRESS` / `SMTP_PORT` / `SMTP_USERNAME` / `SMTP_PASSWORD` / `MAILER_FROM_ADDRESS` —— 这些变量会传递你在邮件设置界面中填入的值。
- `NUM_CPUS` —— 如果应用程序受到 CPU 配额限制,此变量将包含允许使用的 CPU 数量。
应用程序可以使用此变量来调整生成的工作进程数量,以适配对应的配额。
标签:Docker, EVTX分析, TUI界面, 一键安装, 云VPS, 后台服务, 备份, 安全防御评估, 安装引导, 开源, 文档结构分析, 物理服务器, 特权提升, 监控面板, 笔记本电脑, 系统信息, 自动化部署, 自动更新, 自托管, 请求拦截