AmuseWiki 2.611 配置参数详解

AmuseWiki 2.611 四层配置体系详解:全局 amusewiki.conf、数据库连接、日志与字体、systemd + nginx 接入逐项实测,站点级 site 表 52 列参数分组精讲,含 22 内置主题实测、生产配置模板与 mode 保留变量回滚排障实录。

AmuseWikiAmuseWikiWikiPerl2026/11/01

AmuseWiki 2.611 配置参数详解

目标:把 AmuseWiki 的四层配置体系——全局应用配置(/etc/amusewiki.conf)、数据库连接(dbic.yaml/dbconfig-common)、日志与字体(log4perl.conf/fontspec.json)、进程与接入(systemd 单元 + nginx)——以及最重的**站点级参数(site 表 52 列)**逐项讲清,全部参数说明基于 Debian 12 服务器实测环境(AmuseWikiFarm 2.611)。安装部署见 《AmuseWiki Docker Compose 部署指南》,软件定位与选型对比见 《AmuseWiki 介绍与选型指南》,全部命令行工具详解见 《AmuseWiki 2.611 常用 CLI 命令与工具详解》。

一、环境信息

  • 服务器:Debian 12 (bookworm) x86_64,主机名 amusewiki.local,nginx 监听 80/443
  • 应用:AmuseWikiFarm 2.611(Debian 包 amusewiki 2.611-1+amw1,官方仓库 deb.amusewiki.org);官方最新稳定版 2.619(Changes 2026-10-10,2026-11-01 实查),本篇参数以 2.611 实测为准
  • 运行栈:Plack FCGI(unix socket /var/lib/amusewiki/amusewiki.socket)+ jobber 作业队列 + Xapian 全文索引 + amusewiki-texlive 20240128-1(PDF 编译)
  • 数据库:SQLite /var/lib/dbconfig-common/sqlite3/amusewiki/amusewiki(schema 版本 87)
  • 站点:amw(canonical localhost,官方文档站)、demo(canonical demo.localhost),mode 均为 private
  • 运行用户:amusewiki;管理账号 admin / q1w2e3r4(root 角色)
  • 配置实体位置实测清单(find 回显):
find /var/lib/amusewiki -maxdepth 1 -name "*.yaml" -o -maxdepth 1 -name "*.conf" -o -maxdepth 1 -name "*.json" | sort
/var/lib/amusewiki/dbic.yaml
/var/lib/amusewiki/dbinfo.conf
/var/lib/amusewiki/fontspec.json
/var/lib/amusewiki/log4perl.conf

二、前置条件

  1. 以 root 操作全局配置:/etc/amusewiki.conf、systemd 单元、nginx 站点文件属 root;/var/lib/amusewiki/*.yaml|conf|json 属 amusewiki,编辑后须保持属主(见 6.2 节 FAQ)。
  2. 站点级参数改动通道:管理面板(/admin/sites、站点内 /siteadmin)、CLI 包装器 amusewiki set-site-variable、或直接 SQL——三者差异与「保留变量」陷阱见第三章与 FAQ。
  3. 生效规则:站点级参数存数据库,改完即生效(无需重启);/etc/amusewiki.conf、systemd 单元、nginx 配置改动需重启对应服务:
amusewiki restart

(无停机重启的完整机制与实测回显见 CLI 详解篇 4.1 节。)

三、参数查看与修改方式

AmuseWiki 的参数分两层:实例级(文件配置)与站点级(数据库 site 表 + 关联表)。农场内每个站点独立一套站点级参数,实例级参数全局共享。

查看站点级参数全量(推荐方式,导出即快照):

amusewiki clone-site export --directory /tmp/amw-export
Using directory /tmp/amw-export for output
Exported site amw to /tmp/amw-export/amw.yaml
Exported site demo to /tmp/amw-export/demo.yaml

导出的 YAML 是该站点全部配置(site 行 + categories + users + custom_formats + site_options 等)的可读快照,逐项含义见第五、六章。

修改站点级参数三种通道:

通道命令/入口适用范围限制
管理面板Web /siteadmin全部参数人工操作,不可脚本化
CLIamusewiki set-site-variable <site-id> --set k=v除保留变量外全部id/mode/last_updated 为保留变量,CLI 改不动(实测见 FAQ 6.1)
直接 SQLsqlite3 <库> "update site set ..."全部绕过应用校验,自担风险

set-site-variable 帮助原文(实测):

amusewiki set-site-variable --help
Usage:
    Usage: amusewiki-set-site-variable [ --all | site_id site_id_2 ... ]
    --set name=value [ --set ... ]

    Set a site option from the command line. The site IDs should be passed
    as arguments, or you can use "--all" to affect all of them.

    The option name/value pairs should be passed to "--set" arguments as
    shown in the example.

    You can pass as many pairs you want.

    With the "--help" option, show this help and exit.

保留变量的判定逻辑在源码 Site.pm 的 update_option_value(实测节选):

sub update_option_value {
    my ($self, $option, $value) = @_;
    die "Missing option name" unless $option;
    my %reserved = (id => 1,
                    mode => 1,
                    last_updated => 1);
    die "$option is reserved, please use the admin panel" if $reserved{$option};

即 id、mode、last_updated 三个字段 CLI 不可改,其余 site 表列均可。

四、参数总览

层载体关键参数生效方式
全局应用/etc/amusewiki.conffcgi_socket、nginx_root、instance_name、cgit_portamusewiki restart
数据库连接/var/lib/amusewiki/dbic.yaml(由 /etc/dbconfig-common/amusewiki.conf 生成 dbinfo.conf)dsn、on_connect_do重启应用
日志/var/lib/amusewiki/log4perl.conf(可用 log4perl.local.conf 覆盖)级别、轮转大小/份数、邮件阈值重启应用
排版字体/var/lib/amusewiki/fontspec.json字体族注册表(serif/sans/mono 四件套路径)PDF/EPUB 编译时读取
进程systemd 单元 amusewiki-web/amusewiki-jobber/amusewiki-nginx-reload.pathPM_MAX_REQUESTS、--nproc、PATHsystemctl daemon-reload + 重启
接入/etc/nginx/sites-enabled/<instance_name> + <instance_name>_includeserver_name、client_max_body_size、/private/* 内部映射nginx -t && service nginx reload
站点级数据库 site 表(52 列)+ custom_formats/site_options/categories/user_rolesmode、theme、输出开关、排版、SSL……即时

五、核心参数分类详解

5.1 全局应用配置 /etc/amusewiki.conf

实测原文(cat /etc/amusewiki.conf):

# Normally you shouldn't need to change any of this.
name AmuseWikiFarm

<Model::Webserver>
    ## cgit port
    cgit_port 7015
    ## nginx log format
    log_format combined
    ## nginx root
    nginx_root /etc/nginx
    ## string to identify this installation
    instance_name amusewikidebian
    webserver_root /usr/share/perl5/AmuseWikiFarm/root
    fcgi_socket /var/lib/amusewiki/amusewiki.socket
</Model::Webserver>

逐项说明:

参数实测值含义与改动影响
nameAmuseWikiFarm应用标识,勿改
cgit_port7015站点仓库 git 浏览(cgit)端口;与站点参数 cgit_integration(5.6)联动,默认 0 未启用
log_formatcombinednginx access log 格式
nginx_root/etc/nginxgenerate-nginx-conf 写站点文件的根目录
instance_nameamusewikidebian实例标识前缀,决定 nginx 站点文件名(amusewikidebian/amusewikidebian_include)与证书命名
webserver_root/usr/share/perl5/AmuseWikiFarm/root静态资源与主题模板根目录(主题 CSS 实际落点,见 5.6 theme)
fcgi_socket/var/lib/amusewiki/amusewiki.socketFCGI unix socket 路径,nginx include 的 fastcgi_pass 必须与之一致

💡 技术拓展:amusewiki.conf 用的是 Config::General(Apache 风格)而非 YAML/INI——块语法 <Model::Webserver>...</Model::Webserver> 对应应用内部配置模型类名,同族格式还见于 sendmail/apache 配置。改错块名不会报错但参数不生效,这是该格式的静默陷阱。

5.2 数据库连接(dbic.yaml 与 dbconfig-common 层)

应用侧连接配置 /var/lib/amusewiki/dbic.yaml(权限实测 -rw------- amusewiki,原文):

amuse:
  dsn: 'dbi:SQLite:/var/lib/dbconfig-common/sqlite3/amusewiki/amusewiki'
  user: ''
  password: ''
  on_connect_do: 'PRAGMA foreign_keys = ON'
  AutoCommit: 1
  RaiseError: 1
  sqlite_unicode: 1
  quote_names: 1
参数说明
dsnDBI 连接串;换 PostgreSQL 写 dbi:Pg:dbname=amusewiki;host=...,换 MySQL 写 dbi:mysql:... 并补 user/password
on_connect_do每次连接执行的 SQL;SQLite 必须保留 PRAGMA foreign_keys = ON(外键约束默认关闭)
AutoCommit/RaiseError应用自管事务 + 出错即抛,官方默认值,勿改
sqlite_unicode/quote_namesUTF-8 处理与标识符加引号,官方默认值

Debian 包另有一层 dbconfig-common 托管。/etc/dbconfig-common/amusewiki.conf(实测节选):

dbc_install='true'
dbc_upgrade='true'
dbc_remove='true'
dbc_dbtype='sqlite3'
dbc_dbname='amusewiki'
dbc_basepath='/var/lib/dbconfig-common/sqlite3/amusewiki'

它由打包脚本生成运行时文件 /var/lib/amusewiki/dbinfo.conf(实测原文):

##
## database access settings in /bin/sh format
## automatically generated from /etc/dbconfig-common/amusewiki.conf
## by /usr/sbin/dbconfig-generate-include
##
## by default this file is managed via ucf, so you shouldn't have to
## worry about manual changes being silently discarded.  *however*,
## you'll probably also want to edit the configuration file mentioned
## above too.
##

dbuser=''
dbpass=''
basepath='/var/lib/dbconfig-common/sqlite3/amusewiki'
dbname='amusewiki'
dbserver=''
dbport=''
dbtype='sqlite3'

⚠️ 注意:dbinfo.conf 头部明示该文件由 ucf 托管——升级包时手工改动可能被静默丢弃。真正被应用消费的是 dbic.yaml;切 PostgreSQL/MySQL 时两处(/etc/dbconfig-common/amusewiki.conf 与 dbic.yaml)都要改,或干脆停用 dbconfig 层只留 dbic.yaml。

5.3 日志配置 log4perl.conf

实测原文(/var/lib/amusewiki/log4perl.conf):

# This is a stock file, but it's yours for modifying (even if the
# defaults are sane). You can also create a file
# log4perl.local.conf in this directory and the application will use
# that one.

log4perl.logger=INFO, Log, Mail

log4perl.appender.Log=Log::Dispatch::FileRotate
log4perl.appender.Log.filename=log/amw.log
log4perl.appender.Log.mode=append

# 10M then rotate, max 10, 100M of logs
log4perl.appender.Log.size=10485760
log4perl.appender.Log.max=10

log4perl.appender.Log.layout=Log::Log4perl::Layout::PatternLayout
log4perl.appender.Log.layout.ConversionPattern=%d %p - %c - %F:%L - %m%n

# send the errors to root.

log4perl.appender.Mail=Log::Dispatch::Email::MailSend
log4perl.appender.Mail.Threshold=ERROR
log4perl.appender.Mail.from=amusewiki@localhost
log4perl.appender.Mail.to=root@localhost
log4perl.appender.Mail.subject="[AmuseWiki errors: localhost]"
log4perl.appender.Mail.buffered=0
log4perl.appender.Mail.layout=Log::Log4perl::Layout::PatternLayout
log4perl.appender.Mail.layout.ConversionPattern=%d %p - %c - %F:%L - %m%n

要点:

  • 日志文件为相对路径 log/amw.log,即 /var/lib/amusewiki/log/amw.log(应用工作目录恒为 /var/lib/amusewiki);
  • 轮转策略 FileRotate:单文件 10MB、最多 10 份、总量约 100MB;
  • Mail appender 阈值 ERROR,经本机 sendmail(MailSend)发 root@localhost——无本地 MTA 时错误邮件会静默失败,生产建议改阈值或去掉 Mail appender(见 FAQ 6.3);
  • 首行注释给出不改原文件的覆盖法:同目录放 log4perl.local.conf 即优先使用,升级包不冲突。

实测日志回显(tail -6 /var/lib/amusewiki/log/amw.log,jobber 处理站点导入后的档案作业):

2026/11/01 11:23:12 INFO - AmuseWikiFarm.Schema.Result.Site - /usr/share/perl5/AmuseWikiFarm/Schema/Result/Site.pm:1481 - pdf for t1 is disabled
2026/11/01 11:23:12 INFO - AmuseWikiFarm.Schema.Result.Site - /usr/share/perl5/AmuseWikiFarm/Schema/Result/Site.pm:1481 - sl_pdf for t1 is disabled
2026/11/01 11:23:12 INFO - AmuseWikiFarm.Schema.Result.CustomFormat - /usr/share/perl5/AmuseWikiFarm/Schema/Result/CustomFormat.pm:864 - c9 is without format code
2026/11/01 11:23:12 INFO - AmuseWikiFarm.Schema.Result.CustomFormat - /usr/share/perl5/AmuseWikiFarm/Schema/Result/CustomFormat.pm:864 - c10 is without format code

5.4 字体注册表 fontspec.json

PDF/EPUB 排版用字体清单(/var/lib/amusewiki/fontspec.json,16KB,实测节选):

[
   {
      "bold" : "/usr/share/fonts/truetype/cmu/cmunbx.ttf",
      "bolditalic" : "/usr/share/fonts/truetype/cmu/cmunbi.ttf",
      "desc" : "CMU Serif",
      "italic" : "/usr/share/fonts/truetype/cmu/cmunti.ttf",
      "name" : "CMU Serif",
      "regular" : "/usr/share/fonts/truetype/cmu/cmunrm.ttf",
      "type" : "serif"
   },
   {
      "name" : "Linux Libertine O",
      "type" : "serif",
      "regular" : "/usr/share/fonts/opentype/linux-libertine/LinLibertine_R.otf",
      ...
   },
   {
      "name" : "TeX Gyre Pagella",
      "type" : "serif",
      ...
   }
]

每个条目登记一个字体族的 regular/bold/italic/bolditalic 四件套绝对路径与 type(serif/sans/mono)。站点参数 mainfont/sansfont/monofont(5.6)的合法取值即此表中的 name。默认 CMU Serif/CMU Sans Serif/CMU Typewriter Text 由 amusewiki-extra-fonts 包提供;中文书目需在此表追加 CJK 字体条目(如 Noto Serif CJK),否则 XeLaTeX 编译时回退默认字体(实测 check-compiler 输出 main font not found, using the default 即此类回退)。

5.5 进程与接入层(systemd 单元 + nginx)

amusewiki-web.service(实测原文):

[Unit]
Description=Amusewiki web server
After=nss-user-lookup.target

[Service]
# this is already something
Environment="PM_MAX_REQUESTS=1000"
# You'll need Linux::Pid (liblinux-pid-perl) installed for the max size to work
# Environment="PM_MAX_SIZE=524288"
# Environment="PM_SIZECHECK_NUM_REQUESTS=10"

WorkingDirectory=/var/lib/amusewiki
User=amusewiki
Group=amusewiki
ExecStart=/usr/bin/plackup -s FCGI --listen /var/lib/amusewiki/amusewiki.socket --nproc 8 -E deployment --manager FCGI::ProcManager::Constrained /usr/share/perl5/AmuseWikiFarm/psgi/amusewiki.psgi
Restart=always

[Install]
WantedBy=multi-user.target
参数说明
PM_MAX_REQUESTS=1000每个 FCGI worker 处理 1000 请求后回收(防 Perl 内存缓涨),调小更耗 CPU、调大更耗内存
PM_MAX_SIZE(注释)worker 内存上限(字节),需 liblinux-pid-perl;默认注释关闭
--nproc 8worker 数;低内存服务器按核数下调
--manager FCGI::ProcManager::Constrained带约束的进程管理器,配合上述两个 PM_ 变量
User/Group=amusewiki降权运行;socket 文件随之属该用户

amusewiki-jobber.service(实测原文):

[Unit]
Description=Amusewiki jobber
After=nss-user-lookup.target

[Service]
WorkingDirectory=/var/lib/amusewiki
User=amusewiki
Group=amusewiki
Environment="PATH=/opt/amusewiki-texlive/current/bin/arch:/usr/local/bin:/usr/bin:/bin"
ExecStart=/usr/bin/amusewiki-jobber
Restart=always

[Install]
WantedBy=multi-user.target

关键在 Environment=PATH:TeX Live 二进制(xelatex 等)只在该单元注入的 PATH 里,手工跑 check-compiler 不带此 PATH 会报 Command 'xelatex' not found(排障实录见 CLI 详解篇 FAQ)。

nginx 联动单元(实测原文)——应用改站点配置后通过触发文件请求重载:

# amusewiki-nginx-reload.path
[Unit]
Description=Path to monitor to trigger an nginx reload

[Path]
PathChanged=/var/lib/amusewiki/ssl/amusewiki_requests_webserver_reload.txt

[Install]
WantedBy=multi-user.target

# amusewiki-nginx-reload.service
[Unit]
Description=Trigger an nginx reload
Wants=nginx.service

[Service]
ExecStart=/bin/sh -c '/usr/sbin/nginx -t && /usr/sbin/service nginx reload'

nginx 站点文件 /etc/nginx/sites-enabled/amusewikidebian(实测原文):

server {
    listen 80;
    listen [::]:80;
    listen 443 ssl;
    listen [::]:443 ssl;
    ssl_certificate_key /var/lib/amusewiki/ssl/amusewikidebian.key;
    ssl_certificate     /var/lib/amusewiki/ssl/amusewikidebian.crt;
    server_name localhost;
    access_log /var/log/nginx/localhost.log combined;
    error_log /var/log/nginx/localhost.err.log;
    client_max_body_size 8m;
    include amusewikidebian_include;

}

client_max_body_size 8m 与站点参数 binary_upload_max_size_in_mega(默认 8)必须同步改,否则上传大附件先被 nginx 挡下。

include 片段 amusewikidebian_include 实测节选(路由与内部映射核心):

    root /usr/share/perl5/AmuseWikiFarm/root;

    # LEGACY STUFF
    rewrite ^/lib/(.*)$ /library/$1 permanent;
    rewrite ^/epub/(.*)\.epub /library/$1.epub permanent;
    rewrite ^/topics/(.*)\.html /category/topic/$1 permanent;
    rewrite ^/authors/(.*)\.html /category/author/$1 permanent;
    # END LEGACY STUFF

    location /static/js/ckeditor/ {
        expires 1w;
        alias /usr/share/javascript/ckeditor/;
    }
    location /.well-known/acme-challenge/ {
        root /var/lib/amusewiki/ssl/ACME_ROOT;
    }
    # deny direct access to the CGI file
    location /git/cgit.cgi {
        deny all;
    }
    location /src/ {
        deny all;
    }
    location /themes/ {
        deny all;
    }
    location /private/repo/ {
        internal;
        alias /var/lib/amusewiki/repo/;
    }
    location /private/staging/ {
        internal;
        alias /var/lib/amusewiki/staging/;
    }
    location @proxy {
        fastcgi_param  QUERY_STRING       $query_string;
        fastcgi_param  REQUEST_METHOD     $request_method;
        ...
        fastcgi_param HTTP_X_SENDFILE_TYPE X-Accel-Redirect;
        fastcgi_param HTTP_X_ACCEL_MAPPING /var/lib/amusewiki=/private;
        fastcgi_pass  unix:/var/lib/amusewiki/amusewiki.socket;
    }

要点:/private/* 系列 internal 位置 + X-Accel-Redirect 头映射,让应用鉴权、nginx 送文件(出版产物下载不占 FCGI worker);/src/、/themes/、/git/cgit.cgi 直接 deny,防源码与模板泄漏。include 内注释还提示:nginx < 1.7.3 需在 Model::Webserver 块加 nginx_disable_gzip_on_dynamic_pages 1。

5.6 站点级参数(site 表)——农场核心配置

site 表实测建表语句(sqlite3 <库> '.schema site' 原样):

CREATE TABLE IF NOT EXISTS "site" ( "id" varchar(16) NOT NULL, "mode" varchar(16) NOT NULL DEFAULT 'private', "locale" varchar(3) NOT NULL DEFAULT 'en', "magic_question" varchar(255) NOT NULL DEFAULT '12 + 4 =', "magic_answer" varchar(255) NOT NULL DEFAULT '16', "fixed_category_list" text, "sitename" varchar(255) NOT NULL DEFAULT '', "siteslogan" varchar(255) NOT NULL DEFAULT '', "theme" varchar(32) NOT NULL DEFAULT '', "logo" varchar(255) NOT NULL DEFAULT '', "mail_notify" text, "mail_from" text, "canonical" varchar(255) NOT NULL, "secure_site" integer(1) NOT NULL DEFAULT 1, "secure_site_only" integer(1) NOT NULL DEFAULT 0, "sitegroup" varchar(255) NOT NULL DEFAULT '', "cgit_integration" integer(1) NOT NULL DEFAULT 0, "ssl_key" varchar(255) NOT NULL DEFAULT '', "ssl_cert" varchar(255) NOT NULL DEFAULT '', "ssl_ca_cert" varchar(255) NOT NULL DEFAULT '', "ssl_chained_cert" varchar(255) NOT NULL DEFAULT '', "acme_certificate" integer(1) NOT NULL DEFAULT 0, "multilanguage" varchar(255) NOT NULL DEFAULT '', "active" integer(1) NOT NULL DEFAULT 1, "blog_style" integer(1) NOT NULL DEFAULT 0, "bb_page_limit" integer NOT NULL DEFAULT 1000, "tex" integer(1) NOT NULL DEFAULT 1, "pdf" integer(1) NOT NULL DEFAULT 1, "a4_pdf" integer(1) NOT NULL DEFAULT 0, "lt_pdf" integer(1) NOT NULL DEFAULT 0, "sl_pdf" integer(1) NOT NULL DEFAULT 0, "html" integer(1) NOT NULL DEFAULT 1, "bare_html" integer(1) NOT NULL DEFAULT 1, "epub" integer(1) NOT NULL DEFAULT 1, "zip" integer(1) NOT NULL DEFAULT 1, "ttdir" varchar(255) NOT NULL DEFAULT '', "papersize" varchar(64) NOT NULL DEFAULT '', "division" integer NOT NULL DEFAULT 12, "bcor" varchar(16) NOT NULL DEFAULT '0mm', "fontsize" integer NOT NULL DEFAULT 10, "mainfont" varchar(255) NOT NULL DEFAULT 'CMU Serif', "sansfont" varchar(255) NOT NULL DEFAULT 'CMU Sans Serif', "monofont" varchar(255) NOT NULL DEFAULT 'CMU Typewriter Text', "beamertheme" varchar(255) NOT NULL DEFAULT 'default', "beamercolortheme" varchar(255) NOT NULL DEFAULT 'dove', "nocoverpage" integer(1) NOT NULL DEFAULT 0, "logo_with_sitename" integer(1) NOT NULL DEFAULT 0, "opening" varchar(16) NOT NULL DEFAULT 'any', "twoside" integer(1) NOT NULL DEFAULT 0, "binary_upload_max_size_in_mega" integer NOT NULL DEFAULT 8, "git_token" text, "last_updated" datetime, PRIMARY KEY ("id") );
CREATE UNIQUE INDEX "canonical_unique" ON "site" ("canonical");

两站点关键字段实测值(select id, canonical, sitename, mode, theme, locale, html, bare_html, tex, epub, zip, pdf, a4_pdf, lt_pdf, sl_pdf, secure_site, cgit_integration, acme_certificate from site;):

amw|localhost|AmuseWiki documentation|private||en|1|1|1|1|1|0|0|0|0|0|0|0
demo|demo.localhost|Demo Library|private||en|1|1|1|1|1|0|0|0|0|0|0|0

按功能域分组详解:

(a)路由与身份

参数默认说明
id—(主键,保留变量)站点 ID,同时是 git 仓库目录名 repo/<id>
canonicalNOT NULL站点主域名,农场按它路由(canonical_unique 全库唯一);改动即改变域名路由,改后跑 amusewiki generate-nginx-conf 同步接入层
sitegroup''站点分组名,跨站聚合展示用
active1停用置 0,站点整体下线但数据保留

(b)访问控制

参数默认说明
modeprivateprivate 全站需登录(匿名 GET 返回 401,实测);public 匿名可读。保留变量,CLI 不可改,走面板或 SQL(实测全记录见 FAQ 6.1)
secure_site/secure_site_only1/0HTTPS 强化开关(配合 ssl_* 与 acme_*);本实例两站点实测均为 0(本地 http 环境)
(白名单)—按 IP 免登录放行,存独立表,用 amusewiki whitelist-ip 维护(实测 demo 10.89.60.1 root 一条生效)

(c)反垃圾

参数默认说明
magic_question/magic_answer12 + 4 =/16注册质询题(schema 级默认,实测建表语句可见),改题可提升机器注册门槛

(d)外观与本地化

参数默认说明
theme''(=amusewiki 默认主题)内置主题 22 款(源码 bootstrap_themes 实测清单):amusewiki、amusecosmo、amusejournal、amusebaskerville、robotojournal、purplejournal,及 Bootswatch 系 cerulean/cosmo/cyborg/darkly/flatly/journal/lumen/readable/simplex/slate/spacelab/united/paper/sandstone/superhero/yeti;自定义主题放 root/themes/(实测目录内有示例 test-theme)。切换实测:
amusewiki set-site-variable demo --set theme=amusejournal
curl -s -H "Host: demo.localhost" http://localhost/login | grep -oE "bootstrap\.[a-z]+\.css"
Updating demo theme => amusejournal
bootstrap.amusejournal.css
amusewiki set-site-variable demo --set theme=
curl -s -H "Host: demo.localhost" http://localhost/login | grep -oE "bootstrap\.[a-z]+\.css|amusewiki\.css"
Updating demo theme => 
bootstrap.amusewiki.css
amusewiki.css

| logo/logo_with_sitename | ''/0 | 站徽图片路径与是否并排显示站名 | | blog_style | 0 | 置 1 首页变博客流(按发布日期倒序) | | locale/multilanguage | en/'' | 站点主语言(23 种可选)与多语言后缀配置 | | sitename/siteslogan | '' | 站名与标语(页面 title 后缀 | Demo Library 即此值,部署篇实测) |

(e)出版输出开关(bookbuilder 产物矩阵)

参数默认产物
tex1.tex(LaTeX 源)
html1完整 HTML(带导航)
bare_html1裸 HTML(无站点框架,适合再加工)
epub1EPUB
zip1源文件+产物打包
pdf1单页 PDF(依赖 XeLaTeX)
a4_pdf/lt_pdf/sl_pdf0A4 拼版/信纸拼版/幻灯片 PDF(对应自定义格式 c1/c2/c4)

与自定义格式表 custom_formats 联动(实测 select site_id, format_code, format_name, format_alias, active from custom_formats;):

amw|c3|Plain PDF|pdf|0
amw|c1|A4 imposed PDF|a4.pdf|0
amw|c2|Letter imposed PDF|lt.pdf|0
amw|c4|Slides (PDF)|sl.pdf|0
demo|c3|Plain PDF|pdf|0
demo|c1|A4 imposed PDF|a4.pdf|0
demo|c2|Letter imposed PDF|lt.pdf|0
demo|c4|Slides (PDF)|sl.pdf|0

每个站点自带 4 款预置 bookbuilder 格式(c1–c4,format_alias 决定下载后缀,如 /library/hello.a4.pdf),active=0 表示预置未激活(激活由站点级 a4_pdf 等开关驱动);面板可增删自定义格式(bb_* 前缀列:开本、版心、字体、装订签名数等,见第六章导出模板)。

(f)排版参数(PDF 侧)

参数默认说明
mainfont/sansfont/monofontCMU Serif/Sans/Typewriter三族字体,取值须在 fontspec.json 注册(5.4)
papersize/fontsize/division/bcor''/10/12/0mm开本、正文字号、分节单位(章/节)、书脊出血
opening/twoside/nocoverpageany/0/0起页方式、双面排版、去扉页
beamertheme/beamercolorthemedefault/dove幻灯片格式(c4)主题
bb_page_limit1000bookbuilder 单任务文本数上限(实测改动生效)

(g)上传与集成

参数默认说明
binary_upload_max_size_in_mega8附件上限(MB),与 nginx client_max_body_size 8m 成对改
cgit_integration0置 1 后站点仓库经 cgit(端口 5.1 cgit_port 7015)浏览
git_token—站点仓库的推送令牌(面板生成);导出快照中为敏感值,入库/外发前务必脱敏
fixed_category_listNULL锁定分类列表(禁用户新增 author/topic)
ttdir''自定义 Template Toolkit 模板目录(深度改界面用)

(h)SSL/ACME

参数默认说明
ssl_key/ssl_cert/ssl_ca_cert/ssl_chained_cert''证书路径(存 /var/lib/amusewiki/ssl/),填后触发 nginx 重载联动(5.5 path 单元)
acme_certificate0置 1 走 Let's Encrypt 自动签发,配 amusewiki letsencrypt 命令

5.7 站点扩展参数 site_options

schema 实测:

CREATE TABLE IF NOT EXISTS "site_options" ( "site_id" varchar(16) NOT NULL, "option_name" varchar(64) NOT NULL, "option_value" text, PRIMARY KEY ("site_id", "option_name"), FOREIGN KEY ("site_id") REFERENCES "site"("id") ON DELETE CASCADE ON UPDATE CASCADE );

键值对扩展位,典型消费者是包含路径白名单(.muse 的 !include 指令可引用外部文件)。实测存取:

amusewiki include-path --site demo --add /var/lib/amusewiki/shared
Site: demo include paths:
 - /var/lib/amusewiki/shared
sqlite3 /var/lib/dbconfig-common/sqlite3/amusewiki/amusewiki "select * from site_options;"
demo|include_path|/var/lib/amusewiki/shared
amusewiki include-path --site demo --reset
sqlite3 /var/lib/dbconfig-common/sqlite3/amusewiki/amusewiki "select count(*) from site_options;"
Resetting include paths for demo
0

⚠️ 注意:amusewiki include-path 帮助原文自带安全警告——把 /、/etc 之类目录加入包含路径等于允许应用读取其可读的一切敏感文件;该功能默认关闭,仅建议在私有站点或受信任编辑者站点启用。

5.8 权限模型(roles/user_roles)

角色表实测(.schema roles + select * from roles;):

CREATE TABLE IF NOT EXISTS "roles" ( "id" INTEGER PRIMARY KEY NOT NULL, "role" varchar(128) );
CREATE UNIQUE INDEX "role_unique" ON "roles" ("role");
1|root

本实例仅注册 root 一个全局角色;站点内用户-角色经 user_roles 关联(导出快照中 admin 用户 roles: [root],见第六章)。普通编辑/阅读权限由站点 mode + 面板用户管理驱动,非靠自建角色行——AmuseWiki 的权限粒度是「站点内角色」而非全局 ACL。

六、生产配置模板

新站点配置的权威写法:clone-site 导出的 YAML 改字段再导入。实测导出 amw 后改造第三站点 t1 的导入记录:

sed -e "s/canonical: localhost/canonical: t1.localhost/" \
    -e "s/^id: amw/id: t1/" \
    -e "s/sitename: AmuseWiki documentation/sitename: T1 Sandbox/" \
    /tmp/amw-export/amw.yaml > /tmp/amw-export/t1.yaml
amusewiki clone-site import /tmp/amw-export/t1.yaml --bootstrap
Please place the site tree into /var/lib/amusewiki/repo/t1 at /usr/bin/amusewiki-clone-site line 109.
Importing /tmp/amw-export/t1.yaml
admin already exists, adding it to the site

生产可用的站点 YAML 关键字段模板(基于实测导出整理,git_token 已脱敏为面板生成说明):

---
id: press01                      # 主键,=仓库目录名
canonical: press.example.com     # 路由域名,全库唯一
sitename: Press One Library
siteslogan: Poetry & essays
mode: public                     # 公开可读(面板改,CLI 保留)
locale: zh                       # 简体中文界面
theme: amusejournal
mainfont: Noto Serif CJK SC      # 需先注册进 fontspec.json
sansfont: Noto Sans CJK SC
monofont: Noto Sans Mono CJK SC
papersize: a5
fontsize: 11
twoside: 1                       # 双面印刷
bcor: 8mm                        # 胶装书脊出血
division: 12
tex: 1
html: 1
bare_html: 1
epub: 1
zip: 1
pdf: 1
a4_pdf: 0
secure_site: 1
acme_certificate: 1              # Let's Encrypt 自动证书
binary_upload_max_size_in_mega: 32   # 同步 nginx client_max_body_size 32m
bb_page_limit: 1000
cgit_integration: 0
# git_token: 面板生成,勿写入受版本控制的模板

适用口径:面向公众的文学出版社站(公开读、双面 A5 印刷 PDF、CJK 字体、ACME 证书)。若为内部草稿库,把 mode 保持 private、secure_site 视 TLS 终止层调整。

实例级最小生产改动清单(相对默认):log4perl.conf 关闭或降配 Mail appender(无 MTA 时)、amusewiki-web 单元按内存调 --nproc 与 PM_MAX_REQUESTS、/etc/amusewiki.conf 一般无需动(文件头注释 "Normally you shouldn't need to change any of this")。

七、常见问题

7.1 Q1:set-site-variable 打印 Updating ... mode => public 但站点仍 401

  • 现象:执行 amusewiki set-site-variable demo --set mode=public 回显 Updating demo mode => public,随后 sqlite3 ... "select id,mode from site;" 仍是 demo|private,匿名访问 GET /library/ 依旧 401:
Updating demo mode => public
amw|private
demo|private
GET /: 401
GET /library/: 401
  • 定位:mode 是保留变量。CLI 先打印 Updating 再调 update_option_value,后者 die "mode is reserved, please use the admin panel",外层事务 TxnScopeGuard 整体回滚(实测报错原文):
mode is reserved, please use the admin panel at /usr/share/perl5/AmuseWikiFarm/Schema/Result/Site.pm line 4096.
DBIx::Class::Storage::TxnScopeGuard::DESTROY(): A DBIx::Class::Storage::TxnScopeGuard went out of scope without explicit commit or error. Rolling back.

保留变量共三个:id、mode、last_updated(5.3 节源码);其余列(theme、bb_page_limit、canonical、siteslogan 等)实测均可 CLI 改并落库。

  • 解决:二选一。① 管理面板站点设置页改 mode(官方推荐,带校验);② 直接 SQL(实测生效):
sqlite3 /var/lib/dbconfig-common/sqlite3/amusewiki/amusewiki "update site set mode='public' where id='demo';"
curl -s -H "Host: demo.localhost" -o /dev/null -w "GET /library/ (public): %{http_code}\n" http://localhost/library/
GET /library/ (public): 200

改回 private 后匿名访问恢复 401,验证闭环。

7.2 Q2:改 dbic.yaml 后升级包被还原

  • 定位:dbconfig-common 层文件(dbinfo.conf 及 /etc/dbconfig-common/amusewiki.conf)由 ucf 托管(文件头注释明示),包升级时手工改动可能被覆盖询问/丢弃。
  • 解决:把连接配置固化在 /var/lib/amusewiki/dbic.yaml(ucf 不管它),或答对 ucf 冲突询问保留本地版;两文件属主权限必须保持 amusewiki + 0600(实测 -rw------- amusewiki amusewiki 219 ... dbic.yaml),否则应用启动即报权限错误。

7.3 Q3:错误邮件刷屏或发不出去

  • 定位:默认 log4perl.conf 的 Mail appender 阈值 ERROR、buffered=0,每条错误即时经 sendmail 发 root@localhost;无 MTA 时每次错误都尝试投递失败(写日志伴随 sendmail 报错),有 MTA 但无外发时则堆积队列。
  • 解决:不动原文件,新建 /var/lib/amusewiki/log4perl.local.conf(首行注释官方给的覆盖法)去掉 Mail appender 或把 Threshold 提到 FATAL,重启应用生效。

7.4 Q4:改 canonical 后原域名访问 404/串站

  • 定位:农场按 canonical 精确匹配路由,且 canonical_unique 全库唯一(实测索引);改值后旧域名不再命中该站点。
  • 解决:改 canonical 属「站点搬家」,必须同步:面板改 → amusewiki generate-nginx-conf 重新生成接入 → 验证:
amusewiki generate-nginx-conf
# please execute as root:
diff -Nu /etc/nginx/sites-enabled/amusewikidebian /tmp/nginx-amusewiki-aPV7Ipvj/amusewikidebian
cat /tmp/nginx-amusewiki-aPV7Ipvj/amusewikidebian > /etc/nginx/sites-enabled/amusewikidebian
nginx -t && service nginx reload

该命令只打印待执行命令不代改文件(实测),root 逐条执行后 reload。

八、参考链接

AmuseWiki 2.611 配置参数详解 - Quzuo