Skip to content

Commit 68e1ff5

Browse files
committed
fix: 目录权限错误 Relate #7
1 parent f9617e3 commit 68e1ff5

4 files changed

Lines changed: 83 additions & 10 deletions

File tree

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,4 +124,5 @@ dmypy.json
124124
# Pyre type checker
125125
.pyre/
126126

127-
.codebuddy/
127+
.codebuddy/
128+
dev/

backend/Dockerfile

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,10 @@ RUN pip install --no-cache-dir -r requirements.txt
2626
# 复制应用代码
2727
COPY . .
2828

29-
# 创建必要的目录
30-
RUN mkdir -p uploads logs && \
31-
chown -R appuser:appgroup /app
29+
# 创建必要的目录和子目录
30+
RUN mkdir -p uploads/email_attachments logs data && \
31+
chown -R appuser:appgroup /app && \
32+
chmod -R 755 uploads logs data
3233

3334
# 切换到非root用户
3435
USER appuser

backend/app/services/attachment_service.py

Lines changed: 63 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,69 @@ class AttachmentService:
2323
"""附件处理服务类"""
2424

2525
def __init__(self):
26-
self.upload_dir = Path(settings.UPLOAD_DIR) / "email_attachments"
27-
self.upload_dir.mkdir(parents=True, exist_ok=True)
26+
"""初始化附件服务"""
27+
try:
28+
# 使用配置中的上传目录
29+
base_upload_dir = Path(getattr(settings, 'UPLOAD_DIR', 'uploads'))
30+
self.upload_dir = base_upload_dir / "email_attachments"
31+
32+
# 尝试创建目录
33+
self.upload_dir.mkdir(parents=True, exist_ok=True)
34+
35+
# 验证目录权限
36+
if not self._check_directory_permissions():
37+
raise PermissionError(f"无法写入上传目录: {self.upload_dir}")
38+
39+
logger.info(f"附件服务初始化成功,上传目录: {self.upload_dir}")
40+
41+
except PermissionError as e:
42+
logger.error(f"附件服务初始化失败 - 权限错误: {e}")
43+
# 尝试使用临时目录作为备选方案
44+
self._setup_fallback_directory()
45+
except Exception as e:
46+
logger.error(f"附件服务初始化失败: {e}")
47+
# 尝试使用临时目录作为备选方案
48+
self._setup_fallback_directory()
49+
50+
def _check_directory_permissions(self) -> bool:
51+
"""检查目录权限"""
52+
try:
53+
# 尝试创建测试文件
54+
test_file = self.upload_dir / ".permission_test"
55+
test_file.write_text("test")
56+
test_file.unlink()
57+
return True
58+
except Exception as e:
59+
logger.warning(f"目录权限检查失败: {e}")
60+
return False
61+
62+
def _setup_fallback_directory(self):
63+
"""设置备选目录"""
64+
try:
65+
import tempfile
66+
fallback_dir = Path(tempfile.gettempdir()) / "kb_upload_genie" / "email_attachments"
67+
fallback_dir.mkdir(parents=True, exist_ok=True)
68+
69+
# 验证备选目录权限
70+
if self._check_fallback_permissions(fallback_dir):
71+
self.upload_dir = fallback_dir
72+
logger.warning(f"使用临时目录作为上传目录: {self.upload_dir}")
73+
else:
74+
raise RuntimeError("无法找到可写的上传目录")
75+
76+
except Exception as e:
77+
logger.error(f"设置备选目录失败: {e}")
78+
raise RuntimeError(f"附件服务初始化完全失败: {e}")
79+
80+
def _check_fallback_permissions(self, directory: Path) -> bool:
81+
"""检查备选目录权限"""
82+
try:
83+
test_file = directory / ".permission_test"
84+
test_file.write_text("test")
85+
test_file.unlink()
86+
return True
87+
except Exception:
88+
return False
2889

2990
def _get_file_hash(self, file_data: bytes) -> str:
3091
"""计算文件哈希值"""

docker-compose.yml

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
services:
22
# 后端服务
33
backend:
4-
image:
5-
container_name: ghcr.io/pancrepal-xiaoyibao/kb-backend:latest
4+
image: ghcr.io/pancrepal-xiaoyibao/kb-backend:latest
5+
container_name: kb-backend
66
env_file:
77
- backend/.env
88
environment:
99
- PYTHONPATH=/app
1010
volumes:
1111
- backend_data:/app/data
12-
- backend_data:/app/uploads
12+
- backend_uploads:/app/uploads
1313
- backend_logs:/app/logs
1414
- ./backend/.env:/app/.env:ro
1515
networks:
@@ -21,6 +21,7 @@ services:
2121
timeout: 10s
2222
retries: 3
2323
start_period: 40s
24+
user: "1001:1001" # 使用与Dockerfile中相同的用户ID
2425

2526
# 前端服务
2627
frontend:
@@ -40,8 +41,17 @@ services:
4041
retries: 3
4142
start_period: 20s
4243

44+
# 卷定义
45+
volumes:
46+
backend_data:
47+
driver: local
48+
backend_uploads:
49+
driver: local
50+
backend_logs:
51+
driver: local
52+
4353
# 网络
4454
networks:
4555
kb-network:
4656
driver: bridge
47-
name: kb-upload-genie-network
57+
name: kb-upload-genie-network

0 commit comments

Comments
 (0)