mirror of
https://github.com/fawney19/Aether.git
synced 2026-09-01 17:00:21 +08:00
deploy: limit installer to supported modes
This commit is contained in:
87
README.md
87
README.md
@@ -55,82 +55,16 @@ docker compose pull && docker compose up -d
|
||||
docker compose -f docker-compose.sqlite.yml pull && docker compose -f docker-compose.sqlite.yml up -d
|
||||
```
|
||||
|
||||
### 一键安装(可选部署方式)
|
||||
### 一键安装(可选部署方式 Linux: systemd; Mac: launchd)
|
||||
|
||||
```bash
|
||||
curl -fsSL https://raw.githubusercontent.com/fawney19/Aether/main/install.sh | sudo bash
|
||||
```
|
||||
|
||||
```text
|
||||
请选择安装语言 / Choose installer language:
|
||||
1) 中文
|
||||
2) 英语 / English
|
||||
|
||||
请输入选项 / Enter choice [1]:
|
||||
|
||||
请选择 Aether 版本:
|
||||
1) 最新正式版
|
||||
2) 最新 RC 预发布版
|
||||
3) 最新 Beta 预发布版
|
||||
4) 指定 tag,例如 v0.7.0-rc.1
|
||||
|
||||
请输入选项 [1]:
|
||||
|
||||
请选择 Aether 部署模式:
|
||||
1) Docker Compose: 应用 + Postgres + Redis
|
||||
2) 单机服务: systemd/launchd + SQLite + 进程内运行时
|
||||
3) 集群节点服务: systemd/launchd + 共享数据库 + Redis
|
||||
4) Docker Compose: 应用 + SQLite
|
||||
|
||||
请输入选项 [2]:
|
||||
|
||||
是否使用下载加速源?
|
||||
1) 否,使用原始 GitHub 地址
|
||||
2) 是,手动填写新的下载 URL
|
||||
|
||||
请输入选项 [1]:
|
||||
```
|
||||
|
||||
安装后的常用命令(Linux systemd):
|
||||
|
||||
```bash
|
||||
sudo systemctl status aether-gateway --no-pager
|
||||
sudo journalctl -u aether-gateway -f
|
||||
sudo systemctl restart aether-gateway
|
||||
```
|
||||
|
||||
安装后的常用命令(macOS launchd):
|
||||
|
||||
```bash
|
||||
sudo launchctl print system/com.aether.gateway
|
||||
sudo launchctl kickstart -k system/com.aether.gateway
|
||||
sudo launchctl bootout system /Library/LaunchDaemons/com.aether.gateway.plist
|
||||
tail -f /var/log/aether/aether-gateway.out.log /var/log/aether/aether-gateway.err.log
|
||||
```
|
||||
|
||||
macOS 原生安装使用系统级 LaunchDaemon,默认以专用 `_aether` 服务账号运行;配置和密钥写入 `/etc/aether/aether-gateway.env`,数据和应用日志仍在 `/opt/aether`,launchd stdout/stderr 在 `/var/log/aether`。
|
||||
|
||||
默认单机数据和应用日志都在安装目录内:
|
||||
|
||||
```text
|
||||
/opt/aether/data/aether.db
|
||||
/opt/aether/logs
|
||||
```
|
||||
|
||||
多节点不能使用 SQLite 或 `AETHER_RUNTIME_BACKEND=memory`。如果先只生成了多节点模板,编辑 `/etc/aether/aether-gateway.env` 后重跑安装脚本即可:
|
||||
|
||||
```env
|
||||
AETHER_GATEWAY_DEPLOYMENT_TOPOLOGY=multi-node
|
||||
AETHER_GATEWAY_NODE_ROLE=frontdoor
|
||||
DATABASE_URL=postgresql://...
|
||||
REDIS_URL=redis://...
|
||||
```
|
||||
|
||||
## Aether Proxy (可选)
|
||||
|
||||
Aether Proxy 是配套的正向代理节点,部署在海外 VPS 上,为墙内的 Aether 实例中转 API 流量。或者部署在其他服务器为指定的提供商、账号、Key使用不同的节点访问。支持 TUI 向导一键配置、systemd 服务管理、TLS 加密、DNS 缓存及连接池调优。
|
||||
Aether Proxy 是配套的正向代理节点,部署在海外 VPS 上,为墙内的 Aether 实例中转 API 流量。
|
||||
|
||||
- Docker Compose 部署或下载预编译二进制直接运行
|
||||
- 通过 `aether-proxy setup` 完成交互式配置,自动注册为系统服务
|
||||
- 详细文档见 [apps/aether-proxy/README.md](apps/aether-proxy/README.md)
|
||||
|
||||
@@ -141,29 +75,18 @@ Aether Proxy 是配套的正向代理节点,部署在海外 VPS 上,为墙
|
||||
|
||||
## 环境变量
|
||||
|
||||
部署建议:
|
||||
|
||||
- Docker Compose:根目录 [`.env.example`](.env.example)
|
||||
- systemd 二进制部署:使用根目录 `install.sh` 生成 `/etc/aether/aether-gateway.env`
|
||||
|
||||
当前主链路真正要关注的是这组变量:
|
||||
|
||||
- `APP_PORT`:`aether-gateway` 唯一监听端口,固定绑定 `0.0.0.0:${APP_PORT}`
|
||||
- `AETHER_DATABASE_DRIVER` / `AETHER_DATABASE_URL`:二进制单机部署可用 `sqlite`,例如 `sqlite:///opt/aether/data/aether.db`
|
||||
- `DATABASE_URL` / `REDIS_URL`:共享后端连接串;多节点必须配置共享数据库和 Redis
|
||||
- `AETHER_RUNTIME_BACKEND=memory|redis`:运行时缓存/协调后端。单机 SQLite 默认用 `memory`,不会连接 Redis;显式设为 `redis` 或多节点部署才会把 `REDIS_URL` 注入运行时 Redis 后端
|
||||
- `DATABASE_URL`:数据库连接串;SQLite 例如 `sqlite:///opt/aether/data/aether.db`,Postgres 例如 `postgresql://postgres:aether@postgres:5432/aether`
|
||||
- `REDIS_URL`:Redis 连接串;仅 Postgres + Redis 的 Docker Compose 部署需要配置
|
||||
- `AETHER_RUNTIME_BACKEND=memory|redis`:运行时缓存/协调后端。SQLite 默认用 `memory`,不会连接 Redis
|
||||
- `AETHER_GATEWAY_AUTO_PREPARE_DATABASE`:常规启动前自动执行挂起的 schema migration 和 backfill;仓库自带的 `docker-compose.yml` 默认开启
|
||||
- `JWT_SECRET_KEY` / `ENCRYPTION_KEY`:认证和敏感数据加密所需密钥
|
||||
- `API_KEY_PREFIX`:用户和管理员新建 API Key 时使用的前缀,默认 `sk`
|
||||
- `ADMIN_USERNAME` / `ADMIN_PASSWORD` / `ADMIN_EMAIL`:首次启动时自举首个本地管理员;`install.sh` 会提示输入管理员密码
|
||||
- `CORS_ORIGINS` / `CORS_ALLOW_CREDENTIALS`:前端跨域来源控制;如果要跨域带登录 Cookie,`CORS_ORIGINS` 不能写 `*`
|
||||
- `AETHER_GATEWAY_DEPLOYMENT_TOPOLOGY=single-node|multi-node`
|
||||
- `AETHER_GATEWAY_NODE_ROLE=all|frontdoor|background`
|
||||
- `RUST_LOG`:Rust 日志过滤,例如 `aether_gateway=info`、`aether_gateway=debug,sqlx=warn`
|
||||
- Docker Compose 的 `DB_PASSWORD` / `REDIS_PASSWORD` 默认使用 `aether`
|
||||
|
||||
systemd 的 `.env` 必须保持简单 `KEY=VALUE` 形式,不要写 `export`、`${VAR}` 或命令替换。
|
||||
|
||||
---
|
||||
|
||||
## 许可证
|
||||
|
||||
58
install.sh
58
install.sh
@@ -49,11 +49,10 @@ Usage: install.sh [options]
|
||||
Install Aether Gateway.
|
||||
|
||||
Options:
|
||||
--mode MODE Deployment mode: compose, compose-sqlite, single, or cluster
|
||||
--mode MODE Deployment mode: compose, compose-sqlite, or single
|
||||
compose: Docker Compose app + Postgres + Redis
|
||||
compose-sqlite: Docker Compose app + SQLite
|
||||
single: system service with SQLite + in-process runtime
|
||||
cluster: system service connected to shared database + Redis
|
||||
single: system service with SQLite
|
||||
Linux services use systemd; macOS services use launchd
|
||||
--channel CHANNEL Release channel to resolve when --version is omitted: stable, latest, rc, or beta
|
||||
stable/latest resolves the latest stable tag (default)
|
||||
@@ -81,7 +80,6 @@ Environment overrides:
|
||||
AETHER_IMAGE_REPO, AETHER_APP_IMAGE
|
||||
INSTALL_ROOT, AETHER_COMPOSE_DIR, CONFIG_DIR, SERVICE_USER, SERVICE_GROUP
|
||||
ADMIN_PASSWORD (required for non-interactive first install when generating a new env)
|
||||
DATABASE_URL, REDIS_URL (required when generating a cluster env)
|
||||
EOF
|
||||
}
|
||||
|
||||
@@ -445,56 +443,52 @@ select_mode() {
|
||||
return
|
||||
;;
|
||||
cluster|multi|multi-node)
|
||||
MODE="cluster"
|
||||
return
|
||||
if ui_is_zh; then
|
||||
die "集群部署模式暂未开放;请先选择 compose、compose-sqlite 或 single"
|
||||
else
|
||||
die "cluster deployment mode is temporarily disabled; choose compose, compose-sqlite, or single"
|
||||
fi
|
||||
;;
|
||||
auto|"")
|
||||
;;
|
||||
*)
|
||||
die "unsupported install mode: ${MODE}; expected compose, compose-sqlite, single, or cluster"
|
||||
die "unsupported install mode: ${MODE}; expected compose, compose-sqlite, or single"
|
||||
;;
|
||||
esac
|
||||
|
||||
if interactive_tty_available; then
|
||||
local service_manager
|
||||
service_manager="$(service_manager_name)"
|
||||
if ui_is_zh; then
|
||||
cat >/dev/tty <<EOF
|
||||
|
||||
请选择 Aether 部署模式:
|
||||
1) Docker Compose: 应用 + Postgres + Redis
|
||||
2) 单机服务: ${service_manager} + SQLite + 进程内运行时
|
||||
3) 集群节点服务: ${service_manager} + 共享数据库 + Redis
|
||||
4) Docker Compose: 应用 + SQLite
|
||||
1) Docker Compose 应用: Postgres + Redis
|
||||
3) Docker Compose 应用: 仅SQLite
|
||||
4) 系统服务: 仅SQLite
|
||||
|
||||
请输入选项 [2]:
|
||||
请输入选项 [4]:
|
||||
EOF
|
||||
else
|
||||
cat >/dev/tty <<EOF
|
||||
|
||||
Choose Aether deployment mode:
|
||||
1) Docker Compose: app + Postgres + Redis
|
||||
2) Single-node service: ${service_manager} + SQLite + in-process runtime
|
||||
3) Cluster node service: ${service_manager} + shared database + Redis
|
||||
4) Docker Compose: app + SQLite
|
||||
1) Docker Compose app: Postgres + Redis
|
||||
3) Docker Compose app: SQLite only
|
||||
4) System service: SQLite only
|
||||
|
||||
Enter choice [2]:
|
||||
Enter choice [4]:
|
||||
EOF
|
||||
fi
|
||||
local choice
|
||||
IFS= read -r choice </dev/tty || choice=""
|
||||
case "${choice:-2}" in
|
||||
case "${choice:-4}" in
|
||||
1)
|
||||
MODE="compose"
|
||||
;;
|
||||
2)
|
||||
MODE="single"
|
||||
;;
|
||||
3)
|
||||
MODE="cluster"
|
||||
MODE="compose-sqlite"
|
||||
;;
|
||||
4)
|
||||
MODE="compose-sqlite"
|
||||
MODE="single"
|
||||
;;
|
||||
*)
|
||||
if ui_is_zh; then
|
||||
@@ -945,16 +939,13 @@ AETHER_LOG_RETENTION_DAYS=7
|
||||
AETHER_LOG_MAX_FILES=30
|
||||
|
||||
APP_PORT=${APP_PORT:-8084}
|
||||
AETHER_GATEWAY_DEPLOYMENT_TOPOLOGY=single-node
|
||||
AETHER_GATEWAY_NODE_ROLE=all
|
||||
AETHER_GATEWAY_STATIC_DIR=${INSTALL_ROOT}/current/frontend
|
||||
AETHER_GATEWAY_VIDEO_TASK_TRUTH_SOURCE_MODE=rust-authoritative
|
||||
AETHER_GATEWAY_AUTO_PREPARE_DATABASE=true
|
||||
AETHER_RUNTIME_BACKEND=memory
|
||||
API_KEY_PREFIX=sk
|
||||
|
||||
AETHER_DATABASE_DRIVER=sqlite
|
||||
AETHER_DATABASE_URL=sqlite://${INSTALL_ROOT}/data/aether.db
|
||||
DATABASE_URL=sqlite://${INSTALL_ROOT}/data/aether.db
|
||||
|
||||
JWT_SECRET_KEY=${jwt_key}
|
||||
ENCRYPTION_KEY=${encryption_key}
|
||||
@@ -1074,16 +1065,13 @@ AETHER_LOG_MAX_FILES=30
|
||||
|
||||
APP_IMAGE=$(compose_image)
|
||||
APP_PORT=${APP_PORT:-8084}
|
||||
AETHER_GATEWAY_DEPLOYMENT_TOPOLOGY=single-node
|
||||
AETHER_GATEWAY_NODE_ROLE=all
|
||||
AETHER_GATEWAY_STATIC_DIR=/srv/frontend
|
||||
AETHER_GATEWAY_VIDEO_TASK_TRUTH_SOURCE_MODE=rust-authoritative
|
||||
AETHER_GATEWAY_AUTO_PREPARE_DATABASE=true
|
||||
AETHER_RUNTIME_BACKEND=memory
|
||||
API_KEY_PREFIX=sk
|
||||
|
||||
AETHER_DATABASE_DRIVER=sqlite
|
||||
AETHER_DATABASE_URL=sqlite:///app/data/aether.db
|
||||
DATABASE_URL=sqlite:///app/data/aether.db
|
||||
|
||||
JWT_SECRET_KEY=${JWT_SECRET_KEY:-${jwt_key}}
|
||||
ENCRYPTION_KEY=${ENCRYPTION_KEY:-${encryption_key}}
|
||||
@@ -1242,7 +1230,7 @@ ensure_env_matches_requested_mode() {
|
||||
[[ "${topology}" == "multi-node" ]] || die "existing env ${file} is ${topology}; set AETHER_GATEWAY_DEPLOYMENT_TOPOLOGY=multi-node or use --mode single"
|
||||
cluster_env_has_required_backends "${file}" || die "existing multi-node env ${file} must define DATABASE_URL and REDIS_URL"
|
||||
elif [[ "${mode}" == "single" && "${topology}" == "multi-node" ]]; then
|
||||
die "existing env ${file} is multi-node; use --mode cluster or edit the env file"
|
||||
die "existing env ${file} is multi-node; cluster mode is temporarily disabled, edit the env file"
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -1381,7 +1369,7 @@ validate_env_file() {
|
||||
[[ -z "${video_task_store_path}" ]] || die "multi-node deployment must not set AETHER_GATEWAY_VIDEO_TASK_STORE_PATH"
|
||||
else
|
||||
if [[ "${node_role}" != "all" ]]; then
|
||||
warn "single-node deployment usually uses AETHER_GATEWAY_NODE_ROLE=all; split roles are only useful for cluster drills"
|
||||
warn "single-node deployment usually uses AETHER_GATEWAY_NODE_ROLE=all; split roles are not enabled by this installer"
|
||||
fi
|
||||
if [[ "${runtime_backend}" == "redis" && -z "${redis_url}" ]]; then
|
||||
die "AETHER_RUNTIME_BACKEND=redis requires REDIS_URL or AETHER_GATEWAY_DATA_REDIS_URL"
|
||||
|
||||
Reference in New Issue
Block a user