Skip to content

配置 ​

pwikit 从命令行参数、环境变量与 pwikit.toml 文件读取设置。本文列出全部设置。pwikit 的安装与运行见部署。

设置的来源 ​

pwikit.toml 位于数据目录中;除非通过 -data-dir 或 PWIKIT_DATA_DIR 另行指定,数据目录即可执行文件所在的目录。首次执行 pwikit createsite 或 pwikit serve 时会写入该文件,内容为全部设置均被注释掉的模板。已存在的文件不会被覆盖。在 Linux 与 macOS 上,该文件创建时仅所有者可读。

同一设置在多处指定时,按以下顺序先找到者生效:

  1. 命令行参数
  2. 环境变量
  3. pwikit.toml
  4. 默认值

空的环境变量,以及 pwikit.toml 中的空字符串,均视为未设置。并非每项设置都能在上述三处指定,各项设置可指定的位置见下文各表。

pwikit 只在启动时读取设置。更改任何设置后,请重新启动 pwikit。

pwikit serve 读取整个文件。createsite、site、admin、user、seed、import、reindex、migrate、backup create 与 backup restore 命令只读取 database,且仅在未指定 -database 与 DATABASE_URL 时读取。pwikit service install 读取整个文件,用于检查设置并确定要开放的防火墙端口。

环境变量不会传递给作为系统服务安装的 pwikit。对于服务,请使用 pwikit.toml,或在安装时将参数放在 -- 之后。

模板 ​

生成的 pwikit.toml 列出全部设置,每项均已注释并附有简短说明,删去行首的 # 即可启用。文件由顶层的 database 与 [server]、[tls]、[mail]、[analytics]、[update] 各节组成,各项设置见下文。生成的文件如下:

toml
# Settings for pwikit. A line starting with # is an example and changes nothing
# until the # is taken away.
# A flag on the command line wins over this file, and so does an environment variable.
# Restart pwikit after changing anything here.

# A PostgreSQL of your own. Left unset, pwikit runs the one it carries.
# database = "postgres://user:password@127.0.0.1:5432/pwikit"

[server]
# listen = "127.0.0.1:8080"
# trusted_proxies = ["127.0.0.1"]
# upload_limit = "4GB"
# storage_limit = "0"

[tls]
# Left unset, pwikit serves HTTPS on ports 80 and 443 with certificates from
# Let's Encrypt once a site is bound to a public domain, and plain HTTP on
# 127.0.0.1:8080 until then. Setting listen or trusted_proxies means a proxy sits
# in front, and turns that off.
# off serves plain HTTP, file uses the certificate below, auto always obtains one.
# mode = "auto"
# listen = ":443"
# cert = "/path/to/fullchain.pem"
# key = "/path/to/privkey.pem"
# acme_email = "you@example.com"
# acme_directory = ""

[mail]
# smtp sends mail, console writes it into the log instead.
# engine = "smtp"
# host = "smtp.example.com"
# port = 587
# username = "wiki@example.com"
# password = ""
# use_tls = true
# implicit_tls = false
# from = "wiki@example.com"

[analytics]
# google_tag_id = ""

[update]
# pwikit installed as a system service looks for a new release every hour and
# installs it by itself inside the window below.
# auto = true
# Whether every visitor sees the banner announcing an automatic update, or only
# the people who can open the admin panel.
# public_banner = true
# false stops pwikit from asking for new releases at all.
# check = true
# The hours in which updates are installed, read in time_zone.
# window = "03:00-05:00"
# The time zone the window is read in, such as "Asia/Shanghai". Empty uses this
# machine's time zone.
# time_zone = ""
# How long a release must have been out before it is installed automatically.
# 0s installs it in the next window.
# min_age = "0s"
# A mirror to download from when GitHub cannot be reached. Use only a mirror you trust.
# pwikit update mirror <address> sets this line.
# mirror = ""

出现 pwikit 无法识别的键时,启动会中止,错误信息会指出该键:

text
pwikit: /opt/pwikit/pwikit.toml has settings pwikit does not know: server.lisen

值的类型错误(例如写成 port = "587" 而非 port = 587)同样会中止启动。

顶层 ​

键类型默认值命令行参数环境变量含义
database字符串空:使用内置 PostgreSQL-databaseDATABASE_URL自有 PostgreSQL 的连接字符串,例如 postgres://user:password@127.0.0.1:5432/pwikit。见部署。

[server] ​

键类型默认值命令行参数环境变量含义
listen字符串127.0.0.1:8080;启用 HTTPS 时为 :80-listen无纯 HTTP 的监听地址。启用 HTTPS 时,该端口将请求重定向到 HTTPS。设置此项会停用自动 HTTPS。
trusted_proxies字符串数组空-trusted-proxies无反向代理的地址或 CIDR 网段,例如 ["127.0.0.1", "10.0.0.0/8"]。仅来自这些地址的请求可以设置 X-Forwarded-For 与 X-Forwarded-Proto。命令行参数使用逗号分隔的列表。设置此项会停用自动 HTTPS。
upload_limit字符串"0":不限制-upload-limitMEDIA_UPLOAD_LIMIT当前附加在页面上的文件总大小上限,按本实例的所有站点合计。
storage_limit字符串"0":不限制-storage-limitABSOLUTE_MEDIA_UPLOAD_LIMIT所有已存储文件的总大小上限,包括已删除但仍保留在磁盘上的文件,按本实例的所有站点合计。

大小的写法为整数后接可选单位:B、KB、MB、GB 或 TB,不区分大小写。1 KB 为 1024 字节。不带单位的数字表示字节数。在 pwikit.toml 中,大小须写成带引号的字符串,例如 upload_limit = "4GB"。上传会导致超出任一上限时,该上传将被拒绝。

[tls] ​

键类型默认值命令行参数环境变量含义
mode字符串自动选择-tlsPWIKIT_TLSoff、file 或 auto。见「HTTPS 模式的选择」。
listen字符串:443-tls-listenPWIKIT_TLS_LISTENHTTPS 的监听地址。
cert字符串空-tls-certPWIKIT_TLS_CERTPEM 格式的证书链,用于 file 模式。
key字符串空-tls-keyPWIKIT_TLS_KEYPEM 格式的私钥,用于 file 模式。
acme_email字符串空-acme-emailPWIKIT_ACME_EMAIL向证书颁发机构登记的联系地址。可选。
acme_directory字符串空:使用 Let's Encrypt-acme-directoryPWIKIT_ACME_DIRECTORY其他 ACME 证书颁发机构的目录 URL,例如 Let's Encrypt 测试环境目录 https://acme-staging-v02.api.letsencrypt.org/directory。

HTTPS 模式的选择 ​

pwikit 在启动时按以下顺序决定提供服务的方式:

  1. 指定 -dev 时,pwikit 在 127.0.0.1:8080 或 -listen 指定的端口上提供纯 HTTP。环境变量与 pwikit.toml 中的 mode、listen 与 trusted_proxies 均被忽略。见部署。
  2. 如果通过命令行参数、环境变量或 pwikit.toml 设置了 mode,则使用该模式:
    • off:在 listen 上提供纯 HTTP,默认为 127.0.0.1:8080。
    • file:在 [tls] listen 上使用 cert 与 key 指定的证书提供 HTTPS。[server] listen(默认为 :80)将请求重定向到 HTTPS。
    • auto:在 [tls] listen 上提供 HTTPS,并通过 ACME 为各站点的域名与文件域名获取证书。[server] listen(默认为 :80)将请求重定向到 HTTPS,并响应证书颁发机构的验证请求。
  3. 如果未设置 mode,但设置了 listen 或 trusted_proxies,则模式为 off。设置其中任一项,即表示由反向代理处理 HTTPS。
  4. 否则,pwikit 检查所有站点的域名与文件域名。只要有一个是公网域名,模式即为 auto,pwikit 监听 :80 与 [tls] listen;否则模式为 off,监听 127.0.0.1:8080。

IP 地址、包含端口的名称、不含点号的名称,以及等于或以 localhost、localdomain、local、test、example、invalid、internal、lan、home.arpa、example.com、example.net、example.org 结尾的名称,均不属于公网域名。

mode 接受 off、file 与 auto,不区分大小写。其他任何值都会中止启动。file 模式下未同时设置 cert 与 key,同样会中止启动。

[mail] ​

邮件设置没有对应的命令行参数。环境变量优先于 pwikit.toml。

键类型默认值环境变量含义
engine字符串smtpEMAIL_ENGINEsmtp 通过 host 发送邮件。console 将每封邮件写入日志而不发送。pwikit.toml 中的其他值会中止启动。
host字符串空EMAIL_HOSTSMTP 服务器。为空时,邮件写入日志而不发送。
port整数587EMAIL_PORTSMTP 端口。465 端口始终从连接开始即使用加密连接,效果等同于同时开启 use_tls 与 implicit_tls。
username字符串空EMAIL_USERNAME登录 SMTP 服务器所用的账户。为空时,pwikit 不进行登录。
password字符串空EMAIL_PASSWORDusername 的密码。
use_tls布尔值falseEMAIL_USE_TLS连接后通过 STARTTLS 切换到 TLS。
implicit_tls布尔值falseEMAIL_IMPLICIT_TLS从连接开始即使用 TLS。
from字符串空EMAIL_DEFAULT_FROM发件人地址。必填:未设置时发送会失败。

对于 EMAIL_USE_TLS 与 EMAIL_IMPLICIT_TLS,值为 true 时开启该设置,其他任何非空值均为关闭。

pwikit 只通过加密连接发送密码,或将密码发送给本机(localhost)上的邮件服务器。如果远程邮件服务器要求登录,请开启 use_tls 或 implicit_tls。

在 Linux 与 macOS 上,如果 pwikit.toml 中包含 password,且本机其他账户可以读取该文件,pwikit 会在启动时记录以下警告:

text
pwikit.toml holds the mail password and other accounts on this machine can read it

请执行 chmod 600 pwikit.toml,使该文件仅所有者可读。

[update] ​

键类型默认值环境变量含义
auto布尔值truePWIKIT_UPDATE_AUTO以系统服务方式运行时,自动安装新版本。
public_banner布尔值truePWIKIT_UPDATE_PUBLIC_BANNER自动更新前的 10 分钟内,向所有访问者显示更新横幅。为 false 时只在管理后台提示。
check布尔值truePWIKIT_UPDATE_CHECK检查新版本。为 false 时既不检查也不提示,pwikit 不再访问 GitHub 或镜像。
window字符串03:00-05:00PWIKIT_UPDATE_WINDOW自动安装新版本的时段,按 time_zone 计算。检查不受此限制,每小时一次。可跨越午夜,至少 11 分钟。
time_zone字符串空PWIKIT_UPDATE_TIME_ZONEwindow 所用的时区。留空时使用服务器的时区,设置后覆盖它。填写时区数据库中的名称,如 Asia/Shanghai、Asia/Tokyo;不接受 UTC+9 这种写法。需要固定时差时可写 Etc/GMT-9,注意正负号相反,它表示 UTC+9。
min_age字符串0sPWIKIT_UPDATE_MIN_AGE版本发布满这么久才会自动安装,如 24h。为 0s 时发现后即安排到最近的更新时段。
mirror字符串空PWIKIT_UPDATE_MIRRORGitHub 无法访问时使用的镜像地址。

对应的命令行参数为 -update-auto、-update-public-banner、-update-check、-update-window、-update-time-zone、-update-min-age 与 -update-mirror。更新的时间安排、横幅与回档见更新与回档。

[analytics] ​

键类型默认值环境变量含义
google_tag_id字符串空GOOGLE_TAG_IDGoogle 代码(Google tag)ID。设置后,本实例所有站点的页面都会加入 Google 代码。

此设置没有对应的命令行参数。环境变量优先于 pwikit.toml。

pwikit.toml 之外的设置 ​

以下设置仅作为 pwikit serve 的命令行参数存在,其中部分也可通过环境变量指定。

命令行参数环境变量默认值含义
-data-dirPWIKIT_DATA_DIR可执行文件所在的目录数据目录。所有使用数据目录的命令均接受此参数。
-secret-keySECRET_KEYsecrets/session-key 的内容用于签名登录会话与邮件中链接的密钥。
-static-dir无内置资源改为从该目录提供页面静态资源(样式表、脚本、字体与图片),而不使用内置的副本。仅在修改网页界面时需要。见部署。
-log-file无标准错误追加写入日志的文件。达到 10 MB 时重命名为 <文件名>.1,最多保留 5 个旧文件。
-sidecarPWIKIT_FTML_SIDECAR无ftml sidecar 程序的路径。仅未内置维基语法渲染器的 pwikit 版本需要。
-no-migrate无关闭启动时不应用待应用的数据库变更。
-dev无关闭开发模式。见部署。

secrets 目录 ​

pwikit 在数据目录下的 secrets/ 中生成以下文件:

文件内容
session-key用于签名登录会话与邮件中链接的密钥。未指定 -secret-key 或 SECRET_KEY 时,在首次启动时生成。替换或删除该文件会使所有用户退出登录,并使已通过邮件发出的链接失效。
postgres-password仅限 Windows 上使用内置 PostgreSQL 的情况。内置数据库的密码。
certs/auto 模式下的证书以及证书颁发机构账户密钥。删除后,pwikit 会重新申请证书;证书颁发机构对同一证书的签发频率有限制。

注意 请勿删除或修改 secrets/postgres-password。否则 pwikit 会生成一个现有数据库不接受的新密码,从而无法再连接数据库。

环境变量 ​

变量对应设置读取者
PWIKIT_DATA_DIR数据目录所有使用数据目录的命令
DATABASE_URLdatabaseserve、createsite、site、admin、user、seed、import、reindex、migrate、backup create、backup restore、update
SECRET_KEY-secret-keyserve
PWIKIT_FTML_SIDECAR-sidecarserve、render、reindex
MEDIA_UPLOAD_LIMIT[server] upload_limitserve
ABSOLUTE_MEDIA_UPLOAD_LIMIT[server] storage_limitserve
PWIKIT_TLS[tls] modeserve、service install
PWIKIT_TLS_LISTEN[tls] listenserve、service install
PWIKIT_TLS_CERT[tls] certserve
PWIKIT_TLS_KEY[tls] keyserve
PWIKIT_ACME_EMAIL[tls] acme_emailserve
PWIKIT_ACME_DIRECTORY[tls] acme_directoryserve
EMAIL_ENGINE[mail] engineserve
EMAIL_HOST[mail] hostserve
EMAIL_PORT[mail] portserve
EMAIL_USERNAME[mail] usernameserve
EMAIL_PASSWORD[mail] passwordserve
EMAIL_USE_TLS[mail] use_tlsserve
EMAIL_IMPLICIT_TLS[mail] implicit_tlsserve
EMAIL_DEFAULT_FROM[mail] fromserve
GOOGLE_TAG_ID[analytics] google_tag_idserve
PWIKIT_UPDATE_AUTO[update] autoserve、update
PWIKIT_UPDATE_PUBLIC_BANNER[update] public_bannerserve、update
PWIKIT_UPDATE_CHECK[update] checkserve、update
PWIKIT_UPDATE_WINDOW[update] windowserve、update
PWIKIT_UPDATE_TIME_ZONE[update] time_zoneserve、update
PWIKIT_UPDATE_MIN_AGE[update] min_ageserve、update
PWIKIT_UPDATE_MIRROR[update] mirrorserve、update
PWIKIT_DATABASE_PASSWORD_FILE数据库密码所在的文件。连接字符串中没有密码时,从该文件读取所有连接数据库的命令
PWIKIT_CONTAINER表示 pwikit 运行在容器中,不自动更新。官方镜像已设置serve、update、service install
LISTEN_PID、LISTEN_FDS、LISTEN_FDNAMES由 systemd 移交的监听套接字serve
SUDO_USER未指定 -user 时服务所用的账户Linux 与 macOS 上的 service install

SUDO_USER 与三个 LISTEN_ 变量分别由 sudo 与 systemd 设置,请勿手动设置。

由 systemd 移交的套接字 ​

systemd 以套接字激活方式启动 pwikit 时,pwikit 使用收到的套接字,而不自行打开监听地址。请在套接字单元中通过 FileDescriptorName= 将套接字命名为 http 与 https。未命名的套接字按顺序使用:第一个用于纯 HTTP,第二个用于 HTTPS。HTTPS 模式仍按上文所述根据设置选择。pwikit service install 不使用套接字激活。