fiber应用需手动封装为systemd服务才能实现树莓派开机自启:必须交叉编译出静态二进制(pi 5用goarch=arm64),禁用cgo,编写标准.service文件,设置正确user、workingdirectory及restart策略,并执行daemon-reload与enable启用。

Fiber 本身不提供 systemd 服务管理能力,必须手动封装为系统服务才能实现树莓派开机自启。直接运行 fiber 二进制或 go run 启动的进程,在 reboot 后会消失,这不是 Fiber 的缺陷,而是 Go Web 服务的通用部署约束。
确认 Fiber 应用已编译为静态二进制
树莓派(ARM 架构)上不能直接运行 x86_64 的 Go 编译产物,也不能依赖主机上的 Go 环境运行源码。必须交叉编译或在树莓派本地编译出静态链接的二进制:
- 推荐在树莓派上执行
GOOS=linux GOARCH=arm7 GOARM=6 CGO_ENABLED=0 go build -o myapp .(注意GOARM=6适配 Pi 3/4 的 ARMv7;若用 Pi 5,改用GOARCH=arm64) -
CGO_ENABLED=0是关键:禁用 cgo 可避免动态链接libc,否则启动时报错no such file or directory: libc.musl-armv7.so.1或类似 - 验证是否静态:运行
file myapp,输出含statically linked才安全;若含dynamically linked,说明没生效
编写 systemd 服务文件(/etc/systemd/system/fiber-app.service)
不能靠 nohup 或 screen 模拟自启——它们无法被 systemd 管理、不自动拉起、日志不归集、无法设置重启策略:
- 服务文件必须以
.service结尾,路径固定在/etc/systemd/system/ - 核心字段示例:
[Unit] Description=Fiber Nutrition Scale API After=network.target [Service] Type=simple User=pi WorkingDirectory=/home/pi/nutrition-app ExecStart=/home/pi/nutrition-app/myapp Restart=always RestartSec=10 StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target
-
Type=simple表示主进程即服务主体;若用forking,需正确设置PIDFile,但 Fiber 默认不写 pid 文件,易失败 -
Restart=always防止 panic 崩溃后服务离线;RestartSec=10避免密集重启触发 systemd 限流
启用并验证服务状态
写完服务文件后,必须重载配置并显式启用,否则 reboot 后不会生效:
- 执行
sudo systemctl daemon-reload(每次修改 service 文件后都必须) - 执行
sudo systemctl enable fiber-app.service(生成软链到/etc/systemd/system/multi-user.target.wants/) - 立即启动测试:
sudo systemctl start fiber-app.service - 查状态:
sudo systemctl status fiber-app.service—— 关注Active:是否为active (running),以及最近几行日志是否有listening on - 查实时日志:
sudo journalctl -u fiber-app.service -f,比看stdout更可靠
最容易被忽略的是 WorkingDirectory 和用户权限:Fiber 应用若读取 config.yaml 或写入 SQLite 数据库,默认按服务定义的 User 身份执行,而 pi 用户对 /var/lib 无权写入。务必把配置和数据目录放在 /home/pi/ 下,并确保该用户拥有完整读写权限。











