返回列表 发布新帖

[源码] Pocketbase-GO语言高并发单文件api数据库

147 3
阿白 发表于 2026-1-4 12:51:49 | 查看全部 阅读模式 来自:中国–新疆–阿克苏地区 移动

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

QQ20260104-124324.webp

PocketBase 基于 Debian 12 的详细使用指南

一、核心需求确认

你需要一份面向 Debian 12 系统的 PocketBase 完整操作手册,涵盖从环境准备、安装部署到日常运维的全流程,并以 Markdown 格式整理,方便查阅和使用。

二、PocketBase 详细操作指南

1. 什么是 PocketBase

PocketBase 是一个开源的、轻量级的后端即服务(BaaS),集成了实时数据库、认证系统、文件存储和 REST API,单二进制文件运行,无需额外依赖,非常适合小型项目、原型开发或个人项目。

2. 环境准备(Debian 12)

2.1 系统基础检查与更新

首先确保 Debian 12 系统为最新状态,执行以下命令:

# 更新软件包索引
sudo apt update -y

# 升级已安装的软件包
sudo apt upgrade -y

# 安装必要的基础工具(curl、unzip、wget)
sudo apt install curl unzip wget -y

# 检查系统架构(PocketBase 需匹配架构下载)
uname -m
# 常见输出:x86_64(amd64)、aarch64(arm64)

2.2 防火墙配置(可选但推荐)

PocketBase 默认使用 8090 端口,需开放该端口:

# 查看防火墙状态
sudo ufw status

# 若未启用,先启用防火墙
sudo ufw enable

# 开放 8090 端口
sudo ufw allow 8090/tcp

# 重载防火墙规则
sudo ufw reload

3. PocketBase 安装

3.1 下载 PocketBase 二进制文件

根据系统架构下载对应版本(以最新稳定版为例):

# 创建 PocketBase 工作目录(推荐)
mkdir -p /opt/pocketbase
cd /opt/pocketbase

# 下载 amd64 架构版本(Debian 12 服务器主流架构)
wget https://github.com/pocketbase/pocketbase/releases/latest/download/pocketbase_linux_amd64.zip

# 若为 arm64 架构,替换为:
# wget https://github.com/pocketbase/pocketbase/releases/latest/download/pocketbase_linux_arm64.zip

# 解压文件
unzip pocketbase_linux_*.zip

# 删除压缩包
rm pocketbase_linux_*.zip

# 添加执行权限
chmod +x pocketbase

# 验证安装(查看版本)
./pocketbase version

3.2 测试运行

# 首次运行 PocketBase
./pocketbase serve

# 运行成功后,终端会输出:
# > Server started at http://0.0.0.0:8090
# > REST API: http://0.0.0.0:8090/api/
# > Admin UI: http://0.0.0.0:8090/_/

此时可通过 http://你的服务器IP:8090/_/ 访问管理后台,首次访问会要求创建管理员账号(用户名/密码)。

4. PocketBase 基础使用

4.1 管理员后台操作

  1. 访问 http://服务器IP:8090/_/,输入首次创建的管理员账号登录;
  2. 创建数据集合(Collections)
    • 点击左侧「Collections」→「New collection」;
    • 填写集合名称(如 users)、类型(Base model);
    • 添加字段(如 username(Text)、email(Email)、age(Number));
    • 保存后即可通过 API 操作该集合数据。
  3. 权限配置:可针对集合设置「Create/Read/Update/Delete」权限(如开放匿名只读、仅管理员可写等)。

4.2 基础 API 使用

users 集合为例,通过 curl 测试 API:

# 1. 创建一条用户数据(需管理员认证,先获取 token)
# 获取管理员 token
ADMIN_TOKEN=$(curl -X POST http://服务器IP:8090/api/admins/auth-with-password \
  -H "Content-Type: application/json" \
  -d '{"identity":"你的管理员邮箱","password":"你的管理员密码"}' | jq -r '.token')

# 创建用户
curl -X POST http://服务器IP:8090/api/collections/users/records \
  -H "Content-Type: application/json" \
  -H "Authorization: Admin $ADMIN_TOKEN" \
  -d '{"username":"testuser","email":"test@example.com","age":25}'

# 2. 查询所有用户数据(匿名访问,需先开放 users 集合的 Read 权限)
curl http://服务器IP:8090/api/collections/users/records

5. 进阶配置(生产环境必备)

5.1 将 PocketBase 配置为系统服务(开机自启)

创建 systemd 服务文件,确保 PocketBase 后台运行且开机自启:

# 创建服务文件
sudo nano /etc/systemd/system/pocketbase.service

粘贴以下内容(修改 UserWorkingDirectory 为实际路径):

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

[Service]
Type=simple
User=root  # 推荐使用非 root 用户,如创建 pocketbase 用户
WorkingDirectory=/opt/pocketbase
ExecStart=/opt/pocketbase/pocketbase serve --http=0.0.0.0:8090
Restart=always
RestartSec=5
StandardOutput=journal+console
StandardError=journal+console

[Install]
WantedBy=multi-user.target

保存后执行以下命令启用服务:

# 重新加载 systemd 配置
sudo systemctl daemon-reload

# 启动 PocketBase 服务
sudo systemctl start pocketbase

# 设置开机自启
sudo systemctl enable pocketbase

# 查看服务状态
sudo systemctl status pocketbase

5.2 配置 HTTPS(推荐)

PocketBase 本身不直接支持 HTTPS,需通过 Nginx 反向代理实现:

  1. 安装 Nginx:
    sudo apt install nginx -y
    
  2. 创建 Nginx 配置文件:
    sudo nano /etc/nginx/sites-available/pocketbase
    
  3. 粘贴以下配置(替换 your-domain.com 为你的域名):
    server {
        listen 80;
        server_name your-domain.com;
        # 重定向 HTTP 到 HTTPS
        return 301 https://$host$request_uri;
    }
    
    server {
        listen 443 ssl http2;
        server_name your-domain.com;
    
        # SSL 证书配置(推荐使用 Let's Encrypt)
        ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_prefer_server_ciphers on;
    
        # 反向代理到 PocketBase
        location / {
            proxy_pass http://127.0.0.1:8090;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
    
  4. 启用配置并重启 Nginx:
    # 启用配置
    sudo ln -s /etc/nginx/sites-available/pocketbase /etc/nginx/sites-enabled/
    
    # 检查配置语法
    sudo nginx -t
    
    # 重启 Nginx
    sudo systemctl restart nginx
    
  5. 申请 Let's Encrypt 免费证书(可选):
    # 安装 certbot
    sudo apt install certbot python3-certbot-nginx -y
    
    # 申请证书
    sudo certbot --nginx -d your-domain.com
    

5.3 自定义 PocketBase 配置

PocketBase 的配置文件为 pb_data/pb_config.json(运行后自动生成),可修改以下核心参数:

  • appName:应用名称;
  • api.allowedOrigins:跨域允许的域名;
  • mailer:邮件配置(用于密码重置、验证等);
  • storage:文件存储配置(默认本地,可配置 S3 等)。

修改配置后需重启 PocketBase 服务:

sudo systemctl restart pocketbase

6. 日常运维

6.1 数据备份

PocketBase 的所有数据(数据库、文件、配置)都在 pb_data 目录,备份该目录即可:

# 创建备份脚本
nano /opt/pocketbase/backup.sh

粘贴以下内容:

#!/bin/bash
BACKUP_DIR="/opt/pocketbase/backups"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p $BACKUP_DIR

# 停止服务(可选,避免备份时数据写入)
sudo systemctl stop pocketbase

# 压缩 pb_data 目录
zip -r $BACKUP_DIR/pocketbase_backup_$DATE.zip /opt/pocketbase/pb_data

# 启动服务
sudo systemctl start pocketbase

# 删除 7 天前的备份(可选)
find $BACKUP_DIR -name "pocketbase_backup_*.zip" -mtime +7 -delete

添加执行权限并定时执行:

chmod +x /opt/pocketbase/backup.sh

# 添加到 crontab,每天凌晨 2 点备份
sudo crontab -e
# 粘贴:0 2 * * * /opt/pocketbase/backup.sh

6.2 PocketBase 更新

# 停止服务
sudo systemctl stop pocketbase

# 备份 pb_data(保险)
cp -r /opt/pocketbase/pb_data /opt/pocketbase/pb_data_backup

# 下载最新版本
cd /opt/pocketbase
wget https://github.com/pocketbase/pocketbase/releases/latest/download/pocketbase_linux_amd64.zip
unzip -o pocketbase_linux_amd64.zip  # -o 覆盖原有文件
rm pocketbase_linux_amd64.zip

# 启动服务
sudo systemctl start pocketbase

# 验证版本
/opt/pocketbase/pocketbase version

6.3 查看日志

# 实时查看 PocketBase 日志
sudo journalctl -u pocketbase -f

# 查看最近 100 行日志
sudo journalctl -u pocketbase -n 100

7. 常见问题解决

  1. 无法访问管理后台
    • 检查防火墙是否开放 8090 端口(sudo ufw status);
    • 检查 PocketBase 服务是否运行(sudo systemctl status pocketbase);
    • 检查服务器安全组(云服务器需开放对应端口)。
  2. API 调用返回 403
    • 检查集合的权限配置(管理员后台→Collections→对应集合→Rules);
    • 确认请求头是否携带正确的认证信息(Admin/User Token)。
  3. 服务启动失败
    • 检查 pocketbase.service 文件语法是否正确;
    • 检查 pb_data 目录权限(chmod -R 755 /opt/pocketbase/pb_data)。
匠心独运,千锤百炼,品质非凡。
回复 转播

使用道具 举报

评论3

阿白楼主Lv.1 发表于 2026-1-4 12:54:05 | 查看全部 来自:中国–新疆–阿克苏地区 移动

PocketBase 在堡塔(宝塔)面板下配置进程守护与端口转发

一、核心需求确认

你希望在堡塔(宝塔)面板中为 Debian 12 服务器上的 PocketBase 配置进程守护(确保 PocketBase 持续后台运行、崩溃自动重启),并设置端口转发(反向代理),让 PocketBase 可通过 80/443 端口或域名访问(替代默认的 8090 端口)。

二、前置条件

  1. 堡塔面板已成功安装在 Debian 12 服务器(若未安装,可执行官方脚本:curl -sSO https://download.bt.cn/install/install_panel.sh && bash install_panel.sh);
  2. PocketBase 已按之前的教程安装在服务器(推荐路径:/opt/pocketbase);
  3. 服务器已开放 80/443 端口(堡塔面板默认会开放,可在「安全」模块确认);
  4. 若需域名访问,需提前将域名解析到服务器公网 IP。

三、配置 PocketBase 进程守护(堡塔面板)

堡塔面板的「进程守护」功能可替代手动配置 systemd 服务,可视化操作更简单,核心是让 PocketBase 后台运行且崩溃自动重启。

步骤 1:登录堡塔面板

通过浏览器访问 http://服务器IP:8888(默认端口),输入堡塔面板的账号密码登录。

步骤 2:进入「进程守护」模块

  1. 点击左侧菜单栏的「软件商店」→ 「系统工具」,确认「进程守护」插件已安装(默认已安装,若未安装则点击「安装」);
  2. 安装完成后,点击左侧菜单栏的「进程守护」,进入守护进程管理页面。

步骤 3:添加 PocketBase 守护进程

  1. 点击页面右上角的「添加守护进程」,弹出配置窗口;

  2. 按以下参数填写(关键项标红):

    配置项 填写内容
    进程名称 PocketBase(自定义,便于识别)
    运行目录 /opt/pocketbase(PocketBase 二进制文件所在目录,需和实际路径一致)
    启动命令 ./pocketbase serve --http=127.0.0.1:8090(绑定本地回环地址,更安全)
    停止命令 pkill pocketbase(可选,用于手动停止进程)
    日志文件 /opt/pocketbase/pocketbase.log(自定义日志路径,便于排查问题)
    错误日志文件 /opt/pocketbase/pocketbase_error.log(可选,单独记录错误日志)
    自动重启 开启(必选,进程崩溃后自动重启)
    重启间隔 5 秒(默认即可)
    启动用户 root(或你创建的非 root 用户,需确保该用户有 /opt/pocketbase 目录权限)
  3. 点击「提交」,完成守护进程创建。

步骤 4:启动并验证守护进程

  1. 在「进程守护」列表中找到刚创建的「PocketBase」进程,点击右侧的「启动」;
  2. 启动后,进程状态会显示「运行中」,可点击「日志」查看运行日志:
    • 若日志中显示 Server started at http://127.0.0.1:8090,说明 PocketBase 已通过守护进程成功运行;
    • 若启动失败,检查「运行目录」「启动命令」是否正确,或查看「错误日志」定位问题(如权限不足可执行 chmod -R 755 /opt/pocketbase)。

四、配置端口转发(反向代理)

PocketBase 默认监听 8090 端口,直接暴露该端口不够友好,通过堡塔面板的「反向代理」可实现:

  • 域名访问(如 https://your-domain.com)→ 转发到 127.0.0.1:8090
  • 80/443 端口(默认 HTTP/HTTPS 端口)→ 转发到 8090 端口;
  • 同时可一键配置 SSL 证书,实现 HTTPS 访问。

步骤 1:添加站点(域名绑定)

  1. 点击堡塔面板左侧菜单栏的「网站」→「添加站点」;

  2. 填写站点配置:

    配置项 填写内容
    域名 你的域名(如 pb.example.com,若无需域名可填服务器 IP)
    备注 PocketBase 反向代理(自定义)
    根目录 任意(反向代理无需实际网站文件,如 /www/wwwroot/pocketbase
    PHP 版本 纯静态(无需 PHP,选择此项)
    数据库 不创建(无需)
    FTP 不创建(无需)
  3. 点击「提交」,完成站点创建。

步骤 2:配置反向代理(端口转发)

  1. 在「网站」列表中找到刚创建的站点,点击右侧的「设置」;

  2. 点击左侧的「反向代理」→「添加反向代理」;

  3. 填写反向代理配置:

    配置项 填写内容
    代理名称 PocketBase(自定义)
    代理目录 /(根目录,转发所有请求)
    目标URL http://127.0.0.1:8090(PocketBase 运行地址,和守护进程启动命令一致)
    缓存 关闭(避免 API 数据缓存)
    反向代理参数 点击「添加自定义参数」,新增以下参数(解决跨域/Header 传递问题):proxy_set_header Host $host;``proxy_set_header X-Real-IP $remote_addr;``proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;``proxy_set_header X-Forwarded-Proto $scheme;
  4. 点击「提交」,反向代理配置生效。

步骤 3:配置 SSL 证书(可选,推荐)

为了安全访问,建议给域名配置 SSL 证书(堡塔面板支持一键申请 Let's Encrypt 免费证书):

  1. 在站点「设置」页面,点击左侧的「SSL」;
  2. 选择「Let's Encrypt」→ 勾选需要申请证书的域名 → 点击「申请」;
  3. 申请成功后,开启「强制 HTTPS」(自动将 HTTP 请求重定向到 HTTPS);
  4. 点击「保存」,SSL 配置生效。

步骤 4:验证端口转发

  1. 访问配置的域名/IP:
    • 管理后台:https://你的域名/_/(替代 http://服务器IP:8090/_/);
    • API 接口:https://你的域名/api/collections/users/records(替代 8090 端口);
  2. 若能正常访问 PocketBase 管理后台或 API,说明端口转发配置成功。

五、常见问题排查

  1. 守护进程启动失败
    • 检查「运行目录」是否为 PocketBase 二进制文件所在目录;
    • 检查启动命令是否正确(如 ./pocketbase 路径是否存在,可在堡塔面板「终端」执行 ls /opt/pocketbase 验证);
    • 查看「错误日志」,若提示权限不足,执行 chmod +x /opt/pocketbase/pocketbase 赋予执行权限。
  2. 反向代理访问 404/502
    • 502 错误:PocketBase 守护进程未运行,先确认进程状态为「运行中」;
    • 404 错误:反向代理「目标URL」填写错误(需为 127.0.0.1:8090,而非服务器公网 IP);
    • 跨域错误:检查反向代理「自定义参数」是否添加完整的 Header 配置。
  3. 域名无法访问
    • 确认域名已解析到服务器公网 IP(可通过 ping 你的域名 验证);
    • 确认服务器安全组/堡塔面板「安全」模块已开放 80/443 端口。
匠心独运,千锤百炼,品质非凡。
回复

使用道具 举报

diggerLv.9 发表于 2026-1-4 12:57:08 | 查看全部 来自:中国–新疆–阿克苏地区 移动

PocketBase 保留目录说明 & 钩子(Hook)调用方式与示例

一、核心需求确认

你希望了解 PocketBase 运行过程中自动生成/识别的保留目录的名称和具体作用,同时掌握 PocketBase 钩子(Hook)的调用方式,并通过实际示例理解钩子在业务场景中的应用(如数据校验、事件触发、自定义逻辑等)。

二、PocketBase 保留目录详解

PocketBase 运行时会在其工作目录(如 /opt/pocketbase)自动生成/识别多个保留目录(文件名固定,PocketBase 会优先读取),所有核心数据、配置、自定义逻辑都集中在这些目录中。以下是所有保留目录的名称、作用及关键细节:

目录名称 核心作用 关键文件/子目录 适用场景
pb_data/ 最核心目录,存储所有持久化数据(数据库、配置、文件、日志等) - pb.db:SQLite 核心数据库(存储集合、记录、用户等)- pb_config.json:全局配置文件(应用名称、跨域、邮件等)- storage/:文件存储目录(上传的图片/文件)- logs/:运行日志(可选)- pb_auth.json:认证相关配置 数据备份、配置修改、文件存储管理
pb_hooks/ 存放 JS/TS 钩子脚本,PocketBase 启动时自动加载,用于扩展业务逻辑 *.js/*.ts(如 users.hooks.js 数据校验、事件触发、自定义认证、请求拦截
pb_migrations/ 数据库迁移脚本目录,用于管理集合结构变更(版本升级/手动修改表结构) *.js/*.ts(如 20240104120000_init.js 生产环境集合结构变更、版本迭代
pb_public/ 静态文件托管目录,可通过 URL 直接访问(无需认证) 任意静态文件(如 index.htmllogo.png 托管前端静态页面、公共资源(如图片、JS)

各目录详细说明

1. pb_data/(核心数据目录)

  • 不可删除:删除该目录会丢失所有数据(数据库、配置、上传文件);
  • 备份优先级:日常运维只需备份该目录即可完整恢复 PocketBase 所有数据;
  • 关键文件说明
    • pb.db:SQLite 数据库文件,存储集合定义、记录数据、管理员/用户账号等核心数据;
    • pb_config.json:自动生成的配置文件,可手动修改(如跨域允许的域名、邮件服务器配置),修改后需重启 PocketBase;
    • storage/:默认存储用户上传的文件(如集合中「File」类型字段的文件),路径对应 API 返回的 fileUrl
    • 权限要求:运行 PocketBase 的用户需有该目录的读写权限(如 chmod -R 755 pb_data/)。

2. pb_hooks/(钩子脚本目录)

  • 自动加载:PocketBase 启动时会扫描该目录下所有 .js/.ts 文件并执行,无需手动配置;
  • 运行环境:基于 Go 内置的 ESModule 运行时,支持大部分 ES6+ 语法,可直接使用 console.log 调试;
  • 无依赖:暂不支持 npm 包,需用原生 JS/TS 编写逻辑。

3. pb_migrations/(数据库迁移目录)

  • 自动生成:在管理后台修改集合结构(如添加字段)时,会自动生成迁移脚本;
  • 手动执行:可通过命令 ./pocketbase migrate up 执行未应用的迁移脚本;
  • 回滚:支持 ./pocketbase migrate down 回滚最近一次迁移(需脚本支持)。

4. pb_public/(静态文件目录)

  • 访问方式:文件路径对应 URL 路径,如 pb_public/logo.png 可通过 http://域名/public/logo.png 访问;
  • 权限:所有文件无需认证即可访问,适合存放公共静态资源(不建议存放敏感文件)。

三、PocketBase 钩子(Hook)调用方式与示例

1. 钩子核心概念

PocketBase 钩子是服务端事件驱动脚本,可拦截/处理系统核心事件(如数据创建/更新、用户认证、服务启动等),实现自定义业务逻辑(如数据校验、自动填充字段、日志记录、权限控制)。

钩子分为两类:

  • 集合钩子(Collection Hooks):针对特定集合的操作(如 users 集合的创建/更新),最常用;
  • 全局钩子(App Hooks):针对全局事件(如服务启动、HTTP 请求拦截、用户登录)。

2. 钩子基本使用步骤

  1. 在 PocketBase 工作目录(如 /opt/pocketbase)创建 pb_hooks 目录:
    mkdir -p /opt/pocketbase/pb_hooks
    
  2. pb_hooks 目录下创建 .js 文件(如 users.hooks.js);
  3. 编写钩子逻辑,保存后重启 PocketBase 守护进程(堡塔面板「进程守护」→ 重启);
  4. 测试触发条件(如创建一条用户记录),验证钩子是否生效。

3. 常用钩子示例

示例 1:集合钩子 - 数据创建前校验(必填字段+格式校验)

场景:users 集合创建记录时,强制校验「email」字段格式,且「username」字段不能为空。

创建 pb_hooks/users.hooks.js

// 监听 users 集合的 beforeCreate 事件(创建记录前触发)
onRecordBeforeCreate((e) => {
  // 仅针对 users 集合生效
  if (e.record.collectionName !== "users") {
    return;
  }

  // 1. 校验 username 不能为空
  const username = e.record.get("username");
  if (!username || username.trim() === "") {
    throw new Error("用户名不能为空!"); // 抛出错误会终止创建操作,前端会收到该错误信息
  }

  // 2. 校验 email 格式
  const email = e.record.get("email");
  const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
  if (!emailRegex.test(email)) {
    throw new Error("邮箱格式不正确!");
  }

  // 3. 自动填充创建时间(无需前端传参)
  e.record.set("created_at", new Date().toISOString());
});

触发方式:调用 users 集合的创建 API 时自动触发:

# 测试:传入错误邮箱,会返回「邮箱格式不正确」
curl -X POST http://域名/api/collections/users/records \
  -H "Content-Type: application/json" \
  -d '{"username":"test","email":"invalid-email","age":25}'

示例 2:集合钩子 - 数据更新后记录日志

场景:users 集合记录更新后,自动将操作日志写入 user_logs 集合(需先创建该集合,包含 user_idoperationupdate_time 字段)。

创建 pb_hooks/users.hooks.js

// 监听 users 集合的 afterUpdate 事件(更新记录后触发)
onRecordAfterUpdate(async (e) => {
  if (e.record.collectionName !== "users") {
    return;
  }

  // 获取更新的用户ID和操作时间
  const userId = e.record.id;
  const updateTime = new Date().toISOString();

  // 写入日志到 user_logs 集合
  await $app.dao().createRecord(
    $app.dao().findCollectionByNameOrId("user_logs"),
    {
      user_id: userId,
      operation: "用户信息更新",
      update_time: updateTime,
    }
  );

  console.log(`用户 ${userId} 信息已更新,日志已记录`); // 日志会输出到 PocketBase 运行日志
});

示例 3:全局钩子 - 服务启动时初始化

场景:PocketBase 启动时,自动检查 settings 集合是否存在默认配置,不存在则创建。

创建 pb_hooks/app.hooks.js

// 监听服务启动后事件
onAppAfterServe((e) => {
  console.log("PocketBase 服务已启动,开始初始化默认配置");

  // 获取 settings 集合
  const settingsCollection = $app.dao().findCollectionByNameOrId("settings");
  if (!settingsCollection) {
    console.log("settings 集合不存在,跳过初始化");
    return;
  }

  // 检查是否已有默认配置
  const defaultSettings = $app.dao().findFirstRecordByFilter(
    "settings",
    "key = 'site_name'",
    ""
  );

  // 无默认配置则创建
  if (!defaultSettings) {
    const record = new Record(settingsCollection);
    record.set("key", "site_name");
    record.set("value", "我的 PocketBase 应用");
    $app.dao().saveRecord(record);
    console.log("默认站点名称已创建");
  }
});

示例 4:全局钩子 - 拦截 HTTP 请求添加跨域头

场景:自定义跨域配置(替代 pb_config.json 中的跨域设置),允许指定域名的跨域请求。

创建 pb_hooks/app.hooks.js

// 监听所有 HTTP 请求
onHttpRequest((e) => {
  // 获取请求的 Origin 头
  const origin = e.request.headers.get("Origin");
  // 允许的跨域域名列表
  const allowedOrigins = ["https://your-domain.com", "http://localhost:3000"];

  // 若 Origin 在允许列表中,添加跨域头
  if (allowedOrigins.includes(origin)) {
    e.response.headers.set("Access-Control-Allow-Origin", origin);
    e.response.headers.set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
    e.response.headers.set("Access-Control-Allow-Headers", "Content-Type, Authorization");
  }

  // 处理 OPTIONS 预检请求
  if (e.request.method === "OPTIONS") {
    e.response.status = 204;
    e.response.body = "";
  }
});

示例 5:认证钩子 - 自定义用户登录逻辑

场景:用户登录时,额外校验「账号是否禁用」(users 集合需添加 is_disabled 布尔字段)。

创建 pb_hooks/auth.hooks.js

// 监听用户密码登录事件
onRecordAuthWithPassword((e) => {
  // 仅针对 users 集合的登录
  if (e.record.collectionName !== "users") {
    return;
  }

  // 检查用户是否被禁用
  const isDisabled = e.record.get("is_disabled");
  if (isDisabled) {
    throw new Error("该账号已被禁用,请联系管理员!"); // 终止登录
  }

  // 登录成功后,记录最后登录时间
  e.record.set("last_login_at", new Date().toISOString());
  await $app.dao().saveRecord(e.record);

  console.log(`用户 ${e.record.id} 登录成功,最后登录时间已更新`);
});

4. 钩子调试技巧

  • 日志输出:使用 console.log(xxx) 输出调试信息,日志会写入 PocketBase 运行日志(堡塔面板「进程守护」→「日志」可查看);
  • 错误排查:钩子脚本语法错误会导致 PocketBase 启动失败,可在终端手动运行 ./pocketbase serve 查看具体错误信息;
  • 参数打印:触发钩子时,打印事件对象 e 查看可用参数(如 console.log(JSON.stringify(e.record)))。

四、总结

  1. 保留目录核心要点
    • pb_data/ 是核心数据仓,备份该目录即可恢复所有数据;
    • pb_hooks/ 存放自定义钩子脚本,启动时自动加载;
    • pb_public/ 托管无需认证的静态文件,pb_migrations/ 管理数据库结构变更。
  2. 钩子使用核心要点
    • 钩子分「集合钩子」(针对数据操作)和「全局钩子」(针对系统事件),放在 pb_hooks/ 目录自动加载;
    • 常用钩子:onRecordBeforeCreate(数据校验)、onRecordAfterUpdate(日志记录)、onHttpRequest(跨域配置);
    • 钩子中抛出错误会终止原操作,适合做数据校验;可通过 $app.dao() 操作数据库(如创建/更新记录)。
  3. 实战建议
    • 钩子脚本优先实现核心业务逻辑(校验、自动填充),避免复杂计算;
    • 修改钩子后需重启 PocketBase 才能生效;
    • 生产环境需备份 pb_hooks/ 目录,避免钩子脚本丢失。
[发帖际遇]: digger 被钱袋砸中进医院,看病花了 1 匠币. 幸运榜 / 衰神榜
匠心独运,千锤百炼,品质非凡。
回复

使用道具 举报

打工日常 发表于 2026-1-4 13:00:20 | 查看全部 来自:中国–新疆–阿克苏地区 移动

Debian 12 下 PocketBase 全维度配置指南

一、核心需求确认

你需要在 Debian 12 系统中完成 PocketBase 的全场景配置,包括基础网络(端口、绑定地址)、邮件(SMTP)、存储(本地/S3)、安全(跨域、认证)、应用基础(日志、时区)等核心配置,同时掌握配置的生效方式、备份与问题排查方法,适配生产环境的实际需求。

二、PocketBase 配置的核心入口(Debian 12 环境)

PocketBase 的配置主要通过 4 种方式实现(优先级:命令行参数 > 管理后台 > 配置文件 > 钩子脚本),所有配置最终会落地到 pb_data/pb_config.json(运行后自动生成),以下是各入口的适用场景:

配置方式 操作路径 适用场景
配置文件 /opt/pocketbase/pb_data/pb_config.json(手动编辑) 所有基础配置(网络、邮件、存储、安全)
命令行启动参数 启动时追加参数(如 ./pocketbase serve --http=0.0.0.0:8080 临时覆盖配置(如测试端口、调试模式)
管理后台 http://域名/_/ → 设置(Settings) 可视化配置(邮件、跨域、认证策略)
钩子脚本 pb_hooks/ 下的 JS 脚本 自定义配置(如动态跨域、自定义认证规则)

前置操作(Debian 12)

  1. 确认 PocketBase 工作目录(默认 /opt/pocketbase),若路径不同需替换下文所有路径;
  2. 确保对 pb_data/ 目录有读写权限:
    sudo chmod -R 755 /opt/pocketbase/pb_data
    sudo chown -R root:root /opt/pocketbase/pb_data  # 或你的运行用户
    

三、核心配置模块(Debian 12 实操)

1. 基础网络配置(端口、绑定地址、HTTPS)

1.1 修改默认端口/绑定地址(3种方式)

PocketBase 默认监听 0.0.0.0:8090,以下是修改方式:

方式1:命令行参数(临时生效,重启后失效)
# 切换到 PocketBase 目录
cd /opt/pocketbase

# 监听 8080 端口,仅绑定本地回环地址(仅服务器内部访问)
./pocketbase serve --http=127.0.0.1:8080

# 监听 80 端口(需 root 权限),绑定所有网卡
sudo ./pocketbase serve --http=0.0.0.0:80
方式2:配置文件(永久生效)
  1. 编辑配置文件:
    nano /opt/pocketbase/pb_data/pb_config.json
    
  2. 添加/修改 api 节点(无则新增):
    {
      "api": {
        "httpAddr": "0.0.0.0:8080",  // 绑定地址+端口
        "httpTimeout": 30           // 请求超时时间(秒)
      }
    }
    
  3. 保存后重启 PocketBase:
    # systemd 服务方式
    sudo systemctl restart pocketbase
    
    # 堡塔面板方式:进程守护 → 重启 PocketBase
    
方式3:堡塔面板进程守护(永久生效)
  1. 登录堡塔面板 → 进程守护 → 找到 PocketBase 进程 → 编辑;
  2. 修改「启动命令」为:
    ./pocketbase serve --http=0.0.0.0:8080
    
  3. 保存并重启进程。

1.2 配置 HTTPS(Debian 12 推荐 Nginx 反向代理)

PocketBase 自身不直接支持 HTTPS,Debian 12 下推荐通过 Nginx 配置(替代 PocketBase 内置的 HTTPS 方式,更稳定):

  1. 安装 Nginx(Debian 12):
    sudo apt install nginx -y
    
  2. 创建 Nginx 配置文件:
    sudo nano /etc/nginx/sites-available/pocketbase-https
    
  3. 粘贴以下配置(替换 your-domain.com 为你的域名):
    server {
        listen 80;
        server_name your-domain.com;
        # 重定向 HTTP 到 HTTPS
        return 301 https://$host$request_uri;
    }
    
    server {
        listen 443 ssl http2;
        server_name your-domain.com;
    
        # SSL 证书(Let's Encrypt 免费证书)
        ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;
        ssl_protocols TLSv1.2 TLSv1.3;
    
        # 反向代理到 PocketBase
        location / {
            proxy_pass http://127.0.0.1:8090;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
    
  4. 启用配置并重启 Nginx:
    sudo ln -s /etc/nginx/sites-available/pocketbase-https /etc/nginx/sites-enabled/
    sudo nginx -t  # 校验配置语法
    sudo systemctl restart nginx
    
  5. 申请 Let's Encrypt 证书(Debian 12):
    sudo apt install certbot python3-certbot-nginx -y
    sudo certbot --nginx -d your-domain.com
    

2. 邮件配置(SMTP,用于密码重置/验证)

PocketBase 需配置 SMTP 才能发送邮件(如用户注册验证、密码重置),以下是 Debian 12 下的配置步骤:

方式1:管理后台可视化配置(推荐)

  1. 访问 http://域名/_/ → 左侧「Settings」→「Mailer」;

  2. 填写 SMTP 信息(以腾讯企业邮/QQ 邮箱为例):

    配置项 填写内容(QQ 邮箱)
    From address 你的邮箱(如 xxx@qq.com
    From name PocketBase 应用(自定义)
    SMTP host smtp.qq.com
    SMTP port 465(SSL)/587(TLS)
    SMTP username 你的邮箱(如 xxx@qq.com
    SMTP password 邮箱授权码(非登录密码)
    SMTP secure SSL(对应 465 端口)/TLS(对应 587 端口)
  3. 点击「Test」测试邮件发送,成功后点击「Save」保存。

方式2:手动编辑配置文件(永久生效)

  1. 编辑 pb_config.json
    nano /opt/pocketbase/pb_data/pb_config.json
    
  2. 添加/修改 mailer 节点:
    {
      "mailer": {
        "fromAddress": "xxx@qq.com",
        "fromName": "PocketBase 应用",
        "smtp": {
          "host": "smtp.qq.com",
          "port": 465,
          "username": "xxx@qq.com",
          "password": "你的邮箱授权码",
          "secure": true  // true=SSL,false=TLS
        }
      }
    }
    
  3. 重启 PocketBase 生效。

3. 存储配置(本地/S3 兼容存储)

PocketBase 默认将上传文件存储在 pb_data/storage/,可配置为 S3 兼容存储(如阿里云 OSS、腾讯云 COS)。

3.1 本地存储配置(默认,调整路径)

  1. 编辑 pb_config.json
    nano /opt/pocketbase/pb_data/pb_config.json
    
  2. 修改 storage 节点(自定义本地存储路径):
    {
      "storage": {
        "local": {
          "path": "/data/pocketbase/storage"  // 自定义存储路径(Debian 12 需提前创建)
        },
        "active": "local"  // 启用本地存储
      }
    }
    
  3. 创建自定义路径并授权:
    sudo mkdir -p /data/pocketbase/storage
    sudo chmod -R 755 /data/pocketbase/storage
    sudo chown -R root:root /data/pocketbase/storage
    
  4. 重启 PocketBase 生效。

3.2 S3 兼容存储配置(阿里云 OSS 示例)

  1. 编辑 pb_config.json
    {
      "storage": {
        "s3": {
          "accessKeyID": "你的阿里云 AccessKey ID",
          "secretAccessKey": "你的阿里云 AccessKey Secret",
          "region": "oss-cn-beijing",  // 阿里云 OSS 地域
          "bucket": "your-bucket-name",  // OSS 桶名称
          "endpoint": "oss-cn-beijing.aliyuncs.com",  // OSS 端点
          "disableSSL": false,
          "forcePathStyle": false
        },
        "active": "s3"  // 启用 S3 存储
      }
    }
    
  2. 重启 PocketBase 生效,上传文件会自动存储到 OSS 桶。

4. 安全配置(跨域、认证、密码策略)

4.1 跨域配置(CORS)

方式1:管理后台配置
  1. 访问 http://域名/_/ →「Settings」→「API」;
  2. 在「Allowed origins」中填写允许的跨域域名(如 https://your-domain.com,http://localhost:3000),多个域名用逗号分隔;
  3. 可选:开启「Allow credentials」(允许携带 Cookie/Token);
  4. 保存后立即生效(无需重启)。
方式2:配置文件配置
  1. 编辑 pb_config.json
    {
      "api": {
        "allowedOrigins": ["https://your-domain.com", "http://localhost:3000"],
        "allowCredentials": true
      }
    }
    
  2. 重启 PocketBase 生效。

4.2 认证安全配置(Token 超时、密码策略)

  1. 管理后台配置路径:Settings →「Auth」;

  2. 核心配置项:

    配置项 作用
    Token duration 用户 Token 有效期(如 7d=7 天,1h=1 小时)
    Password min length 用户密码最小长度(推荐 ≥8)
    Password require chars 密码复杂度(是否要求大小写、数字、特殊字符)
    Max failed attempts 登录失败最大次数(超过后锁定账号)
  3. 保存后立即生效。

4.3 管理后台安全配置

  1. 限制管理后台访问 IP(Debian 12 防火墙):
    # 仅允许 192.168.1.100 访问 8090 端口(管理后台)
    sudo ufw allow from 192.168.1.100 to any port 8090
    sudo ufw reload
    
  2. 或通过钩子拦截(推荐,见前文请求拦截示例)。

5. 应用基础配置(名称、日志、时区)

5.1 应用名称/描述配置

  1. 编辑 pb_config.json
    {
      "app": {
        "name": "我的 PocketBase 应用",
        "url": "https://your-domain.com",
        "description": "基于 PocketBase 的后端服务"
      }
    }
    
  2. 重启生效。

5.2 日志配置(Debian 12 持久化日志)

  1. 编辑 pb_config.json
    {
      "logs": {
        "level": "info",  // 日志级别:debug/info/warn/error
        "file": "/var/log/pocketbase/pb.log"  // 日志文件路径(Debian 12)
      }
    }
    
  2. 创建日志目录并授权:
    sudo mkdir -p /var/log/pocketbase
    sudo chmod -R 755 /var/log/pocketbase
    sudo chown -R root:root /var/log/pocketbase
    
  3. 重启 PocketBase 生效,日志会自动写入 /var/log/pocketbase/pb.log

5.3 时区配置(Debian 12 系统时区同步)

  1. 先设置 Debian 12 系统时区:
    sudo timedatectl set-timezone Asia/Shanghai
    
  2. PocketBase 会自动同步系统时区,无需额外配置;若需手动指定,可通过启动参数:
    ./pocketbase serve --timezone=Asia/Shanghai
    

6. 自定义配置(钩子脚本补充)

对于配置文件无法实现的自定义需求,通过 pb_hooks/ 脚本补充:

示例:动态跨域配置(根据请求域名放行)

// pb_hooks/cors.hooks.js
onHttpRequest((e) => {
  // 动态允许所有子域名跨域
  const origin = e.request.headers.get("Origin");
  if (origin && origin.endsWith(".your-domain.com")) {
    e.response.headers.set("Access-Control-Allow-Origin", origin);
    e.response.headers.set("Access-Control-Allow-Credentials", "true");
  }
  e.next();
});

四、配置的备份、恢复与生效方式

1. 配置生效方式

配置类型 生效方式
命令行参数 启动时立即生效(临时)
管理后台配置 保存后立即生效(部分需重启,如邮件)
配置文件修改 重启 PocketBase 生效
钩子脚本 重启 PocketBase 生效

2. 配置备份(Debian 12)

# 备份 pb_config.json(核心配置文件)
cp /opt/pocketbase/pb_data/pb_config.json /opt/pocketbase/pb_config.backup.json

# 完整备份所有配置+数据(推荐)
zip -r /opt/pocketbase_backup_$(date +%Y%m%d).zip /opt/pocketbase/pb_data/

3. 配置恢复

# 恢复配置文件
cp /opt/pocketbase/pb_config.backup.json /opt/pocketbase/pb_data/pb_config.json

# 重启 PocketBase
sudo systemctl restart pocketbase

4. 常见配置问题排查

问题1:配置修改后不生效

  • 检查是否重启 PocketBase;
  • 检查配置文件语法(JSON 格式是否正确,可通过 https://jsonlint.com/ 校验);
  • 检查配置文件权限(是否可读写)。

问题2:邮件发送失败

  • 检查 SMTP 端口是否开放(Debian 12 防火墙/云服务器安全组);
  • 验证 SMTP 账号/授权码是否正确;
  • 查看 PocketBase 日志:sudo journalctl -u pocketbase -f

问题3:端口无法访问

  • 检查 Debian 12 防火墙:sudo ufw status
  • 检查云服务器安全组是否开放端口;
  • 检查 PocketBase 绑定地址(是否为 0.0.0.0,而非 127.0.0.1)。

五、总结

  1. 配置核心入口
    • 基础配置(网络、邮件、存储)优先通过 pb_config.json 或管理后台配置(永久生效);
    • 临时测试用命令行参数(重启失效);
    • 自定义逻辑用钩子脚本补充。
  2. Debian 12 关键操作
    • 修改配置文件后需重启 PocketBase(systemctl/堡塔面板);
    • 自定义路径(存储/日志)需提前创建并授权;
    • HTTPS 推荐用 Nginx 反向代理,而非 PocketBase 内置方式。
  3. 生产环境必配
    • 邮件配置(密码重置)、HTTPS(安全访问)、跨域配置(前端访问)、日志持久化(排查问题);
    • 配置文件定期备份,避免丢失。

通过以上配置,可完全适配 Debian 12 系统下 PocketBase 的生产环境需求,兼顾安全性、稳定性和自定义性。

匠心独运,千锤百炼,品质非凡。
回复

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

您需要 登录 后才可以回复,轻松玩转社区,没有帐号?立即注册
快速回复
关灯 在本版发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表