# ============================================================ # 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 —— 应用启动时会在代码里 # 自动读取项目根目录 .env(backend/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