为了确保 PocketBase 的 ./pocketbase serve 命令常驻内存并在失败后自动重启,可以使用 systemdsupervisord 等工具进行管理。以下是详细的解决方案:


方法一:使用 systemd(推荐)

systemd 是 Linux 系统的标准服务管理工具,适合长期运行的服务。

1. 创建 systemd 服务文件

/etc/systemd/system/ 目录下创建一个新的服务文件,例如 pocketbase.service

sudo nano /etc/systemd/system/pocketbase.service

2. 配置服务内容

将以下内容粘贴到文件中(根据你的实际路径调整):

[Unit]
Description=PocketBase Service
After=network.target

[Service]
# 替换为你的 PocketBase 可执行文件路径
ExecStart=/path/to/pocketbase serve
# 设置工作目录(可选)
WorkingDirectory=/path/to/your/pocketbase/project
# 以哪个用户身份运行(可选)
User=your-username
# 自动重启配置
Restart=always
# 日志输出(可选)
StandardOutput=file:/var/log/pocketbase.log
StandardError=file:/var/log/pocketbase-err.log

[Install]
WantedBy=multi-user.target

3. 重新加载 systemd 配置

sudo systemctl daemon-reload

4. 启动并启用服务

sudo systemctl start pocketbase
sudo systemctl enable pocketbase

5. 验证服务状态

sudo systemctl status pocketbase
  • 如果服务失败,systemd 会自动重启它(Restart=always)。

方法二:使用 supervisord

supervisord 是一个进程管理工具,适合需要更灵活控制的场景。

1. 安装 supervisord

# Ubuntu/Debian
sudo apt-get install supervisor

# CentOS/RHEL
sudo yum install epel-release
sudo yum install supervisor

2. 创建配置文件

/etc/supervisor/conf.d/ 目录下创建 pocketbase.conf

sudo nano /etc/supervisor/conf.d/pocketbase.conf

3. 配置内容

[program:pocketbase]
command=/path/to/pocketbase serve
directory=/path/to/your/pocketbase/project
user=your-username
autostart=true
autorestart=true
stdout_logfile=/var/log/pocketbase.log
stderr_logfile=/var/log/pocketbase-err.log

4. 重新加载配置

sudo supervisorctl reread
sudo supervisorctl update

5. 启动服务

sudo supervisorctl start pocketbase

6. 验证状态

sudo supervisorctl status pocketbase

其他注意事项

  1. 权限问题
    确保 PocketBase 可执行文件有可执行权限:

    chmod +x /path/to/pocketbase
  2. 配置文件路径
    如果使用自定义配置文件(如 ./pocketbase serve --config ./my-config.json),需在 ExecStart 中指定完整路径。
  3. 日志管理
    建议将日志输出到文件,方便排查问题。例如:

    ExecStart=/path/to/pocketbase serve >> /var/log/pocketbase.log 2>&1
  4. 容器化方案(可选)
    如果使用 Docker,可以通过 docker run--restart always 参数实现自动重启:

    docker run -d --name pocketbase -p 8090:8090 --restart always ghcr.io/pocketbase/pocketbase:latest serve

验证自动重启功能

  • 手动终止进程:

    killall pocketbase
  • 检查服务状态:

    systemctl status pocketbase  # 或 supervisorctl status pocketbase

通过以上方法,PocketBase 将始终在后台运行,并在异常退出时自动重启。选择 systemd 更适合大多数场景,而 supervisord 提供了更细粒度的控制。

更优解的方案

为了实现 PocketBase 的 ./pocketbase serve 命令常驻内存并在失败后自动重启,我们可以在不依赖第三方工具的前提下,通过更简洁、高效、可维护的方式来优化原有的解决方案。以下是一个经过优化的、更加现代化的方案设计思路。


✅ 优化目标

  • 最小化依赖:避免引入过多外部组件(如 supervisorddocker);
  • 高可靠性:确保服务崩溃后能够自动重启;
  • 易于维护:配置简洁、日志清晰、便于排查问题;
  • 跨平台兼容:适用于 Linux 和 macOS 环境。

🛠️ 优化方案一:使用 systemd(推荐)

✅ 优点:

  • 系统原生支持,稳定性高;
  • 配置简单,易于管理;
  • 支持日志输出、自动重启等功能。

🔧 优化后的配置文件示例:

[Unit]
Description=PocketBase Service
After=network.target

[Service]
ExecStart=/path/to/pocketbase serve
WorkingDirectory=/path/to/pocketbase/project
User=pocketbase
Restart=always
RestartSec=5s
StandardOutput=file:/var/log/pocketbase.log
StandardError=file:/var/log/pocketbase-err.log
Environment="PORT=8090"
Environment="DB_PATH=/path/to/db"

[Install]
WantedBy=multi-user.target

⚙️ 优化点说明:

  • RestartSec=5s:服务崩溃后等待 5 秒再重启,防止频繁重启;
  • Environment:直接在配置中定义环境变量,避免修改启动脚本;
  • User=pocketbase:指定以非 root 用户运行,提高安全性;
  • 日志路径统一管理:便于集中查看日志。

📌 启动与验证

sudo systemctl daemon-reload
sudo systemctl enable pocketbase
sudo systemctl start pocketbase
sudo systemctl status pocketbase

🛠️ 优化方案二:使用 Shell 脚本 + nohup(轻量级)

如果你不想使用 systemd,可以采用一个轻量级、易用的 Shell 脚本方式,适用于快速部署或临时测试环境。

📜 示例脚本:start-pocketbase.sh

#!/bin/bash

LOGFILE="/var/log/pocketbase.log"
PIDFILE="/tmp/pocketbase.pid"

while true; do
    echo "Starting PocketBase..."
    /path/to/pocketbase serve >> "$LOGFILE" 2>&1 &
    PID=$!
    echo $PID > "$PIDFILE"
    wait $PID
    RC=$?
    echo "PocketBase exited with code $RC. Restarting in 5 seconds..."
    sleep 5
done

📌 使用方式:

chmod +x start-pocketbase.sh
nohup ./start-pocketbase.sh &

⚠️ 注意事项:

  • 此脚本会持续运行,但不具备系统级服务管理能力
  • 不适合生产环境,仅适合临时测试或开发环境;
  • 若需持久运行,建议结合 systemd 使用。

🛠️ 优化方案三:使用 Docker(容器化部署)

如果你希望更标准化、可移植地部署 PocketBase,使用 Docker 是一种非常高效的方式。

📦 Docker 镜像

docker run -d \
  --name pocketbase \
  -p 8090:8090 \
  --restart always \
  ghcr.io/pocketbase/pocketbase:latest serve

✅ 优势:

  • 自动重启--restart always 确保容器崩溃后自动重启;
  • 隔离性强:避免依赖冲突;
  • 跨平台:可在任何支持 Docker 的环境中运行;
  • 版本控制:方便回滚或升级。

📊 总结:哪种方案最适合你?

方案适用场景优点缺点
systemd生产环境稳定、可控、日志清晰需要配置文件
Shell 脚本开发/测试环境快速部署、无需安装无系统级管理
Docker容器化部署易于迁移、版本控制依赖 Docker 环境

🧩 最佳实践建议

  • 如果你正在部署到生产服务器优先使用 systemd
  • 如果你在做快速原型或开发测试,可以使用 Shell 脚本
  • 如果你追求一致性、可扩展性Docker 是最佳选择

通过以上优化方案,你可以实现 更简洁、更可靠、更易维护 的 PocketBase 自动重启机制。根据你的具体需求选择最合适的方案即可。