Files

50 lines
1.9 KiB
Desktop File
Raw Permalink Normal View History

2026-08-22 22:28:41 +08:00
# ============================================================
# MyBlog 后端 systemd 服务
# ------------------------------------------------------------
# 部署位置:/etc/systemd/system/myblog.service
# 生效命令:
# sudo systemctl daemon-reload
# sudo systemctl enable --now myblog # 开机自启 + 立即启动
# 常用命令:
# sudo systemctl status myblog # 查看状态
# sudo systemctl restart myblog # 重启
# journalctl -u myblog -f # 跟踪日志
# ============================================================
[Unit]
Description=MyBlog FastAPI Backend
# 等待网络就绪后再启动(uvicorn 需要绑定端口)
After=network.target
[Service]
# 专用运行账号:系统用户、禁止登录,只拥有项目文件权限
User=blog
Group=blog
# 工作目录必须是项目根目录(backend 包、.env、uploads 都相对它定位)
WorkingDirectory=/var/www/blog
# 启动命令:使用项目虚拟环境里的 uvicorn,只监听本机 8080(禁止公网直连)
ExecStart=/var/www/blog/venv/bin/uvicorn backend.main:app --host 127.0.0.1 --port 8080
# 崩溃后 3 秒自动重启;开机自启由 enable 管理
Restart=always
RestartSec=3
# 环境变量说明:
# .env 不需要写进 EnvironmentFile —— 应用启动时会在代码里
# 自动读取项目根目录 .envbackend/database.py 的 load_dotenv),
# 这样也能避免 systemd 解析中文值/注释行时出错。
# 部署时请务必在 /var/www/blog/.env 中配置 JWT_SECRET,否则后端拒绝启动。
# ---------- 安全加固(可选) ----------
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=full
ProtectHome=true
# 允许写入:上传目录(用户上传文件)与 backend 目录(SQLite 数据库 backend/blog.db
ReadWritePaths=/var/www/blog/uploads /var/www/blog/backend
[Install]
WantedBy=multi-user.target