Ubuntu下通过service运行ExpressJS写入SQLite3提示只读错误求助
解决SQLITE_READONLY权限问题
核心问题分析
你的service配置里DynamicUser=yes会覆盖User=ubuntu和Group=nogroup的设置,导致Express应用以systemd动态生成的匿名用户运行——这个用户不在www-data组内,没有数据库目录和文件的写入权限。而你手动执行node app.js时用的是ubuntu用户(属于www-data组),所以能正常写入数据库。
修复步骤
1. 修正systemd服务配置
编辑/etc/systemd/system/app.service,做以下修改:
- 移除
DynamicUser=yes(该配置会强制使用临时动态用户,忽略你指定的User/Group) - 将
Group=nogroup改为Group=www-data - 修正
PATH变量的错误(原配置usr/local/bin缺少根目录前缀,改为/usr/local/bin)
修改后的完整配置:
[Unit] Description=App [Service] ExecStart=/home/node/website.com/app.js Restart=always User=ubuntu Group=www-data Environment=PATH=/usr/bin:/usr/local/bin Environment=NODE_ENV=production WorkingDirectory=/home/node/website.com [Install] WantedBy=multi-user.target
2. 重新加载systemd并重启服务
执行以下命令使配置生效:
sudo systemctl daemon-reload sudo systemctl restart app.service
3. 验证服务状态
检查服务是否正常运行,查看日志确认错误是否消失:
sudo systemctl status app.service sudo journalctl -u app.service -f
额外检查(可选)
如果问题仍存在,确认U盘挂载参数是否为读写模式:
mount | grep /mnt/db-drive
若输出包含ro(只读),编辑/etc/fstab中对应挂载行,将ro改为rw,然后重新挂载:
sudo mount -o remount,rw /mnt/db-drive
内容的提问来源于stack exchange,提问作者Andrew Jones
相关产品推荐
相关产品推荐

