Files
home-automation/README.md
T

261 lines
6.6 KiB
Markdown
Raw Normal View History

2025-07-15 17:44:39 +02:00
# Home Automation Backend
2026-04-19 20:19:58 +02:00
这是当前 `home-automation` 项目的 Python 重构基础骨架。当前仓库仍保留 Go 版本作为事实基线,而这个 Python 部分的目标是为后续逐模块迁移提供稳定工程基础。
为便于清理仓库,重构开始前就存在的 Go 实现和相关资产已经统一移动到 `legacy/go-backend/`。这样在 Python 重构完成后,可以按目录整体删除旧实现。
当前阶段只包含:
- FastAPI 基础应用骨架
- 环境变量配置体系
- SQLite + SQLAlchemy + Alembic 基础设施
2026-04-20 15:16:47 +02:00
- username/password + server-side session 基础鉴权
2026-04-19 20:19:58 +02:00
- 极简 server-side templates
- location recorder 第一版迁移
- poo recorder 第一版迁移
2026-04-20 10:11:02 +02:00
- Home Assistant outbound integration layer
2026-04-20 10:42:35 +02:00
- Home Assistant inbound gateway 第一版
2026-04-19 20:19:58 +02:00
- pytest 测试基础
- OpenAPI 导出脚本
- Docker / Compose 基础骨架
当前阶段明确不包含:
- TickTick 业务逻辑迁移
- Notion 模块
2026-04-20 10:42:35 +02:00
当前 Home Assistant inbound gateway 仅接回第一版:
- 已支持 `location_recorder / record`
- 尚未接回 TickTick 路径
- 尚未接回 poo recorder 路径
2026-04-19 20:19:58 +02:00
Notion 在 Go 版本中仍然存在,但已被明确视为 legacy / removed scope,不进入新的 Python 系统目标。
旧 Go 代码位置:
- `legacy/go-backend/src/`
- `legacy/go-backend/helper/`
- `legacy/go-backend/.github/workflows/`
## 当前配置现实
2026-04-20 15:16:47 +02:00
当前系统仍然是三个独立的 SQLite 数据库文件,而不是单一数据库:
2026-04-20 15:16:47 +02:00
- `app` 级共享数据使用自己的 DB 文件
- `location` 模块使用自己的 DB 文件
- `poo` 模块使用自己的 DB 文件
2026-04-20 15:16:47 +02:00
当前阶段明确不借这次重构把这些 DB 合并。配置层已经显式反映这一点:
2026-04-20 15:16:47 +02:00
- `APP_DATABASE_URL`
- `LOCATION_DATABASE_URL`
- `POO_DATABASE_URL`
2026-04-20 15:16:47 +02:00
目前 auth、`location``poo` 都已经接到各自独立的数据库文件。
其中 `app` 级共享 DB 当前主要用于:
- 单个 admin 用户
- server-side session
这部分现在也使用 Alembic 管理:
- `app db` 不会在应用启动时自动创建
- 需要先运行 `python scripts/app_db_adopt.py`
- 这个脚本会创建新 DB 并建好 schema
2026-04-19 20:19:58 +02:00
## 当前目录
Python 骨架的主要目录如下:
- `app/`: FastAPI 应用代码
2026-04-20 15:16:47 +02:00
- `alembic_app/`: App DB 的 Alembic migration 环境
- `alembic_location/`: Location DB 的 Alembic migration 环境
- `alembic_poo/`: Poo DB 的 Alembic migration 环境
2026-04-19 20:19:58 +02:00
- `tests/`: pytest 测试
- `docs/`: 架构说明与迁移文档
- `scripts/`: 辅助脚本,例如 OpenAPI 导出
## 依赖管理
项目现在采用 `pip-tools` 管理依赖:
- 生产依赖源文件:`requirements.in`
- 开发依赖源文件:`dev-requirements.in`
- 编译产物:
- `requirements.txt`
- `dev-requirements.txt`
更新依赖时建议使用:
```bash
python -m venv .venv
source .venv/bin/activate
pip install pip-tools
pip-compile requirements.in
pip-compile dev-requirements.in
```
如果要升级某个依赖,可以用:
```bash
pip-compile --upgrade-package fastapi requirements.in
pip-compile dev-requirements.in
```
## 本地启动
建议使用 Python 3.11 或以上版本。
1. 创建虚拟环境并安装依赖
```bash
python -m venv .venv
source .venv/bin/activate
pip install -r dev-requirements.txt
```
2. 准备环境变量
```bash
cp .env.example .env
```
2026-04-20 15:16:47 +02:00
3. 初始化数据库
```bash
python scripts/app_db_adopt.py
python scripts/location_db_adopt.py
python scripts/poo_db_adopt.py
```
4. 启动服务
2026-04-19 20:19:58 +02:00
```bash
uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
```
启动后可访问:
- 应用首页:`http://localhost:8000/`
- 健康检查:`http://localhost:8000/status`
- Swagger UI`http://localhost:8000/docs`
- ReDoc`http://localhost:8000/redoc`
## 数据库与 Alembic
2026-04-20 15:16:47 +02:00
当前默认仍使用 SQLite,但要明确区分三个数据库文件:
2026-04-19 20:19:58 +02:00
2026-04-20 15:16:47 +02:00
- App DB`sqlite:///./data/app.db`
- Location DB`sqlite:///./data/locationRecorder.db`
- Poo DB`sqlite:///./data/pooRecorder.db`
2026-04-19 20:19:58 +02:00
- 数据目录:`./data/`
初始化 migration 环境后,可继续添加模型并生成迁移:
2026-04-20 15:16:47 +02:00
当前 `app``location``poo` 都已经有各自独立的 Alembic 链路。
2026-04-19 20:19:58 +02:00
2026-04-20 15:16:47 +02:00
- App Alembic 环境:`alembic_app.ini` + `alembic_app/`
- Location Alembic 环境:`alembic_location.ini` + `alembic_location/`
- Poo Alembic 环境:`alembic_poo.ini` + `alembic_poo/`
2026-04-20 15:16:47 +02:00
- App DB 初始化:`python scripts/app_db_adopt.py`
- Location DB 接管 / 初始化:`python scripts/location_db_adopt.py`
- Poo DB 接管 / 初始化:`python scripts/poo_db_adopt.py`
2026-04-19 20:19:58 +02:00
2026-04-20 15:16:47 +02:00
## 基础鉴权
当前项目已经有一层小范围的基础鉴权,目标是先保护后续配置页面,而不是现在就做完整 admin system。
- 认证模型:`username/password`
- 会话模型:server-side session + cookie
- 当前受保护页面:`/admin`
- 当前公开页面:`/``/login`
- 当前公开 API:现有业务 API 暂未在这一轮统一收口到 auth 下
安全实现的当前边界:
- 密码使用 scrypt 做哈希存储
- session cookie 使用 `HttpOnly`
- `Secure` 默认随 `APP_ENV` 切换:非 development 时默认开启
- `SameSite=Lax`
- 登录表单和登出表单都有基础 CSRF 防护
首次启动时,如果 `APP_DATABASE_URL` 对应的 auth DB 里还没有用户,应用会使用:
- `AUTH_BOOTSTRAP_USERNAME`
- `AUTH_BOOTSTRAP_PASSWORD`
创建初始 admin 用户。当前默认就是:
- username: `admin`
- password: `admin`
首次登录后会被要求立即修改密码。这个 bootstrap 只用于首个用户落库,不是后续的完整配置管理方案。
2026-04-19 20:19:58 +02:00
## 运行测试
```bash
pytest
```
当前测试包含:
- app 基本启动测试
- `/status` endpoint 测试
2026-04-20 15:16:47 +02:00
- 登录 / session 基础流程测试
2026-04-19 20:19:58 +02:00
## OpenAPI 导出
FastAPI 默认会暴露 OpenAPI。若需要导出静态 schema 文件,可运行:
```bash
python scripts/export_openapi.py
```
输出文件会写到:
- `openapi/openapi.json`
- `openapi/openapi.yaml`
2026-04-19 23:25:13 +02:00
`openapi/` 当前纳入版本控制。接口发生变更时,应重新运行导出脚本并同步提交生成的 schema 文件。
2026-04-19 20:19:58 +02:00
## 容器启动
1. 准备环境变量文件
```bash
cp .env.example .env
```
2. 启动容器
```bash
docker compose up --build
```
默认端口:
- `8000:8000`
SQLite 持久化目录:
- 本地 `./data`
- 容器内 `/app/data`
## 后续迁移建议
后续可以在当前骨架上继续迁移这些模块:
2026-04-19 20:19:58 +02:00
- TickTick integration
- Home Assistant integration
- poo records
建议继续参考:
- [当前系统盘点](docs/current-system-inventory.md)
- [Python 重构方案](docs/python-rewrite-plan.md)
- [迁移风险清单](docs/migration-risks.md)
- [Location Recorder 接管说明](docs/location-recorder.md)
2026-04-20 15:16:47 +02:00
- [基础鉴权说明](docs/auth.md)