配置
配置从哪里来,以及谁覆盖谁
配置在两个地方,而且不重叠。
- 环境变量放跑起来之后改不动的,以及几个数据库里绝对不能有的秘密。
- 后台在同一个网址的
/admin/,放其他全部。存在数据库里,改完不用重启。
后台里看得到的,改了就会生效。要重启才会生效的配置,会显示成只读并附上原因。
没有配置文件
tessera.yaml 和 tessera.toml 不会被读。还设着 TESSERA_CONFIG_FILE 的机器开得起来但会记一句警告,那个文件里写什么都不算数。
一定要走环境变量的
开机时就定了。 socket 已经 bind、连接池已经建好、log 的 subscriber 开机只装一次。
server.host、server.port、server.data_dir、server.max_body_bytes、server.cors_allowed_origins、server.assets_dirfeatures.docsdatabase.和telemetry.底下的全部
数据库里不能有的秘密。
database.url、auth.admin_password、security.secret_key
其他的跑着就能改。
放在后台的凭证
发信中继的账密、扫毒服务的授权请求头、第三方登录的 client secret,还有存储 backend 的地址,都跟其他配置一样在后台设。后台会告诉你某一个有没有设,但不会再显示它,所以读得到配置的人读不到密码。
封住凭证的那把密钥
那些凭证是加密存的。密钥是 security.secret_key;留空的话,机器会在第一次启动时生成一把,存成 server.data_dir 底下的 secret.key。
密钥丢了,所有封起来的凭证就没了
没有它,数据库的备份对那些值来说没有用;在新机器上还原却没带密钥,就要把每一个 backend 和秘密重新输入一次。secret.key 跟数据库一起备份,或是设 TESSERA_SECURITY__SECRET_KEY(openssl rand -hex 32)并且放在备份不在的地方。
环境变量怎么写
TESSERA_SERVER__PORT=9000
TESSERA_DATABASE__URL=postgres://…前缀 TESSERA_,嵌套用两个下划线。列表可以用逗号,也可以用 JSON 数组:
TESSERA_SERVER__CORS_ALLOWED_ORIGINS='https://a.example, https://b.example'
TESSERA_SERVER__CORS_ALLOWED_ORIGINS='["https://a.example","https://b.example"]'不是配置的 key 会让它停下来,不会默默忽略,所以打错字在开机时就抓到。
systemd 的 EnvironmentFile= 一样是指一个文件。repo 里的 contrib/tessera.service 有一份能用的。
主 repo 有两份可以直接拿来改:只有你和你信任的人用的,从 tessera.personal.env.example 开始;开放给陌生人上传的,从 tessera.public.env.example 开始。注释是繁体中文。
其他的怎么改
三条路进同一个地方:
每一个配置、现在生效的值,以及它是从哪一层来的。只能走环境变量的会显示成只读。
谁覆盖谁
由低到高:内置默认值,然后是环境变量,然后是存起来的配置。
存起来的配置覆盖环境变量
它是唯一有人在这台机器上刻意改过的一层。容器镜像自己会设几个变量,让那些赢的话,后台就变成一个报告成功但什么都没改的界面。
存起来的值如果这个版本不收(降版或改坏了),会被一个 key 一个 key 地丢掉并记进 log,由下面那一层决定,其他配置不受影响。
有些改动会毁掉东西
把保存期改短,已经超过新界线的东西就没了。后台会先拒绝,要你确认,并且先告诉你会丢掉多少。
几个会想先改的
配置
类型
匿名上传没有配额
features.anonymous_upload 开着而 storage.max_total_bytes 没设的话,任何连得到的人都能把磁盘塞满。启动时会警告。
server.request_timeout_secs 不管上传。一个时钟预算没办法同时让 5 GB 的上传传完、又挡掉连上来就不发东西的客户端,所以上传改看 server.upload_stall_secs:可以多久没有任何字节进来。