<h1>Debian 12 下 PocketBase 全维度配置指南</h1>
! S3 K/ f8 D& X3 e3 |<h2>一、核心需求确认</h2>1 _' t6 Z/ T Z& E3 z
<p>你需要在 Debian 12 系统中完成 PocketBase 的<strong>全场景配置</strong>,包括基础网络(端口、绑定地址)、邮件(SMTP)、存储(本地/S3)、安全(跨域、认证)、应用基础(日志、时区)等核心配置,同时掌握配置的生效方式、备份与问题排查方法,适配生产环境的实际需求。</p>
8 l& H' [( F9 ` V( F9 Y$ b: f: R<h2>二、PocketBase 配置的核心入口(Debian 12 环境)</h2>$ X! n& c6 A1 V3 V. V. O5 n
<p>PocketBase 的配置主要通过 4 种方式实现(优先级:命令行参数 > 管理后台 > 配置文件 > 钩子脚本),所有配置最终会落地到 <code>pb_data/pb_config.json</code>(运行后自动生成),以下是各入口的适用场景:</p>
( e4 K& p9 B+ b. u1 g<table>; T& e/ U0 S- I: H$ u
<thead>
. p- w1 \# }& _4 _<tr>
" p' u. `9 z, C<th>配置方式</th>. S6 s; [ ]' x7 M; H
<th>操作路径</th>
+ f8 [: } Z/ f<th>适用场景</th>
' H7 S" \! y5 I$ G2 |$ d</tr>" Q) x6 B; N7 E* ^! B3 g
</thead>
" p* Q$ H9 I. s. C<tbody>
) V8 z+ W+ }% `9 ~) I& r/ G' ^<tr>
) F! f% ?. c& [& I: Z4 f<td>配置文件</td>. b( F8 y6 P5 ~% \0 n6 R ~
<td><code>/opt/pocketbase/pb_data/pb_config.json</code>(手动编辑)</td>! Z( Q$ X& Z% q
<td>所有基础配置(网络、邮件、存储、安全)</td>
1 x1 {1 ]* D- ~" W4 {0 j( Q. S( e, p</tr>: X0 m/ ?. s9 n3 ]7 M' ~7 N. x
<tr>6 j1 \5 R [0 H+ R4 G" o1 ^
<td>命令行启动参数</td># U; g% y5 Z; J3 j9 r" D
<td>启动时追加参数(如 <code>./pocketbase serve --http=0.0.0.0:8080</code>)</td>
9 V& b/ t+ s+ ~2 H# |; ]<td>临时覆盖配置(如测试端口、调试模式)</td>/ l# c) D, V; W2 S4 y- |) @
</tr>% V: ^. z" ~# C$ V, e, a7 p
<tr>
' ^, Y- ]0 Y6 M' R7 b<td>管理后台</td>1 A% w5 C+ ^( ~; |" v
<td><code>http://域名/_/</code> → 设置(Settings)</td>
. `2 n% l5 f5 O7 E. T; r1 `2 ^) x<td>可视化配置(邮件、跨域、认证策略)</td>
* G" p+ R" W0 u) I, t</tr>" V! `$ ]8 F9 ~3 S
<tr>
! d) Z W% t3 o<td>钩子脚本</td>
. n5 Q+ C" ?% y* }9 [<td><code>pb_hooks/</code> 下的 JS 脚本</td>, B" R" A: l2 l* k8 s2 N W6 Z
<td>自定义配置(如动态跨域、自定义认证规则)</td>/ V! O* c9 I3 D9 h$ i
</tr>2 A( k8 e; K9 Z$ u: ~4 {, i" s$ @ A
</tbody>/ G n2 c( i' z8 Y
</table>
% u! `: ~% ~8 m! k<h3>前置操作(Debian 12)</h3>
# o& g/ F# U" D5 G& B# n<ol>
- K% V6 k* X# p3 ?<li>确认 PocketBase 工作目录(默认 <code>/opt/pocketbase</code>),若路径不同需替换下文所有路径;</li>' L3 h6 {4 W! f8 M) j9 D
<li>确保对 <code>pb_data/</code> 目录有读写权限:
6 N: s# E Y) R( B( z<pre><code class="language-bash">sudo chmod -R 755 /opt/pocketbase/pb_data
: Y3 m/ e+ z0 Qsudo chown -R root:root /opt/pocketbase/pb_data # 或你的运行用户
5 \. t, C4 p3 ^$ W</code></pre>1 T6 }3 l4 @6 s1 z8 l
</li>4 K- i+ f9 I2 F: ~3 ?
</ol>4 D# O I1 R6 _* m D4 B
<h2>三、核心配置模块(Debian 12 实操)</h2>
+ V: `, V+ C4 k) E2 u _<h3>1. 基础网络配置(端口、绑定地址、HTTPS)</h3>
. f' `$ [+ U' a3 `8 j8 v9 K<h4>1.1 修改默认端口/绑定地址(3种方式)</h4>
+ r4 ~' ?3 @ L0 `2 T$ H5 L# \<p>PocketBase 默认监听 <code>0.0.0.0:8090</code>,以下是修改方式:</p>2 Y% S+ ^6 [0 ^" ?% I
<h5>方式1:命令行参数(临时生效,重启后失效)</h5>& n: e2 f3 R6 F$ @* B" Z& L
<pre><code class="language-bash"># 切换到 PocketBase 目录
9 n6 W- g1 s1 ~) f& N: o* f6 w \cd /opt/pocketbase
1 J. e8 |2 e. R- x8 m- u/ W7 t1 s) M2 p$ y; r) {
# 监听 8080 端口,仅绑定本地回环地址(仅服务器内部访问)
1 q- b' s9 u, t7 u. `; x./pocketbase serve --http=127.0.0.1:8080
6 y, l& u! E* u& r# @& i& A% I. f: |" ^: b. B( t8 n
# 监听 80 端口(需 root 权限),绑定所有网卡; ?$ m2 D# t, ]8 g# w
sudo ./pocketbase serve --http=0.0.0.0:80
! _: T8 n0 c0 U5 O! \</code></pre>
9 L6 Y$ \% p4 M9 W: z<h5>方式2:配置文件(永久生效)</h5>! z6 c/ }# X! D
<ol>7 i* c. @ a+ T0 o( x+ j
<li>编辑配置文件:
; n% F1 }+ I/ ]8 k3 G% b' d A<pre><code class="language-bash">nano /opt/pocketbase/pb_data/pb_config.json/ |. C: L5 Q0 q7 n" }! p/ X$ v
</code></pre>
& k5 b4 Z( I) D: ?- T: Z</li>$ P- a' ~2 {6 D
<li>添加/修改 <code>api</code> 节点(无则新增):
, s5 b, Q& g4 H# j4 r1 L<pre><code class="language-json">{3 _' z: k* ]6 K4 t) q
"api": {7 K: r7 M. g4 ]3 m/ l9 Z# u0 h3 ^
"httpAddr": "0.0.0.0:8080", // 绑定地址+端口8 o* F, B" b, Q( `8 _
"httpTimeout": 30 // 请求超时时间(秒)" |9 t. ^5 `4 T
}) M2 |; x5 F! E7 g( m% H
}
. R! a! f" D! E! z+ {</code></pre>
- Q. W2 n+ V0 F3 C: p- u</li>
% h, _" k/ d* ]6 S M0 L<li>保存后重启 PocketBase:
) I" y0 `8 S" o6 \% ^6 u<pre><code class="language-bash"># systemd 服务方式
! w/ a8 R# ~' Q! lsudo systemctl restart pocketbase1 l l# `( c( h* C2 k4 W
1 | w6 O! u2 L) u1 e! x# 堡塔面板方式:进程守护 → 重启 PocketBase) A! K$ z5 X) A' Y
</code></pre>/ J D9 t. ]7 F9 S
</li>2 n H1 G `! W8 I: C2 F
</ol>
& Z" t5 Y, G S6 p& X<h5>方式3:堡塔面板进程守护(永久生效)</h5>% v `2 J% q, M$ [4 m6 d
<ol>
4 W h# \/ l% I* x7 p. D8 v<li>登录堡塔面板 → 进程守护 → 找到 PocketBase 进程 → 编辑;</li>! r4 B# H0 E/ z4 V5 N4 a1 s! c
<li>修改「启动命令」为:
1 q1 K# K n; w4 f% F2 L. X<pre><code class="language-bash">./pocketbase serve --http=0.0.0.0:80804 u- \4 _: Z& H+ e# G
</code></pre># b" H. [- B- z& ~8 R P8 D
</li>& n+ B* [7 k. _0 F2 v( ?! r6 [
<li>保存并重启进程。</li># H' I- v$ ~# M4 Y( X" f
</ol>
0 v2 Z5 x% \! q8 b; I<h4>1.2 配置 HTTPS(Debian 12 推荐 Nginx 反向代理)</h4>, g$ p# V5 Y4 k4 ^$ `
<p>PocketBase 自身不直接支持 HTTPS,Debian 12 下推荐通过 Nginx 配置(替代 PocketBase 内置的 HTTPS 方式,更稳定):</p># o7 C1 U$ \4 }! \
<ol>- C, {5 g% }4 ]' M' @
<li>安装 Nginx(Debian 12):
* V3 u( W- H5 f) f<pre><code class="language-bash">sudo apt install nginx -y
' z7 n, [' |& h" H6 ~</code></pre>( a8 J+ T4 |" Y4 C1 t _ G6 F! ^
</li>$ X. W* f+ W9 K6 G
<li>创建 Nginx 配置文件:
" U. G9 u8 g" }6 U% w* u<pre><code class="language-bash">sudo nano /etc/nginx/sites-available/pocketbase-https. ~8 N4 P! P" J H0 y9 X% k
</code></pre>
% _" P( C6 L% T: m9 q9 C P</li>4 q! v2 `1 t* Z
<li>粘贴以下配置(替换 <code>your-domain.com</code> 为你的域名):
6 ?* ? X5 Y+ F, v<pre><code class="language-nginx">server {
' N! j+ F& u# a listen 80;3 B2 s# D" z- t( q
server_name your-domain.com;
- w5 }$ q$ I# S # 重定向 HTTP 到 HTTPS7 _* S) r2 C* o2 \. y
return 301 https://$host$request_uri;
; D" l" p) V. s& y( E8 I}9 z% w- s1 ~1 o# O: Z0 ~
/ y! O* L0 j4 l8 S' I# P) {( e
server {- E* r, R! v( H2 N W
listen 443 ssl http2;& r% y1 R8 E X4 Z0 w& W
server_name your-domain.com;( O- M# x7 t+ E1 G1 B
5 A, K3 {/ o5 ^4 U
# SSL 证书(Let's Encrypt 免费证书)
# a, r1 _, m. L T* `8 p4 |# t* @' X8 ^ ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
4 s+ r. U% H r6 O ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;0 k2 o3 H& ]' j. P, D
ssl_protocols TLSv1.2 TLSv1.3;" X2 I0 l- I1 y7 o2 y
0 d* X9 P c6 V' c! w
# 反向代理到 PocketBase
# U" S- `1 I! K) s2 o location / {. x* L$ ?3 V7 t2 w# j
proxy_pass http://127.0.0.1:8090;2 f. X3 Z: w* @3 G0 R
proxy_set_header Host $host;
/ Z/ i# G$ y* j; _ proxy_set_header X-Real-IP $remote_addr;
7 X( `7 K1 }# Z. c+ C) U7 G proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
: w4 l8 B: }+ ]# i' z. D proxy_set_header X-Forwarded-Proto $scheme;/ P+ V6 W6 E9 |' I
}8 `1 z# R5 X0 B. }2 n7 v
}
" w4 i4 n( Q6 @</code></pre>+ b# l% T j- d B9 `1 w3 I# x8 n, I
</li># P$ b' ?% j8 C
<li>启用配置并重启 Nginx:
/ R; M# M' ?( @) a9 K+ G<pre><code class="language-bash">sudo ln -s /etc/nginx/sites-available/pocketbase-https /etc/nginx/sites-enabled/
3 l) h! c6 S3 R% Z1 K8 y/ gsudo nginx -t # 校验配置语法
4 f7 ~. o( Y; n; F5 V9 e: U1 L, asudo systemctl restart nginx
* n% r+ r5 t2 t</code></pre>
2 X1 Z/ d2 C1 T3 {0 y</li>: G6 Z/ e2 N! }; l( h
<li>申请 Let's Encrypt 证书(Debian 12):+ G0 d0 C* I8 k& w8 d
<pre><code class="language-bash">sudo apt install certbot python3-certbot-nginx -y
) f/ m8 `& I6 N: z8 m esudo certbot --nginx -d your-domain.com! q6 o9 C4 I# ^% L: h c
</code></pre>
/ I# h9 ]8 p, X: Y</li>
0 K! H& ^- \+ @( U, W& ]</ol>1 |" }# f0 e- ~' k; e
<h3>2. 邮件配置(SMTP,用于密码重置/验证)</h3>) A' y6 {8 Z; [! N* h/ {
<p>PocketBase 需配置 SMTP 才能发送邮件(如用户注册验证、密码重置),以下是 Debian 12 下的配置步骤:</p>6 a/ |/ f' {1 A! \0 Q) c: j
<h4>方式1:管理后台可视化配置(推荐)</h4>- s- `+ ~( q" j) G+ b7 b) f( T
<ol># B/ p' n0 p! V) L" D* V
<li>+ |5 U) L8 X1 Q$ W/ c- M2 U
<p>访问 <code>http://域名/_/</code> → 左侧「Settings」→「Mailer」;</p>! E) P. B6 T2 T; u$ P o. c( s
</li>/ I* Z( ~4 V+ ^/ m1 d [
<li>" S& n( q& k$ I
<p>填写 SMTP 信息(以腾讯企业邮/QQ 邮箱为例):</p>
. b3 n# _% s ^1 x/ X<table>
2 n- @. C) w7 m* Y& S& r<thead># M5 k( s$ w6 |0 {6 K( Z3 \
<tr>
" d/ l4 V, t" N& i5 Z& Q5 H<th>配置项</th>& L- k+ F6 {, L" R) l; D
<th>填写内容(QQ 邮箱)</th>- t. V$ r+ K: z9 \; I6 Q
</tr>5 }: ?0 ~ @6 I. Y! k$ L& c
</thead>& m( f. N: c3 `. c
<tbody>4 [. s. Y* ]. V' \6 V: k! A
<tr>
# @' V* B4 {. ~9 h/ @) |8 C& X<td>From address</td>: n9 C! V- q9 e2 n) [
<td>你的邮箱(如 <code>xxx@qq.com</code>)</td>7 S3 ? W& E9 k/ k+ n. _
</tr>& @7 n/ h$ j4 f% t$ [
<tr>" A7 {6 y3 Z t: ~2 d# C# a- `
<td>From name</td>8 Q' d$ |+ [; ~5 t0 H
<td>PocketBase 应用(自定义)</td>
1 M7 }# D) _3 ?0 a( y$ C' r/ u</tr>' \1 Z, p# l4 A; ~5 A" E3 A
<tr>/ q3 w$ g ^3 Z3 W) i y
<td>SMTP host</td>) ?! Q8 r' r/ p: q6 H% O
<td>smtp.qq.com</td>
3 Y( Z; X" N4 i* z</tr>
; i/ d0 ~7 C& Y' g4 D<tr>
2 _2 w- |* A- x! G. m! v; }<td>SMTP port</td>
z( |" \: _2 i& x<td>465(SSL)/587(TLS)</td>
" }4 E2 O5 R n# ~: F' i' _# M</tr>4 j! O4 Z, ~* N2 B+ ]' G
<tr>. c; v) v* Z, U' O/ b* s7 U. _
<td>SMTP username</td>( o* B6 m f* W9 T9 R0 F- \- y
<td>你的邮箱(如 <code>xxx@qq.com</code>)</td>; N( w) r6 }6 g+ C0 I' f
</tr>1 \/ y8 L1 Y e, O& h) i; p* S
<tr>
* b: \ K# f1 \0 O7 W K<td>SMTP password</td>* U- l- [/ h5 o" ?7 V
<td>邮箱授权码(非登录密码)</td>- J! b9 Q1 r! ]* |9 Z. C
</tr>" [; \! W2 z$ y' B( f+ b8 o: q
<tr>
5 t) R7 U7 o2 J6 A& x( T<td>SMTP secure</td>
- D3 M6 V. z2 a% X, w<td>SSL(对应 465 端口)/TLS(对应 587 端口)</td>* R; Q. A% D; |- K, L b' |, O7 j
</tr>: o, @1 j- i9 |0 d
</tbody>9 g6 E- ^8 T; u c/ I+ |: j
</table>- V: F0 m1 E/ [6 u2 N/ [
</li>
4 `9 Q+ m2 l0 U. ]7 }) G<li>
" l0 l0 s5 }( F' L' E1 C<p>点击「Test」测试邮件发送,成功后点击「Save」保存。</p>( G5 }. n. V4 [) k
</li>+ c* n8 j6 k0 I
</ol>1 j2 i- C5 P; ^& T6 f( e3 }
<h4>方式2:手动编辑配置文件(永久生效)</h4>1 e. x8 i8 `2 T$ f8 I n+ G
<ol>
0 n" N* v: ?& b- n<li>编辑 <code>pb_config.json</code>:
# @# |! j; `: |<pre><code class="language-bash">nano /opt/pocketbase/pb_data/pb_config.json- ^: D2 n* C9 f1 f/ J- z0 ] b6 f1 _
</code></pre># P. R% L, L& Z6 L: N0 T
</li>
6 T( s+ |( S6 i" r6 u4 e6 k% k8 T<li>添加/修改 <code>mailer</code> 节点:7 I/ T' S4 v/ b& Y% ?
<pre><code class="language-json">{
5 w- F9 `8 W0 J) W& X! U* } "mailer": {- Q9 l* f- g/ D% p
"fromAddress": "xxx@qq.com",/ g0 i; Z* c2 o/ \) |& E
"fromName": "PocketBase 应用",: k ~) _: l) R" P1 q! p) k8 W
"smtp": {
( m* W6 Y: ?9 O6 J8 M/ J% T0 e7 J "host": "smtp.qq.com",* r1 g: a( X$ u! D
"port": 465,
6 M9 h, w3 N( |5 V* K& q "username": "xxx@qq.com",1 E2 m3 S& R4 E& G
"password": "你的邮箱授权码", A; y. A& q7 s2 I
"secure": true // true=SSL,false=TLS# p0 R, e# o" `4 r& b2 d5 ~
}
& t: w. G" b( k: c9 C# ?$ [ }" R3 J2 y; Z- f2 B5 b5 s C# R
}
& b$ h1 ]; b$ P</code></pre>
* U ]" y4 q4 a</li>) @4 m8 A( U+ S3 @3 O
<li>重启 PocketBase 生效。</li>
. G& n8 _0 b8 }</ol>
! q- d) o. R' R4 u<h3>3. 存储配置(本地/S3 兼容存储)</h3>
; H- j# z# F7 v9 O! G& E. Y1 w<p>PocketBase 默认将上传文件存储在 <code>pb_data/storage/</code>,可配置为 S3 兼容存储(如阿里云 OSS、腾讯云 COS)。</p>6 ^) r* S( K5 P6 J) w. Q
<h4>3.1 本地存储配置(默认,调整路径)</h4>+ R! b9 h/ Y9 m. f6 l
<ol>
4 D3 }/ D) }! w<li>编辑 <code>pb_config.json</code>:
! e: f. K2 g! B& P( v* m& }3 v4 w<pre><code class="language-bash">nano /opt/pocketbase/pb_data/pb_config.json9 P# t! z! l! c x1 E# d; `
</code></pre>
# T1 X% [ @6 a5 ?' }</li>
2 M l' u5 O0 E5 {! S! v1 q4 e/ n<li>修改 <code>storage</code> 节点(自定义本地存储路径):
% s0 D+ o5 J# a" [<pre><code class="language-json">{
* d! o/ B+ H. V& E! Y9 s "storage": {
7 L5 l, N+ k' @8 Q' G5 k" ^ "local": {
# f/ t) w) Y- r4 V8 T+ e "path": "/data/pocketbase/storage" // 自定义存储路径(Debian 12 需提前创建)1 W/ |2 n* E+ g' U( w
},
: x) N h4 l; j' C2 b3 ` "active": "local" // 启用本地存储
) t) @4 J: R! f }, g& a# Q& W# H" L( r5 c1 z
}
* M& v4 K- F I, @8 }( t# J. c) s</code></pre>
0 H. Q8 l7 P" ~, ]</li>* y9 }3 R8 J2 S, s& v s4 X
<li>创建自定义路径并授权:% S) [5 F% a% ]" R3 {# s' k. ^
<pre><code class="language-bash">sudo mkdir -p /data/pocketbase/storage
1 X7 [% o3 g1 Xsudo chmod -R 755 /data/pocketbase/storage
* O* `( [' A! P) b; h. d* {sudo chown -R root:root /data/pocketbase/storage
# s% T( r0 G0 S$ L/ A+ z% |</code></pre>" ^& a6 Q8 m o8 `# R
</li>" T' Y% y) O4 `0 O& E& ]) V
<li>重启 PocketBase 生效。</li>$ c) z- S. L! |' T
</ol>
* L6 J) J! c1 Z p9 J9 l# ^<h4>3.2 S3 兼容存储配置(阿里云 OSS 示例)</h4>
* F B9 N9 t& O* q# x. Q" j<ol>
& ~& `. k- D# P3 ~# v8 c+ G<li>编辑 <code>pb_config.json</code>:1 [% k" z6 ~5 G+ ]% ?% C: |
<pre><code class="language-json">{
$ e) `: G9 R$ x+ C "storage": {
/ ^3 m& D0 T1 ~4 ? | z "s3": {9 b3 d% m8 f! `/ K9 x
"accessKeyID": "你的阿里云 AccessKey ID",1 v/ h q. m/ e& _: A3 Q
"secretAccessKey": "你的阿里云 AccessKey Secret",
% @% D; |( A- {. [7 ~, C4 x "region": "oss-cn-beijing", // 阿里云 OSS 地域" x' m/ U1 M% H/ o2 ?- D: k
"bucket": "your-bucket-name", // OSS 桶名称( s& \9 s7 I$ H" T0 h/ E7 m
"endpoint": "oss-cn-beijing.aliyuncs.com", // OSS 端点1 R- W" a4 I1 j( k# U' N, s8 x5 i
"disableSSL": false,% \* B- `7 S2 \
"forcePathStyle": false5 C. q/ R" h& f
},
; J$ w7 R) {4 I) \# b6 @# a "active": "s3" // 启用 S3 存储
! c0 M k$ ]; X% ]& I; }' H v3 C8 |' o }
: V0 C) G) d! \4 M( w8 c5 B}% O' i3 [1 I7 n# l
</code></pre>
3 n% c X+ a6 S</li>
2 Q6 p, L4 G N7 M- R0 k: Q<li>重启 PocketBase 生效,上传文件会自动存储到 OSS 桶。</li>1 Y3 i. x% g0 q$ o
</ol># J. d6 I5 u; w4 G' J% I
<h3>4. 安全配置(跨域、认证、密码策略)</h3>" Z+ R3 D2 t3 L% F
<h4>4.1 跨域配置(CORS)</h4>
4 |8 R" W' ^0 z) O8 A- n/ R<h5>方式1:管理后台配置</h5>
# ^: W; t/ T# x: X) \<ol>
1 z9 T- y" u% f* d4 G9 A% C<li>访问 <code>http://域名/_/</code> →「Settings」→「API」;</li>
' o! j2 c, x- D6 @$ I3 y" E& s; ^& H<li>在「Allowed origins」中填写允许的跨域域名(如 <code>https://your-domain.com,http://localhost:3000</code>),多个域名用逗号分隔;</li> H& U* [$ `: {5 w) }5 g- N% v0 s
<li>可选:开启「Allow credentials」(允许携带 Cookie/Token);</li>; o$ p; y+ Q8 n' F' z6 J
<li>保存后立即生效(无需重启)。</li>+ ~. l W# z* Q+ K( N0 v/ K3 D
</ol>/ w x" d! N# p( E7 N$ E. a! s
<h5>方式2:配置文件配置</h5>6 N# ]$ ~. Y4 C% q% s
<ol>5 m: X: d0 _7 Y$ {# Q
<li>编辑 <code>pb_config.json</code>:
; g7 ^7 m- T4 h<pre><code class="language-json">{
. H& d b. C+ i% {$ W "api": {+ P2 l& A7 Q2 n& T
"allowedOrigins": ["https://your-domain.com", "http://localhost:3000"],, @ z8 r$ z* m) L( K. j6 Y
"allowCredentials": true7 w; S4 C& R3 |- F" U! ]# `
}" Y; j1 ?* V+ W6 [8 u# ?# C
}
3 U- B0 _. T+ |# E, G</code></pre>8 [4 Y- S2 E1 |4 B3 x
</li>
" R% I6 o! R; m8 {8 ?* Z<li>重启 PocketBase 生效。</li>0 l K+ W. z% u; S
</ol>1 ~ J% ?6 D6 M E* E6 o+ m. |
<h4>4.2 认证安全配置(Token 超时、密码策略)</h4>
* V# V) }! R: O) k+ N<ol>
! R+ e# c9 [+ t4 E8 \7 ]<li>2 z; I. Z+ Y' N% _- z
<p>管理后台配置路径:<code>Settings</code> →「Auth」;</p>
1 F( ~- S5 u5 I3 E7 _- r</li>
: t/ M7 T! M/ n) |; b& k5 ?<li>
8 b( Z* h, L5 ?: Q<p>核心配置项:</p>
/ M4 Q3 o+ c: j<table>
5 c. V" B- [0 e- O3 N, s8 F& d<thead>6 G; F" n! i. R6 M, e( \& W
<tr>
( x" }$ D; n6 S% N f- f! _+ w' H<th>配置项</th>
0 c, l. H* F) H) u: C+ E1 B<th>作用</th>% ]/ N% X1 l- {' T( ?
</tr>( r# E# D9 r' z6 ]- W5 [
</thead>
. ?6 a4 R* o+ ~8 c! }& q<tbody>3 h& x) }6 V0 I" q) ~$ t) }( I
<tr>0 X3 X1 i' p- q# L9 d2 v
<td>Token duration</td>
5 M! n% i3 \; l- n<td>用户 Token 有效期(如 7d=7 天,1h=1 小时)</td>
6 A$ [' i9 L& v6 p</tr>
/ b+ G# s6 J& ]( t- m& {8 o+ { {, t9 X<tr>1 p, a6 F. i& ]( r
<td>Password min length</td>
9 f9 n5 L: O1 _9 J% l) }<td>用户密码最小长度(推荐 ≥8)</td>7 d$ {- G) |5 ^) @( d, ~& Z; D
</tr>, F+ m0 V1 \: K6 i
<tr>
- d! @: ^9 f; x- W! j% f8 Z<td>Password require chars</td>- m* \% A5 V+ @! [
<td>密码复杂度(是否要求大小写、数字、特殊字符)</td>
" n3 w9 e( Y, V0 l- T3 P</tr> C# u" | ?' u$ G7 T; ^
<tr>& y" q: l, i/ \7 P& |, a5 K
<td>Max failed attempts</td>
* A4 j9 T0 t8 w: i8 s<td>登录失败最大次数(超过后锁定账号)</td>
2 w7 g! G. j9 Y( r' V. Y, m( `. O</tr>1 C2 T" j& W/ q) J
</tbody>. v3 g8 n: L* b) G
</table>
+ }3 Z9 A% B' g9 a& o* P( N8 x</li>) |& Y5 Z2 A% w4 R( e; V
<li>
# p) g& g# g) Q; u* Q) S6 [<p>保存后立即生效。</p>3 Q! l' \# A4 h5 X
</li>
; o# J! Y* G; u$ @8 p- W</ol>% K% y( d( x' ^$ j+ @, H
<h4>4.3 管理后台安全配置</h4>
, u7 h* J% }# Q# d' f6 ?<ol>
s8 r: ?$ U6 e5 C! l" l<li>限制管理后台访问 IP(Debian 12 防火墙):& a8 ^* I& R" H: T1 X4 x
<pre><code class="language-bash"># 仅允许 192.168.1.100 访问 8090 端口(管理后台)
# N0 ~( Q# d$ a( D: C, Csudo ufw allow from 192.168.1.100 to any port 80903 C1 G E1 r8 k7 u
sudo ufw reload
( Z' J/ ]8 f- B' I- y</code></pre>
9 t8 V1 C% j' q</li>
/ _8 r/ t* t, N# U<li>或通过钩子拦截(推荐,见前文请求拦截示例)。</li>
5 \$ l3 R# r& k. h6 @</ol>
3 Y' X* |. ~7 H$ O<h3>5. 应用基础配置(名称、日志、时区)</h3>" W. K! X! \2 P* V" t; k* |" K+ C
<h4>5.1 应用名称/描述配置</h4>" W9 p* v$ m- C G' X* \
<ol>8 I! D3 `. l8 U5 M
<li>编辑 <code>pb_config.json</code>:
; i e' F: t1 G8 t5 r( h<pre><code class="language-json">{& L) B8 \% v" E
"app": {8 c: N8 R: K1 s2 b# \. I, Y, @) ?& o
"name": "我的 PocketBase 应用",
& R K% ~2 {: x "url": "https://your-domain.com",' `7 y+ m! G2 ~, ]% c( S$ Z# d3 Z, `
"description": "基于 PocketBase 的后端服务"2 w2 C- [0 R/ S7 x; `* |# q' u
}( `: r5 v3 J2 j7 d1 ]
}/ f( o0 I/ {' I& _0 M
</code></pre>8 r* s0 f* {. \* e
</li>
$ `3 D8 ~ P- }6 j' w<li>重启生效。</li>
) g9 W, I5 z2 o2 J: R</ol>
! r" ~! j5 Y; [3 c<h4>5.2 日志配置(Debian 12 持久化日志)</h4>; {' q' T5 k3 \) _3 k- S. }6 a: Z8 V/ T0 d
<ol>' [4 q; ]. S0 y
<li>编辑 <code>pb_config.json</code>: L5 H, Z& Y; ~% f9 w1 Y; b
<pre><code class="language-json">{ y s4 X& X" f4 T; n. H
"logs": {
3 j) m( K# x5 A5 j# C0 ?0 \ "level": "info", // 日志级别:debug/info/warn/error8 U& s& T! Y& [6 e) D
"file": "/var/log/pocketbase/pb.log" // 日志文件路径(Debian 12); C( P$ q4 u9 a: h
}
E5 ?/ {+ l4 \: T4 L; C}
% `! v7 h2 ]- D4 @7 W7 }</code></pre>
; G: r$ r2 Q$ d H</li>- e3 h2 r5 k- }) N# i: x
<li>创建日志目录并授权:& }' `* a" q- ]& G5 @6 B2 y
<pre><code class="language-bash">sudo mkdir -p /var/log/pocketbase3 I; |8 ~- d* ^/ Q0 M) p' l
sudo chmod -R 755 /var/log/pocketbase
: R0 _3 ^" z \# xsudo chown -R root:root /var/log/pocketbase
~: ]+ d+ B# G; j4 d g</code></pre>1 l: T0 R9 j: C% V! H, k, W- }
</li>! Q2 p: H2 I$ c- l
<li>重启 PocketBase 生效,日志会自动写入 <code>/var/log/pocketbase/pb.log</code>。</li>7 y. Z2 P& F2 |: M/ j" _
</ol>6 U' B' ~2 |9 j- i
<h4>5.3 时区配置(Debian 12 系统时区同步)</h4>- ^6 k; T+ p4 E% ]( W9 J
<ol>0 O: I5 n: X6 q+ A% K
<li>先设置 Debian 12 系统时区:8 [6 Y& V+ R2 @5 V% m( y
<pre><code class="language-bash">sudo timedatectl set-timezone Asia/Shanghai$ \: }8 Z* U+ P4 J: H
</code></pre>
( Z1 V. P. p1 R- R6 W</li>1 P3 D- A) K1 }% E! X6 U$ [
<li>PocketBase 会自动同步系统时区,无需额外配置;若需手动指定,可通过启动参数:, W/ ~* \/ X7 x
<pre><code class="language-bash">./pocketbase serve --timezone=Asia/Shanghai, p, q( `' L5 d5 `1 f k
</code></pre>+ G) b( W' E, [" R, \$ b3 l
</li>
2 O, j8 Q0 n/ {</ol>& k! ^; \" ? M( \- @. i. o
<h3>6. 自定义配置(钩子脚本补充)</h3>( z$ Q) w W2 v( X
<p>对于配置文件无法实现的自定义需求,通过 <code>pb_hooks/</code> 脚本补充:</p>
& C9 S2 s+ |# r4 S6 t<h4>示例:动态跨域配置(根据请求域名放行)</h4>5 _# [& { S* O4 U4 Q& E
<pre><code class="language-javascript">// pb_hooks/cors.hooks.js
2 E/ C" i+ a/ i' F& UonHttpRequest((e) => { D. C& e# O% {+ X$ c! W
// 动态允许所有子域名跨域
3 ]+ B) A( u! E+ f% d const origin = e.request.headers.get("Origin");
; G0 x1 J2 x+ X. l% s8 U if (origin && origin.endsWith(".your-domain.com")) {7 e+ V* f/ \$ h$ e$ y' K# _* p
e.response.headers.set("Access-Control-Allow-Origin", origin);
6 D5 s! _1 A- h$ D S e.response.headers.set("Access-Control-Allow-Credentials", "true");
$ q/ i, [/ m+ z* ? }
# ?9 l* L. O8 O* ^7 N$ x7 N0 L e.next();
* A+ F8 w3 J0 A) }/ O7 v2 J) F});1 n; e( W9 e# J
</code></pre>! c1 H, p) `" q9 p5 ]" |
<h2>四、配置的备份、恢复与生效方式</h2>+ ~2 l. f1 u, o- G0 V9 E2 c* D% C
<h3>1. 配置生效方式</h3>
$ I9 M8 F( u% v7 ]/ {9 F! ~<table>
3 j ?+ R- {5 `& f<thead>
9 I a" O% d" @$ I<tr>. H9 _* U4 ^3 }8 [# r7 G
<th>配置类型</th>6 L n# N: x0 `4 g: ?, j
<th>生效方式</th>
( d: F: q t+ {! }- B, g</tr>- Y# ]7 U! v" m6 k
</thead>
# d0 x1 D6 H9 z4 y2 {6 g) |" c<tbody>
! x4 D$ m6 h3 z% d& l" C<tr>
1 x8 t' l8 t: V% R4 r<td>命令行参数</td>
n' ]; K0 Q& u8 K5 d4 e5 |<td>启动时立即生效(临时)</td>
- V0 Y {: m8 l2 f- H, ]</tr>
. [0 L* f/ _0 ~) K) R4 K' {<tr>
" j4 U. u0 N$ {' E<td>管理后台配置</td>- Y1 `$ u5 n9 S7 `& T
<td>保存后立即生效(部分需重启,如邮件)</td>
, C' g1 d4 }" ]+ d</tr>( k8 V2 `0 a; Y: R& M* {4 ?
<tr>
4 T, G# g' d ]0 n9 T/ p<td>配置文件修改</td>
F- b" e% ^' f" R<td>重启 PocketBase 生效</td>% N, X* j+ v Y' Z0 \$ v' W1 K
</tr>7 Q J \/ B2 ]" k! H) c2 L, o
<tr>$ J" c' g9 g- E% y6 Z8 [
<td>钩子脚本</td>
9 g+ Q3 R5 L$ l, W) b: J9 q+ s' y7 j<td>重启 PocketBase 生效</td>
8 s% N9 M% L6 V' l' K2 ?</tr>: L9 ], k, j4 H" R! [9 j, k
</tbody>- j: C; ~3 _5 E" B) P
</table>
5 C* V" |$ j1 z: k0 a h<h3>2. 配置备份(Debian 12)</h3>
" q9 J# a! n& `) I! G2 }3 j& r, U5 S<pre><code class="language-bash"># 备份 pb_config.json(核心配置文件)5 i5 A5 M. ?( K8 n0 N$ y8 Q4 @
cp /opt/pocketbase/pb_data/pb_config.json /opt/pocketbase/pb_config.backup.json! D% T; P" `+ }
2 H6 m" A4 S! u, `' Y g# 完整备份所有配置+数据(推荐)7 X* O0 f1 V4 q- h
zip -r /opt/pocketbase_backup_$(date +%Y%m%d).zip /opt/pocketbase/pb_data/ Y: a0 R5 O& D) P. s# |# D* m0 s
</code></pre>
/ n: m1 l8 o" K+ ^! B# ^$ v5 v, F<h3>3. 配置恢复</h3>* J- H5 M$ x' d* k( b
<pre><code class="language-bash"># 恢复配置文件
9 a) D- G6 Y) O* D- ccp /opt/pocketbase/pb_config.backup.json /opt/pocketbase/pb_data/pb_config.json; R* I6 \6 ~. l$ `4 {& W
Q4 H6 V$ M2 ^
# 重启 PocketBase
/ O, n0 ] [# E) w4 P' Lsudo systemctl restart pocketbase% E( N& w; t+ V2 c5 C: S3 u
</code></pre>( m: j2 e5 r7 |& w e, f
<h3>4. 常见配置问题排查</h3>6 C& v: v( d a2 d! n; |! }) ?' i
<h4>问题1:配置修改后不生效</h4>
5 h: T% x/ n5 |<ul>% n& s5 y% Z! s# g" S7 d
<li>检查是否重启 PocketBase;</li>
3 A' a! x3 ~" D( `8 |" E<li>检查配置文件语法(JSON 格式是否正确,可通过 <code>https://jsonlint.com/</code> 校验);</li>* @0 k7 t: M8 u3 }6 B
<li>检查配置文件权限(是否可读写)。</li>
( J5 W1 |* S' ^0 L# J( e</ul>. l" t! @5 B! c
<h4>问题2:邮件发送失败</h4>" c5 D4 [% L! K1 m
<ul>3 |1 C' \1 p3 s- L- l& G
<li>检查 SMTP 端口是否开放(Debian 12 防火墙/云服务器安全组);</li>
- r) `* L* k" b. _; d4 i5 O Y% C<li>验证 SMTP 账号/授权码是否正确;</li>7 Z3 A, t; g) V1 J' e
<li>查看 PocketBase 日志:<code>sudo journalctl -u pocketbase -f</code>。</li>
8 H8 n6 ^# Y/ |5 z6 i7 k( e: [</ul>
) p) }( V+ M7 ~, @<h4>问题3:端口无法访问</h4>! m7 r! H2 H9 ~, h$ H) ?
<ul>
- @3 ^& G$ t' L# r$ u4 O/ c: Z<li>检查 Debian 12 防火墙:<code>sudo ufw status</code>;</li>
9 R7 L: k f9 [5 Q5 ^8 y/ ^3 _% M<li>检查云服务器安全组是否开放端口;</li>2 k& p; b' \" P6 O
<li>检查 PocketBase 绑定地址(是否为 <code>0.0.0.0</code>,而非 <code>127.0.0.1</code>)。</li>
- ?# k) K6 v$ O8 k4 P3 I% v: \</ul>6 s6 g$ V& v( ^( ~+ D" L, r3 |
<h2>五、总结</h2>+ ?, p0 `1 u9 J
<ol>
0 z6 p! l7 P1 q" ] F<li><strong>配置核心入口</strong>:. [( C/ n* A+ e) @
<ul>) @5 q& j, m5 [
<li>基础配置(网络、邮件、存储)优先通过 <code>pb_config.json</code> 或管理后台配置(永久生效);</li>
$ `0 G: O2 ]. U/ u- \) K; ^5 V: t" Z<li>临时测试用命令行参数(重启失效);</li>
) U" T) d9 C4 h, S$ q<li>自定义逻辑用钩子脚本补充。</li>. V: }, U' ?: T! c8 j
</ul># @( Z: h; o9 R* P/ q
</li>
3 ]/ s/ \* J9 q$ I8 r- w* U<li><strong>Debian 12 关键操作</strong>:
' X$ ?9 f4 u; u9 `<ul>
: `; k$ ^! c5 P3 f2 h7 @* j<li>修改配置文件后需重启 PocketBase(systemctl/堡塔面板);</li>' U. l {+ H$ c- b: M. _! W$ M/ E$ H3 F9 I
<li>自定义路径(存储/日志)需提前创建并授权;</li> x: X8 P8 z$ h1 Q7 W
<li>HTTPS 推荐用 Nginx 反向代理,而非 PocketBase 内置方式。</li>
0 q. ~, b! [/ V' Z</ul>2 Z3 F! t8 U' N
</li>
$ t& A5 {# r, L( ?" l<li><strong>生产环境必配</strong>:4 l. ]+ p! T7 V: e+ \8 S% F+ P- ~
<ul>
2 w. w: E( o1 J' T/ |0 s* n<li>邮件配置(密码重置)、HTTPS(安全访问)、跨域配置(前端访问)、日志持久化(排查问题);</li>: Y, d! I" f+ _9 Q4 F, H: l Y: e
<li>配置文件定期备份,避免丢失。</li>
6 X) a' Q2 ?! ~</ul>7 T" B; j& `' G: h
</li>
; g0 l, z ~7 j' l8 {</ol>
$ j7 K- g5 V; F% u<p>通过以上配置,可完全适配 Debian 12 系统下 PocketBase 的生产环境需求,兼顾安全性、稳定性和自定义性。</p>
* s8 }9 e& S3 W1 z0 t8 E. p |