配置文件
GoPress 使用 TOML 作为配置格式。每个站点一份独立的 config.toml,多站点可共享数据库(通过表前缀隔离)。
配置发现顺序
-config <path> 显式参数,优先级最高
sites/{first-host}/config.toml 自动发现的第一个站点配置
sites/default/config.toml 最终回退路径
config/config.toml 只是随源码提供的模板,不参与运行时回退;其中的
jwt_secret 有意留空。Web 安装器会把实际配置写入
sites/<host>/config.toml,文件权限为 0600。
完整示例
[site]
name = "My Website"
url = "https://example.com"
language = "zh"
timezone = "Asia/Shanghai"
theme = "mono-journal"
[server]
host = "0.0.0.0"
port = 8080
mode = "release" # 生产用 release;本地调试可用 debug
[pg]
user = "postgres"
password = "postgres"
hostname = "localhost"
port = "5432"
database = "my_website"
schema = "public"
table_prefix = "gp_" # 表前缀(类 WordPress wp_)
max_open_conns = 20
max_idle_conns = 10
conn_max_lifetime = "30m"
[redis]
host = "localhost"
port = 6379
password = ""
db = 0
[cms]
jwt_secret = "" # 必填:安装器自动生成;留空或用示例占位值时应用拒绝启动
jwt_expire_hours = 24
upload_dir = "uploads"
upload_max_size_mb = 10 # 单文件上传上限;JPEG/PNG 上传后会自动生成响应式变体
[mail]
driver = "go-mail"
enabled = false
host = "smtp.example.com"
port = 587
encryption = "starttls" # starttls / ssl / none
username = "smtp-user"
mail_key = "smtp-password-or-app-key"
from_email = "no-reply@example.com"
from_name = "My Website"
reply_to = ""
timeout_seconds = 10
[install]
completed = true
关键字段说明
[site]
name/url— 给 SEOBuilder 的静态 baseline;admin「系统设置 > 网站设置」中的site_name/site_description会在运行时覆盖渲染层(详见 SEO 接入规范)language— 默认语言代码(如zh、en),影响 i18n 默认 fallback 和多语言插件的默认语言timezone— 站点时区,使用 IANA 时区名(如Asia/Shanghai、America/New_York)或Local。后台发布时间输入会按该时区解析后以 UTC 存储,前台和后台展示再转回该时区。老站点没有该字段时会兼容回退到服务器本地时区;建议在「系统设置 > 网站设置」里保存一次明确值。theme— 启动时激活的主题 slug
[pg]
table_prefix— 类似 WordPress 的wp_,多个 GoPress 实例可共享同一数据库,靠前缀隔离。详见 数据库表前缀- 连接池参数 (
max_open_conns等) 影响并发性能上限,生产环境建议根据 PG 实例规格调整
[redis]
可选段。完全删除或留空,引擎自动降级为纯内存 LRU(L1 缓存)。
[cms]
jwt_secret— 后台会话与 API Bearer Token 的签名密钥,每个站点必须是唯一的随机值,泄露后等于把后台和 API 钥匙交给攻击者。安装器会自动生成;为空或仍是示例占位值(go-press-change-this-secret-in-production)时应用会拒绝启动,可用openssl rand -base64 32手动生成jwt_expire_hours— 后台/ API Token 有效期(小时)。注意:被禁用或降级的账号无需等待过期,下一次请求即失效(服务端会按数据库实时状态复核)upload_dir— 上传根目录,子目录按年月组织(uploads/2026/04/...)
安全默认行为
以下防护由 core 默认启用,无需额外配置:
- 后台会话 Cookie —
HttpOnly+SameSite=Lax,且当[site].url为https://时自动加Secure(HTTPS 部署不会再明文传输后台 Token)。因此请把生产站点的url配成https://… - CSRF 同源校验 — 后台所有改状态请求(含登录、插件后台路由)校验
Origin/Referer与站点同源,跨站请求被拒(403) - 登录限流 — 后台登录按来源 IP 限制失败次数(默认 5 分钟内 10 次失败即临时拦截,返回
429),失败尝试写入审计日志 - 账号状态实时生效 — 禁用账号或调整角色后,其已签发的后台/API Token 立即失效或按新角色鉴权,无需等到 Token 过期
- 前台 Session 可即时撤销 — 前台用户 Session 存在数据库中且每次请求复核账号状态;停用账号后,下一次请求会撤销数据库 Session 并清除浏览器 Cookie
- 上传文件防 XSS — 上传目录中
svg/html/xml等可执行文档在返回时强制Content-Disposition: attachment+ CSPsandbox,避免被当作页面在站点域下执行脚本;通过<img>内联引用的图片不受影响,照常显示
[mail]
邮件发送配置是站点级配置,后台「邮件设置」页会写入当前站点的 config.toml。配置文件由安装器和 config.Save() 以 0600 权限保存,mail_key 不会在后台表单中回显。
enabled— SMTP 总开关。关闭时通知规则仍保存,但不会投递邮件driver— SMTP 发信驱动,默认go-mail;可切换为stdlib使用 Go 标准库 SMTP 分支host/port/encryption— SMTP 服务器、端口和加密方式。encryption支持starttls、ssl、noneusername/mail_key— SMTP 登录凭据;mail_key建议填写邮箱服务商提供的 app password 或 API keyfrom_email/from_name— 默认发件人reply_to— 默认 Reply-To。联系留言通知会优先使用留言人的邮箱作为 Reply-Totimeout_seconds— SMTP 连接超时
Gmail 常用配置:host = "smtp.gmail.com"、port = 587、encryption = "starttls",username 和 from_email 都填写 Gmail 地址,mail_key 填 Google 生成的 App Password,不要填 Google 账号登录密码。
多站点配置
sites/ 下每个子目录代表一个站点:
sites/
├── localhost/
│ ├── config.toml
│ └── public/ # 站点级生成物,如 sitemap.xml
├── staging.gopress.xyz/config.toml
└── prod.gopress.xyz/config.toml
启动时通过 -config <path> 指定具体哪个生效。多站点可指向同一 PG 实例不同 database 或同一 database 不同 table_prefix。
后台生成的 sitemap.xml 会写入当前站点目录下的 public/,例如 sites/prod.gopress.xyz/public/sitemap.xml。后续 robots.txt、llms.txt 等站点级公开生成物也应放在同一目录,避免多个站点共享应用根目录时互相覆盖。
