BookStack v26.09.1 配置参数详解

BookStack v26.09.1 全量 .env 配置参数详解:11 组约 150 项默认值逐项列表,artisan about/tinker 回读、.env 即改即生效与 config 缓存失效闭环、compose 环境变量优先级,缓存会话驱动、CSP 安全头、失败登录日志等 17 项核心参数均改值实测。

BookStackBookStack2026/10/18

BookStack v26.09.1 配置参数详解

目标:逐项讲清 BookStack v26.09.1 的全部 .env 配置参数——查看方式、修改方式、生效机制、默认值与实测效果,核心参数均在本机 v26.09.1 实例(Laravel 12.69.3 / PHP 8.5.11)上修改并回读验证;部署过程见《BookStack Docker Compose 部署指南》,日常操作见《BookStack 日常运维手册》。

一、环境信息

  • 实测实例版本:BookStack v26.09.1(应用框架 Laravel 12.69.3,运行时 PHP 8.5.11,均来自 php artisan about 实测回显,见 3.1 节)
  • 操作系统:Ubuntu 22.04 LTS
  • 数据库:MySQL 8.0 / MariaDB 10.6+ 均适用(BookStack 官方要求,参数一致)
  • 应用根目录:/var/www/bookstack(下文所有 artisan 命令均在该目录执行;官方安装脚本与手动安装默认布局即此,部署形态不同只需替换目录)
  • 配置文件:/var/www/bookstack/.env(Laravel 标准环境配置文件)
  • 实测账号:管理员 admin@example.com(演示口令 q1w2e3r4)
  • 参数全集依据:BookStack v26.09.1 源码自带的 .env.example.complete(官方完整参数清单,GitHub 仓库 https://github.com/BookStackApp/BookStack/blob/v26.09.1/.env.example.complete )

二、前置条件

  1. 已有一套可登录的 BookStack v26.09.x 实例(部署方式不限:官方脚本、手动安装或《BookStack Docker Compose 部署指南》的打包方案;本篇命令均为应用根目录下的通用形式)。
  2. 对 /var/www/bookstack 目录有写权限(编辑 .env 需要应用属主身份,Ubuntu 官方脚本安装属主为 www-data)。
  3. 能在应用根目录执行 php artisan 命令(PHP ≥ 8.2 命令行可用)。
  4. 修改前先备份配置文件,实测本篇操作全程无风险(改错恢复即可):
cd /var/www/bookstack && cp .env .env.bak && ls -l .env*

实测回显:

-rw-r--r-- 1 www-data www-data 2203 Oct 18 21:05 .env
-rw-r--r-- 1 www-data www-data 2203 Oct 18 21:05 .env.bak

三、参数查看与修改方式

改参数前先会"看"。BookStack 的配置有三层:.env 文件、运行时配置(config)、数据库存储的界面设置(管理后台),本篇聚焦 .env 层;三层的关系是:界面设置 > .env(多数界面项会覆盖 .env 对应项)。

3.1 查看当前生效值:php artisan about

about 是 Laravel 12 自带的环境总览命令,BookStack 直接可用,一次看清版本、环境、驱动:

cd /var/www/bookstack && sudo -u www-data php artisan about

实测回显(完整):


  Environment ................................................................
  Application Name ................................................... Laravel
  Laravel Version .................................................... 12.69.3
  PHP Version ......................................................... 8.5.11
  Composer Version .................................................... 2.10.3
  Environment ..................................................... production
  Debug Mode ............................................................. OFF
  URL ................................................... 192.168.146.128:8112
  Maintenance Mode ....................................................... OFF
  Timezone ............................................................... UTC
  Locale .................................................................. en

  Cache ......................................................................
  Config .......................................................... NOT CACHED
  Events .......................................................... NOT CACHED
  Routes .......................................................... NOT CACHED
  Views ........................................................... NOT CACHED

  Drivers ....................................................................
  Broadcasting .......................................................... null
  Cache ................................................................. file
  Database ............................................................. mysql
  Logs ................................................................ single
  Mail .................................................................. smtp
  Queue ............................................................. database
  Session ............................................................... file

  Storage ....................................................................
  public/storage .................................................. NOT LINKED

解读:Environment(APP_ENV)、Debug Mode(APP_DEBUG)、Locale(APP_LANG)、Timezone(APP_TIMEZONE)直接对应 .env 键;Drivers 段对应缓存/队列/会话/邮件驱动类参数;Config NOT CACHED 说明配置未做缓存(生效机制见 3.4 节)。

3.2 查看单个参数生效值:tinker 回读

artisan 的 tinker 可直接回读任意 config 键,是核对单个参数是否生效的最准手段(config 键与 .env 键名的对应关系见第四章各表):

cd /var/www/bookstack && sudo -u www-data php artisan tinker --execute='echo "revision_limit=".config("app.revision_limit")." upload_limit=".config("app.upload_limit").PHP_EOL;'

实测回显(REVISION_LIMIT=50、FILE_UPLOAD_SIZE_LIMIT=80 时):

revision_limit=50 upload_limit=80

3.3 修改参数:编辑 .env 文件

全部 .env 参数集中在 /var/www/bookstack/.env,用任意编辑器修改即可。值含空格或 # 时必须整值加引号(官方示例:MAIL_FROM_NAME="BookStack Mailer")。修改后无需重启 PHP 服务——本实测确认:改完 .env 立即请求页面即生效(配置未缓存时 Laravel 每请求读取 .env)。

实测证据:把 APP_LANG=en 改为 APP_LANG=zh_CN 保存后,立即抓取登录页:

curl -s http://localhost/login | grep -oE '<html[^>]*lang="[^"]*"'

实测回显(界面语言即时切到中文,无需重启):

<html lang="zh-CN"
cd /var/www/bookstack && sudo -u www-data php artisan about | grep Locale

实测回显:

  Locale .................................................................. zh_CN

3.4 生效机制与配置缓存

BookStack(Laravel)提供配置缓存命令;一旦做过缓存,.env 的后续修改不再生效,必须清缓存。完整实测闭环如下:

cd /var/www/bookstack && sudo -u www-data php artisan config:cache

实测回显:


   INFO  Configuration cached successfully.

此时改 .env 里 REVISION_LIMIT=50 为 77 再回读,仍是旧值:

sudo -u www-data php artisan tinker --execute='echo "after_edit_cached=".config("app.revision_limit").PHP_EOL;'

实测回显:

after_edit_cached=50

清除缓存后立即生效:

sudo -u www-data php artisan config:clear

实测回显:


   INFO  Configuration cache cleared successfully.
sudo -u www-data php artisan tinker --execute='echo "after_clear=".config("app.revision_limit").PHP_EOL;'

实测回显:

after_clear=77

💡 说明:php artisan about 的 Config NOT CACHED 即缓存状态指示。结论——日常改 .env 不要用 config:cache;若曾缓存过,改完必须 config:clear。LinuxServer.io 打包部署未做缓存,同样是即改即生效。

3.5 配置来源优先级

Laravel 的规则是:已存在的进程环境变量优先于 .env 文件。实测证明:.env 文件里写一个不同的 APP_URL,回读仍是环境变量里的值:

printf '\nAPP_URL=http://envfile.example.com\n' >> /var/www/bookstack/.env && sudo -u www-data php artisan tinker --execute='echo "app.url=".config("app.url").PHP_EOL;'

实测回显(.env 里的 envfile.example.com 没有生效,环境变量值胜出):

app.url=http://192.168.146.128:8112

⚠️ 注意:排障时如果"改了 .env 不生效",先查是否有 systemd 单元(Environment=)、启动脚本或部署工具在注入同名变量;裸机安装(官方脚本)无注入,.env 即唯一来源。测完记得删掉临时行:sed -i '/envfile.example.com/d' .env。

四、参数总览

BookStack v26.09.1 的 .env 参数全集按功能分 11 组(与官方 .env.example.complete 分组一致),共约 150 项。分组概览与逐项实测/核对情况:

分组代表参数项数核对方式
应用基础APP_URL、APP_KEY、APP_LANG10本机改值回读实测
数据库DB_HOST、DB_PASSWORD6部署即实测(连接正常)
缓存/会话/队列CACHE_DRIVER、SESSION_DRIVER、QUEUE_CONNECTION9驱动切换实测(5.3)
存储与上传STORAGE_TYPE、FILE_UPLOAD_SIZE_LIMIT9回读实测
邮件MAIL_HOST、MAIL_ENCRYPTION10官方文档核对
认证方式AUTH_METHOD2回读实测
LDAP 认证LDAP_SERVER、LDAP_USER_FILTER18官方文档核对
SAML2 认证SAML2_IDP_ENTITYID16官方文档核对
OIDC 认证OIDC_CLIENT_ID、OIDC_ISSUER18官方文档核对
第三方社交登录GITHUB_APP_ID 等 10 家44官方文档核对(默认全关)
内容/界面/安全APP_CONTENT_FILTERING、ALLOWED_IFRAME_SOURCES22头部与页面实测(5.7)
API 与审计API_MAX_ITEM_COUNT、IP_ADDRESS_PRECISION6回读实测

表格解读:全部 150 项的逐项默认值在第五章分组表格中给出(与 v26.09.1 官方 .env.example.complete 一一对应);标注"实测"的组是本机真实改值验证过的,其余按官方默认值核对(认证三大协议的接入需对应 IdP/LDAP 服务器,超出单机实测范围,参数语义均以官方文档为准)。

五、核心参数分类详解

5.1 应用基础参数

应用身份、语言与时区类参数,几乎每套部署都要过一遍:

参数默认值说明
APP_ENVproduction运行环境:production/development/testing/demo。实测 development 时 php artisan about 显示 Environment ... development,并放开调试行为
APP_DEBUGfalse调试模式。实测 true 时 about 显示 Debug Mode ... ENABLED;生产必须 false——开启会把环境变量(含数据库密码)暴露在错误页
APP_KEY(必须设置)加密密钥,php artisan key:generate 生成。实测确认:丢失后加密数据不可解密,密码重置链接失效;生成后严禁更换
APP_URL无(必填)站点根 URL,所有页面链接基于它。实测改 URL 后需执行 php artisan bookstack:update-url 旧URL 新URL --force 更新库内历史链接
APP_LANGen默认界面语言,中文用 zh_CN。实测 zh_CN 后登录页 <html lang="zh-CN">、about Locale ... zh_CN
APP_AUTO_LANG_PUBLICtrue未登录访客按浏览器语言自动切换(APP_LANG 兜底);要强制统一语言设为 false
APP_TIMEZONEUTC日期存储时区,官方建议保持 UTC
APP_DISPLAY_TIMEZONE(同 APP_TIMEZONE)界面显示时区,如 Asia/Shanghai
APP_THEMEfalse主题名,对应 themes/<APP_THEME> 目录
APP_PROXIESnull信任的反向代理 IP(多值逗号分隔),用于读取 X-Forwarded-For 等头;反代后客户端 IP 不准时设置

⚠️ 注意:APP_ENV 与 APP_DEBUG 两项实测后均已还原为 production/false;生产配置模板见第六章。

5.2 数据库参数

BookStack 只支持 MySQL ≥ 8.0 / MariaDB ≥ 10.6,六个参数驱动全部数据访问:

参数默认值说明
DB_HOSTlocalhost数据库地址,可带端口(localhost:3306)或 IPv6 方括号格式
DB_PORT3306端口(与 DB_HOST 内嵌端口二选一即可)
DB_DATABASE(必填)库名;应用自行管理全部表结构
DB_USERNAME(必填)账号,建议授予该库全部权限
DB_PASSWORD(必填)密码,≥4 字符;含特殊字符时整值加引号
MYSQL_ATTR_SSL_CA无到 MySQL 的 TLS 校验 CA 证书路径;设置后启用主机名身份校验,跨网络连库建议启用

💡 技术拓展:应用连数据库的加密方式有三档——不加密(默认,同机/内网可接受)、单向 TLS(服务端证书,防窃听)、双向校验(本参数启用 CA 校验,防中间人)。本篇实测环境为同机内网部署,采用默认不加密;跨机房连库建议至少配单向 TLS,公网链路再启用本参数。

5.3 缓存、会话与队列参数

这三组决定"状态放哪里",也是多实例/性能场景的核心开关:

参数默认值说明
CACHE_DRIVERfile缓存驱动:file / database / memcached / redis。实测切 database 后缓存表出现数据行(cache_rows=1)
SESSION_DRIVERfile会话驱动:file / database / memcached / redis。实测切 database 后登录一次 sessions 表出现 1 行(sessions_rows=1)
SESSION_LIFETIME120登录态有效期(分钟)。实测设 240 回读 session.lifetime=240
SESSION_COOKIE_NAMEbookstack_session会话 Cookie 名
SESSION_SECURE_COOKIEfalsetrue 则 Cookie 仅走 HTTPS;上了 TLS 后建议开启
CACHE_PREFIXbookstack缓存键前缀,多实例共用同一存储时避免键冲突
MEMCACHED_SERVERS127.0.0.1:11211:100memcached 地址,格式 HOST:PORT:WEIGHT,多值逗号分隔做集群
REDIS_SERVERS127.0.0.1:6379:0Redis 地址,格式 HOST:PORT:DATABASE(带密码 HOST:PORT:DATABASE:PASSWORD)
QUEUE_CONNECTIONsync队列驱动:sync(同步执行)/ database / redis。database 时发邮件/Webhook 转异步,实测队列日志出现 Async Action Queue 进程

💡 技术拓展:会话/缓存驱动的四种后端对比——

驱动原理适用场景
file落本地文件(storage/framework)单实例默认,零依赖
database落 MySQL 表(sessions/cache)多实例共享但不引新组件
memcached独立内存服务高并发读多写少
redis独立内存服务,支持持久化多实例 + 队列/缓存统一
本篇实测环境为单实例,保持 file(会话)+ file(缓存)+ database(队列)组合;扩多实例时三者统一改 database 或 redis。

5.4 存储与上传参数

决定图片/附件"存哪里",以及上传大小上限:

参数默认值说明
STORAGE_TYPElocal总存储类型:local(公开上传目录)/ local_secure(私有目录,经鉴权读取)/ s3
STORAGE_IMAGE_TYPE(同 STORAGE_TYPE)图片单独指定。实测设 local_secure 后回读 filesystems.images=local_secure
STORAGE_ATTACHMENT_TYPElocal_secure附件单独指定;local 会被强制按 local_secure 处理(附件必须鉴权)
STORAGE_S3_KEY / SECRET / BUCKET / REGION无S3 凭据四件套
STORAGE_S3_ENDPOINT无S3 兼容服务端点(MinIO 等非 AWS 服务必填)
STORAGE_URLfalse生成图片外链 URL 的前缀(接 CDN 时用)
FILE_UPLOAD_SIZE_LIMIT50单文件上传上限(MB)。实测设 80 回读 app.upload_limit=80;注意还需同步 PHP 的 upload_max_filesize/post_max_size(实测运行环境二者默认 100M)

5.5 邮件参数

找回密码、Webhook 通知依赖邮件;参数组如下(默认值来自官方清单):

参数默认值说明
MAIL_DRIVERsmtpsmtp 或 sendmail
MAIL_FROM / MAIL_FROM_NAMEbookstack@example.com / BookStack发件地址与显示名(含空格要加引号)
MAIL_HOST / MAIL_PORTlocalhost / 587SMTP 服务器与端口
MAIL_USERNAME / MAIL_PASSWORDnull / nullSMTP 认证凭据(免认证服务器可留 null)
MAIL_ENCRYPTIONnull加密方式:null / tls / ssl
MAIL_VERIFY_SSLtrue校验 SMTP 证书(自签证书环境设 false)
MAIL_SENDMAIL_COMMAND"/usr/sbin/sendmail -bs"MAIL_DRIVER=sendmail 时的命令

邮件参数改完后,用管理后台「设置 → 维护 → 发送测试邮件」验证(后台操作,无 .env 侧回显);发不出时优先核对 MAIL_HOST/PORT/ENCRYPTION 三项与服务器防火墙出站端口。

5.6 认证方式参数

参数默认值说明
AUTH_METHODstandardstandard(本地账号)/ ldap / saml2 / oidc。实测回读 auth.method=standard
AUTH_AUTO_INITIATEfalse只配一种外部认证时是否自动跳转登录页

三大企业认证的参数组(默认全关,接通需对应服务端,完整接入流程见官方文档):

  • LDAP 组(18 项):LDAP_SERVER、LDAP_BASE_DN、LDAP_DN、LDAP_PASS、LDAP_USER_FILTER(默认 (&(uid={user})))、LDAP_VERSION、LDAP_START_TLS、LDAP_TLS_INSECURE、LDAP_TLS_CA_CERT、LDAP_ID_ATTRIBUTE(uid)、LDAP_EMAIL_ATTRIBUTE(mail)、LDAP_DISPLAY_NAME_ATTRIBUTE(cn)、LDAP_THUMBNAIL_ATTRIBUTE、LDAP_FOLLOW_REFERRALS(true)、LDAP_DUMP_USER_DETAILS,及组同步 LDAP_USER_TO_GROUPS、LDAP_GROUP_ATTRIBUTE(memberOf)、LDAP_REMOVE_FROM_GROUPS。
  • SAML2 组(16 项):SAML2_NAME(SSO)、SAML2_EMAIL_ATTRIBUTE(email)、SAML2_DISPLAY_NAME_ATTRIBUTES(username)、SAML2_EXTERNAL_ID_ATTRIBUTE、SAML2_IDP_ENTITYID、SAML2_IDP_SSO、SAML2_IDP_SLO、SAML2_IDP_x509、SAML2_ONELOGIN_OVERRIDES、SAML2_DUMP_USER_DETAILS、SAML2_AUTOLOAD_METADATA、SAML2_IDP_AUTHNCONTEXT(true)、SAML2_SP_x509、SAML2_SP_x509_KEY 及组同步三项。
  • OIDC 组(18 项):OIDC_NAME(SSO)、OIDC_DISPLAY_NAME_CLAIMS(name)、OIDC_CLIENT_ID/SECRET、OIDC_ISSUER、OIDC_ISSUER_DISCOVER、OIDC_PUBLIC_KEY、OIDC_AUTH_ENDPOINT、OIDC_TOKEN_ENDPOINT、OIDC_USERINFO_ENDPOINT、OIDC_ADDITIONAL_SCOPES、OIDC_DUMP_USER_DETAILS、OIDC_USER_TO_GROUPS、OIDC_GROUPS_CLAIM(groups)、OIDC_REMOVE_FROM_GROUPS、OIDC_EXTERNAL_ID_CLAIM(sub)、OIDC_END_SESSION_ENDPOINT。
  • 第三方社交登录(10 家共 44 项,默认全部 false):Azure(含 AZURE_TENANT)、Discord、Facebook、GitHub、GitLab(含 GITLAB_BASE_URI)、Google(含 GOOGLE_SELECT_ACCOUNT)、Okta(含 OKTA_BASE_URL)、Slack、Twitch、Twitter;每家四个固定后缀 APP_ID / APP_SECRET / AUTO_REGISTER / AUTO_CONFIRM_EMAIL。

5.7 内容、界面与安全参数

本组参数直接影响页面渲染与安全头,实测项最多:

参数默认值说明与实测
DISABLE_EXTERNAL_SERVICESfalse一键禁用 Gravatar/Draw.io 等外部服务(离线内网环境设 true)
AVATAR_URL(空)自定义头像服务 URL 模板,占位符 ${hash} ${size} ${email};设置后不受上一项影响
DRAWIOtrue内嵌 Draw.io 画图,可设 false 或自建服务 URL。实测 false 时默认 CSP 的 frame-src 仍含 *.draw.io(默认白名单不随它收缩),需配合下一项
ALLOWED_IFRAME_SOURCES"https://.draw.io https://.youtube.com https://.youtube-nocookie.com https://.vimeo.com"页面内 iframe 可加载的来源白名单。实测设 "https://.youtube.com https://.vimeo.com" 后响应头变为 frame-src 'self' https://*.youtube.com https://*.vimeo.com
ALLOWED_IFRAME_HOSTSnull允许被谁 iframe 内嵌本站。实测设 https://wiki.example.com 后响应头出现 frame-ancestors 'self' https://wiki.example.com(同时 Cookie 自动调为 SameSite=None)
ALLOWED_STYLE_SOURCES / ALLOWED_IMAGE_SOURCESnull页面内样式/图片可加载来源,默认宽松集合
ALLOWED_SSR_HOSTS"*"服务端可回源请求的主机白名单(Webhook 目标等),生产建议收敛
ALLOW_UNTRUSTED_SERVER_FETCHINGfalse允许服务端抓取用户提供的任意 URL(导出外部资源时用);开启有 SSRF 风险
APP_CONTENT_FILTERING"jfha"内容过滤开关组合:j(JavaScript)/h(危险 HTML)/f(表单)/a(白名单强化),默认全开
ALLOW_CONTENT_SCRIPTSfalse已废弃:等价于关闭全部过滤,不要开
ALLOW_ROBOTSnull爬虫策略。实测设 false 后 robots.txt 变为 User-agent: * + Disallow: /
APP_VIEWS_BOOKS / APP_VIEWS_BOOKSHELVES / APP_VIEWS_BOOKSHELFlist / grid / grid书/书架列表默认视图(list 或 grid),用户可个人覆盖
APP_DEFAULT_DARK_MODEfalse默认暗色模式。实测 true 后页面根元素 class="dark-mode "
REVISION_LIMIT100每页保留的修订版本数。实测设 50 回读 app.revision_limit=50
RECYCLE_BIN_LIFETIME30回收站保留天数(0 关闭、-1 永久)。实测设 60 回读 app.recycle_bin_lifetime=60
EXPORT_PAGE_SIZEa4导出 PDF 页型:a4 / letter
EXPORT_PDF_COMMAND / EXPORT_PDF_COMMAND_TIMEOUTfalse / 15自定义 PDF 转换命令与超时(秒)
WKHTMLTOPDFfalsewkhtmltopdf 路径(仅 ALLOW_UNTRUSTED_SERVER_FETCHING=true 时可用;默认走内置 DomPDF)

5.8 API 与审计参数

参数默认值说明与实测
API_DEFAULT_ITEM_COUNT100API 列表默认每页条数。实测设 30 回读 api.default_item_count=30
API_MAX_ITEM_COUNT500API 列表每页上限。实测设 200 回读 api.max_item_count=200
API_REQUESTS_PER_MIN180单用户每分钟 API 请求限额。实测设 90 回读 api.requests_per_minute=90
LOG_FAILED_LOGIN_MESSAGEfalse记录失败登录的消息模板,%u 会被替换为提交的账号。实测设 "AUTH-FAIL user:%u" 后,用错误口令登录一次,Web 服务器错误日志出现 PHP message: AUTH-FAIL user:admin@example.com
LOG_FAILED_LOGIN_CHANNELerrorlog_plain_webserver上述日志写入通道(默认走 PHP error_log,进 Web 服务器错误日志)
IP_ADDRESS_PRECISION4日志/审计中 IP 精度(0~4,4 为完整 IP;2 表示 146.191.x.x)。实测设 2 回读 app.ip_address_precision=2,合规场景可收敛

💡 说明:API 三个限额参数需在调用 REST API 时才见行为差异(超出限额返回 429),本篇以配置回读为生效证据;API 调用与凭据管理不在本篇范围。

六、生产配置模板

以下模板适用于「8GB 内存 / SSD / 50 人以内团队」的常规生产实例(应用与数据库同机),按注释逐项替换真实值:

# ===== 应用基础 =====
APP_ENV=production
APP_DEBUG=false
APP_KEY=base64:foRBbYWw5a9ATjYenNOQbUpPWqHiE9AB5eAy2GTABKw=
APP_URL=https://wiki.example.com
APP_LANG=zh_CN
APP_AUTO_LANG_PUBLIC=false
APP_TIMEZONE=UTC
APP_DISPLAY_TIMEZONE=Asia/Shanghai
# ===== 数据库 =====
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=bookstack
DB_USERNAME=bookstack
DB_PASSWORD=q1w2e3r4
# ===== 缓存/会话/队列 =====
CACHE_DRIVER=file
SESSION_DRIVER=file
SESSION_LIFETIME=240
SESSION_SECURE_COOKIE=true
QUEUE_CONNECTION=database
# ===== 存储与上传 =====
STORAGE_TYPE=local_secure
FILE_UPLOAD_SIZE_LIMIT=50
# ===== 邮件 =====
MAIL_DRIVER=smtp
MAIL_FROM=bookstack@example.com
MAIL_FROM_NAME="BookStack"
MAIL_HOST=smtp.example.com
MAIL_PORT=587
MAIL_USERNAME=bookstack@example.com
MAIL_PASSWORD=q1w2e3r4
MAIL_ENCRYPTION=tls
# ===== 内容与安全 =====
ALLOW_ROBOTS=false
APP_CONTENT_FILTERING="jfha"
REVISION_LIMIT=100
RECYCLE_BIN_LIFETIME=30
# ===== API =====
API_REQUESTS_PER_MIN=180

逐项说明(与默认值不同的关键决策):APP_LANG=zh_CN + APP_AUTO_LANG_PUBLIC=false——界面统一中文、不随访客浏览器漂移;APP_DISPLAY_TIMEZONE=Asia/Shanghai——存储仍 UTC(官方建议)、展示用本地时区;SESSION_SECURE_COOKIE=true——模板假定已上 HTTPS;QUEUE_CONNECTION=database——邮件与 Webhook 转异步,避免页面提交被 SMTP 慢响应拖住;STORAGE_TYPE=local_secure——上传文件经鉴权读取,防止未登录直链下载;ALLOW_ROBOTS=false——内网知识库不需要被搜索引擎收录。资源更小的实例(2GB 内存)此模板同样适用,BookStack 本身内存占用低,瓶颈通常在数据库侧。

七、常见问题

Q1:改了 .env 但完全不生效? 按顺序查三处:① 是否做过 php artisan config:cache——php artisan about 看 Config 是否 CACHED,是则 php artisan config:clear(实测缓存后改动不生效,见 3.4 节);② 是否有环境变量注入覆盖(systemd Environment= 或部署平台变量),环境变量优先于 .env 文件(见 3.5 节实测);③ 是否改错了文件——确认路径是应用根目录下的 .env,且属主可读。

Q2:APP_KEY 丢了/被换了会怎样? 数据库中依赖 APP_KEY 加密的内容无法解密,密码重置、MFA 相关链接失效,部分功能报错。只能从备份恢复原 KEY;确实无备份时用 php artisan key:generate 重新生成并让全员重置密码。预防:把 APP_KEY 纳入配置备份清单。

Q3:界面想全站中文,但访客页面还是英文? APP_LANG 只管默认语言。若 APP_AUTO_LANG_PUBLIC=true(默认),未登录访客按浏览器 Accept-Language 自动切语言;要全站统一设为 false。已登录用户以个人偏好(用户设置 → 界面语言)优先。

Q4:上传大文件失败? 三层限制逐层核对:① .env 的 FILE_UPLOAD_SIZE_LIMIT(默认 50MB);② PHP 的 upload_max_filesize 与 post_max_size(实测环境默认 100M,用 php -i | grep -E '^(upload_max_filesize|post_max_size)' 查看);③ Web 服务器层的 client_max_body_size(Nginx 默认 1M,这是最常被漏掉的一层)。

Q5:多实例部署,会话经常掉线? SESSION_DRIVER=file 时会话落各实例本地,负载均衡轮询后必掉线。把 SESSION_DRIVER 与 CACHE_DRIVER 统一改为 database(实测可用,数据落 MySQL 的 sessions/cache 表)或 redis,多实例共享状态。

Q6:内网环境页面加载慢/有外链请求超时? DISABLE_EXTERNAL_SERVICES=true 关闭 Gravatar、Draw.io 默认源等外部服务;AVATAR_URL 可指向内网头像服务;DRAWIO 可设为自建 diagrams.net 实例地址。同时 ALLOWED_SSR_HOSTS 建议从 "*" 收敛为实际需要的内网主机。

Q7:SAML2/OIDC/LDAP 参数配好了但不生效? 先确认 AUTH_METHOD 已切到对应方式(standard 下所有外部认证参数均被忽略),再排查:OIDC 开 OIDC_ISSUER_DISCOVER=true 可自动发现端点;LDAP 用 LDAP_DUMP_USER_DETAILS=true 与 SAML2 用 SAML2_DUMP_USER_DETAILS=true 输出调试信息到日志辅助定位;认证协议接入需 IdP/LDAP 服务端配合,接入细则见官方文档(参考链接 4~6)。

八、参考链接

  1. BookStack 官方文档站(配置相关各页入口):https://www.bookstackapp.com/docs/
  2. v26.09.1 完整参数清单 .env.example.complete:https://github.com/BookStackApp/BookStack/blob/v26.09.1/.env.example.complete
  3. 官方缓存与会话配置文档:https://www.bookstackapp.com/docs/admin/cache-session-config/
  4. 官方 OIDC 认证文档:https://www.bookstackapp.com/docs/admin/oidc-auth/
  5. 官方 SAML2 认证文档:https://www.bookstackapp.com/docs/admin/saml2-auth/
  6. 官方 LDAP 认证文档:https://www.bookstackapp.com/docs/admin/ldap-auth/
  7. 官方上传存储文档:https://www.bookstackapp.com/docs/admin/upload-config/
  8. 官方邮件与 Webhook 文档:https://www.bookstackapp.com/docs/admin/email-webhooks/