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