✅ 已优化:代码已支持环境变量配置,可灵活部署到任何环境
-
开发环境(默认)
# .env UPLOAD_DIR=./uploads -
阿里云 ECS
# .env UPLOAD_DIR=/data/cogniflow/uploads # 创建目录 sudo mkdir -p /data/cogniflow/uploads sudo chown -R $USER:$USER /data/cogniflow/uploads
-
验证配置
# 运行检查脚本 ./scripts/check-upload-dir.sh # 或启动应用查看日志 pnpm run dev:server # 查看输出中的 "上传目录配置" 信息
用户上传文件
↓
保存到: $UPLOAD_DIR/images/1234567890-abc.jpg
↓
数据库存储: images/1234567890-abc.jpg (相对路径)
↓
访问时: $UPLOAD_DIR + 相对路径 = 完整路径
优势:
- ✅ 数据库记录与实际存储位置解耦
- ✅ 更换服务器只需修改环境变量
- ✅ 不需要修改数据库数据
- ✅ 支持多环境部署
$UPLOAD_DIR/
├── images/ # 图片文件
│ └── 1234567890-abc.jpg
├── documents/ # 文档文件
│ └── 1234567890-xyz.pdf
├── videos/ # 视频文件
├── audios/ # 音频文件
├── others/ # 其他文件
└── thumbnails/ # 缩略图
# .env
UPLOAD_DIR=./uploads
# 自动创建在项目目录下
# /path/to/cogniflow/uploads/# .env
UPLOAD_DIR=/data/cogniflow/uploads
# 使用独立的数据目录
# 好处:与代码分离,易于备份和迁移# docker-compose.yml
services:
cogniflow:
volumes:
- /data/cogniflow/uploads:/app/uploads
environment:
- UPLOAD_DIR=/app/uploads# 所有实例共享 NFS 或 OSS
UPLOAD_DIR=/mnt/shared-storage/cogniflow/uploads
# 或使用对象存储
# (需要代码扩展支持 OSS SDK)步骤 1: 同步文件
# 方式 1: rsync (推荐)
rsync -avz --progress ./uploads/ \
user@ecs-ip:/data/cogniflow/uploads/
# 方式 2: 打包传输
tar -czf uploads.tar.gz uploads/
scp uploads.tar.gz user@ecs-ip:/tmp/
# 在 ECS 上解压到 /data/cogniflow/uploads/步骤 2: 导出导入数据库
# 本地导出
pg_dump -U cogniflow_user cogniflow > backup.sql
# ECS 导入
psql -U cogniflow_user cogniflow < backup.sql步骤 3: 配置生产环境
# ECS 上的 .env
UPLOAD_DIR=/data/cogniflow/uploads步骤 4: 启动应用
pnpm install
pnpm run build
pnpm run start步骤 1: 备份旧服务器数据
# 备份数据库
pg_dump -U cogniflow_user cogniflow > backup.sql
# 备份上传文件
tar -czf uploads-backup.tar.gz /data/cogniflow/uploads/步骤 2: 新服务器配置
# 创建目录
sudo mkdir -p /data/cogniflow/uploads
sudo chown -R app-user:app-user /data/cogniflow/uploads
# 配置 .env
echo "UPLOAD_DIR=/data/cogniflow/uploads" >> .env步骤 3: 恢复数据
# 恢复数据库
psql -U cogniflow_user cogniflow < backup.sql
# 恢复文件
tar -xzf uploads-backup.tar.gz -C /可能原因:
UPLOAD_DIR配置错误- 目录权限不足
- 文件没有真正上传成功
检查方法:
# 1. 查看应用日志
journalctl -u cogniflow -n 50
# 2. 检查配置
cat .env | grep UPLOAD_DIR
# 3. 验证目录
ls -la /data/cogniflow/uploads/images/
# 4. 检查权限
ls -ld /data/cogniflow/uploads答:不需要!
数据库中存储的是相对路径(如 images/xxx.jpg),与 UPLOAD_DIR 无关。
只需要配置环境变量,代码会自动拼接完整路径。
答:运行检查脚本
./scripts/check-upload-dir.sh或查看应用启动日志:
📁 [AttachmentService] 上传目录配置:
UPLOAD_BASE_DIR: /data/cogniflow/uploads ← 应该是你期望的路径
THUMBNAIL_DIR: /data/cogniflow/uploads/thumbnails
当前工作目录: /home/ubuntu/cogniflow
环境变量 UPLOAD_DIR: /data/cogniflow/uploads
答:可以,但需要额外开发。
当前架构支持本地文件系统。要使用 OSS:
- 安装 OSS SDK:
pnpm add ali-oss - 修改
attachmentService.ts - 配置 OSS 凭证
或者保持当前架构,使用 ECS + 数据盘的方案也很稳定。
-
使用绝对路径(生产环境)
UPLOAD_DIR=/data/cogniflow/uploads
-
独立的数据目录
- 不要放在代码目录下
- 便于备份和迁移
- 代码更新不影响数据
-
设置合理的权限
sudo chown app-user:app-user /data/cogniflow/uploads sudo chmod 755 /data/cogniflow/uploads
-
定期备份
# 添加到 crontab 0 3 * * * tar -czf /backup/uploads-$(date +\%Y\%m\%d).tar.gz \ /data/cogniflow/uploads/
-
不要硬编码路径
// ❌ 错误 const uploadDir = '/home/ubuntu/uploads'; // ✅ 正确 const uploadDir = process.env.UPLOAD_DIR || './uploads';
-
不要在数据库存绝对路径
-- ❌ 错误 INSERT INTO attachments (file_path) VALUES ('/data/cogniflow/uploads/images/xxx.jpg'); -- ✅ 正确 INSERT INTO attachments (file_path) VALUES ('images/xxx.jpg');
-
不要忽略权限问题
# 确保应用进程有权限 ls -la /data/cogniflow/uploads/ # drwxr-xr-x app-user app-user ← 应该是应用运行的用户
# 查看上传目录大小
du -sh /data/cogniflow/uploads
# 按类型统计
du -h --max-depth=1 /data/cogniflow/uploads
# 监控磁盘空间
df -h /data# 查找大文件
find /data/cogniflow/uploads -type f -size +50M
# 清理临时文件(如果有)
find /data/cogniflow/uploads/temp -mtime +7 -delete- 使用 SSD 数据盘(阿里云 ECS)
- 启用文件系统缓存
- 配置 CDN(高流量场景)
- 考虑对象存储(大规模场景)
| 项目 | 说明 |
|---|---|
| 数据库 | 存储相对路径 (如 images/xxx.jpg) |
| 环境变量 | UPLOAD_DIR 配置基础目录 |
| 代码 | 自动拼接: UPLOAD_DIR + 相对路径 |
| 迁移 | 只需同步文件 + 修改环境变量 |
| 优势 | 灵活、可移植、易维护 |
一句话总结:配置好 UPLOAD_DIR 环境变量,其他的交给系统处理!