Files
MoviePilot/docs/postgresql-setup.md
2025-08-23 22:26:34 +08:00

198 lines
5.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# PostgreSQL 数据库配置指南
MoviePilot 现在支持 PostgreSQL 数据库,您可以根据需要选择使用 SQLite 或 PostgreSQL。
## 配置选项
### 1. 数据库类型选择
`config/app.env` 文件中设置:
```bash
# 使用 SQLite默认
DB_TYPE=sqlite
# 使用 PostgreSQL
DB_TYPE=postgresql
```
### 2. PostgreSQL 配置参数
`DB_TYPE=postgresql` 时,以下配置生效:
```bash
# PostgreSQL 主机地址
DB_POSTGRESQL_HOST=localhost
# PostgreSQL 端口
DB_POSTGRESQL_PORT=5432
# PostgreSQL 数据库名
DB_POSTGRESQL_DATABASE=moviepilot
# PostgreSQL 用户名
DB_POSTGRESQL_USERNAME=moviepilot
# PostgreSQL 密码
DB_POSTGRESQL_PASSWORD=moviepilot
# PostgreSQL 连接池大小
DB_POSTGRESQL_POOL_SIZE=20
# PostgreSQL 连接池溢出数量
DB_POSTGRESQL_MAX_OVERFLOW=30
```
## Docker 部署
### 使用外部 PostgreSQL
如果您想使用外部的 PostgreSQL 服务:
1. 确保外部 PostgreSQL 服务已启动并可访问
2. 设置环境变量指向外部服务:
```bash
DB_TYPE=postgresql
DB_POSTGRESQL_HOST=your-postgresql-host
DB_POSTGRESQL_PORT=5432
DB_POSTGRESQL_DATABASE=moviepilot
DB_POSTGRESQL_USERNAME=your-username
DB_POSTGRESQL_PASSWORD=your-password
```
## 数据迁移
### 从 SQLite 迁移到 PostgreSQL
1. 备份现有的 SQLite 数据库文件(`config/user.db`
2. 修改配置为 PostgreSQL
3. 启动应用,数据库表会自动创建
4. 使用数据库迁移工具或手动导入数据
#### 注意事项
完成数据迁移后需要对postgresql中的表进行索引初始值进行更新否则会出现唯一索引已存在的异常
例如:
```json
EventType.SiteUpdated
SiteChain.cache_site_userdata
(psycopg2.errors.UniqueViolation) duplicate key value violates unique constraint "siteuserdata_pkey"
DETAIL: Key (id)=(18) already exists.
[SQL: INSERT INTO siteuserdata (domain, name, username, userid, user_level, join_at, bonus, upload, download, ratio, seeding, leeching, seeding_size, leeching_size, seeding_info, message_unread, message_unread_contents, err_msg, updated_day, updated_time) VALUES (%(domain)s, %(name)s, %(username)s, %(userid)s, %(user_level)s, %(join_at)s, %(bonus)s, %(upload)s, %(download)s, %(ratio)s, %(seeding)s, %(leeching)s, %(seeding_size)s, %(leeching_size)s, %(seeding_info)s::JSON, %(message_unread)s, %(message_unread_contents)s::JSON, %(err_msg)s, %(updated_day)s, %(updated_time)s) RETURNING siteuserdata.id]
[parameters: {'domain': 'btschool.club', 'name': '', 'username': None, 'userid': None, 'user_level': None, 'join_at': None, 'bonus': 0.0, 'upload': 0, 'download': 0, 'ratio': 0.0, 'seeding': 0, 'leeching': 0, 'seeding_size': 0, 'leeching_size': 0, 'seeding_info': '[]', 'message_unread': 0, 'message_unread_contents': '[]', 'err_msg': 'cookies', 'updated_day': '2025-08-22', 'updated_time': '09:52:01'}]
(Background on this error at: https://sqlalche.me/e/20/gkpj)
```
需要对每一个表分别执行下面的语句(下面的SQL以`workflowc`数据表为例,每张表请自行修改,其中`user`表因为关键字原因,应该写成`public.user`的方式)
```sql
DO $$
DECLARE
max_id INTEGER;
BEGIN
-- 查询最大 ID 值
SELECT COALESCE(MAX(id), 0) INTO max_id FROM workflow;
-- 调整序列
EXECUTE format('ALTER SEQUENCE workflow_id_seq RESTART WITH %s', max_id + 1);
END $$;
```
### 从 PostgreSQL 迁移到 SQLite
1. 导出 PostgreSQL 数据
2. 修改配置为 SQLite
3. 启动应用,数据库表会自动创建
4. 导入数据到 SQLite
## 数据备份
### PostgreSQL 数据备份
PostgreSQL 数据存储在 `${CONFIG_DIR}/postgresql/` 目录中,您可以通过以下方式进行备份:
#### 1. 文件级备份
```bash
# 备份整个PostgreSQL数据目录
tar -czf postgresql_backup_$(date +%Y%m%d_%H%M%S).tar.gz config/postgresql/
```
#### 2. 数据库级备份
```bash
# 进入容器
docker exec -it moviepilot bash
# 使用pg_dump备份
pg_dump -h localhost -U moviepilot -d moviepilot > /config/moviepilot_backup.sql
# 或使用pg_dumpall备份所有数据库
pg_dumpall -h localhost -U moviepilot > /config/all_databases_backup.sql
```
#### 3. 恢复数据
```bash
# 恢复单个数据库
psql -h localhost -U moviepilot -d moviepilot < /config/moviepilot_backup.sql
# 恢复所有数据库
psql -h localhost -U moviepilot < /config/all_databases_backup.sql
```
## 性能优化
### PostgreSQL 优化建议
1. **连接池配置**
- 根据应用负载调整 `DB_POSTGRESQL_POOL_SIZE`
- 设置合适的 `DB_POSTGRESQL_MAX_OVERFLOW`
2. **数据库配置**
- 调整 `shared_buffers`
- 配置 `work_mem`
- 设置合适的 `maintenance_work_mem`
3. **索引优化**
- 为常用查询字段添加索引
- 定期执行 `VACUUM``ANALYZE`
## 故障排除
### 常见问题
1. **连接失败**
- 检查 PostgreSQL 服务是否启动
- 验证连接参数是否正确
- 确认网络连接和防火墙设置
2. **权限问题**
- 确保用户有足够的数据库权限
- 检查 `pg_hba.conf` 配置
3. **性能问题**
- 监控连接池使用情况
- 检查慢查询日志
- 优化数据库配置
### 日志查看
PostgreSQL 相关日志可以在以下位置查看:
- Docker 容器:`${CONFIG_DIR}/postgresql/logs/`
- 系统日志:`journalctl -u postgresql`
## 注意事项
1. **兼容性**PostgreSQL 支持从 MoviePilot v2.0 开始
2. **备份**:建议定期备份数据库
3. **版本**:建议使用 PostgreSQL 12 或更高版本
4. **字符集**:确保使用 UTF-8 字符集
## 技术支持
如果遇到问题,请:
1. 查看应用日志
2. 检查 PostgreSQL 日志
3. 在 GitHub Issues 中报告问题