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