内网 Gitea 用 Docker 拉起来了,官方安全项先核哪几条?

私仓不想全扔公网托管,机器上按 Gitea 的 Docker 安装页 把 docker compose 跑通了。浏览器能开安装向导,仓库也能推。这时候更该停一下:官方 Configuration Cheat Sheet 里 security / service 那几项,默认值跟生产预期未必同一回事。同源友好 fork 还有 Forgejo 一类,本文只按 Gitea 官方页做安装后自查,不展开 fork 对比。

安装锁和注册开关

Cheat Sheet 的 [security] 写明:INSTALL_LOCK 默认是 false,用来控制能不能再进安装页。设成 true 之后,安装页就打不开。Docker 装完、向导走完,应确认 app.ini(容器里常见路径是 /data/gitea/conf/app.ini)里这一项已经锁上。还停在 false,等于安装入口还开着,别人还能再走一遍向导。

注册相关在 [service]。DISABLE_REGISTRATION 官方默认记成 true:关掉开放注册后,只能由管理员建账号。内网私仓若仍允许陌生人自己注册,先对照这一项。需要开放也要明确是有意为之,而不是 compose 示例带过来的状态。Cheat Sheet 还写了 SHOW_REGISTRATION_BUTTON 等联动项,按钮显不显示,跟注册真正关没关不是同一概念,两项一起看更稳。

Docker 安装页允许用环境变量改 app.ini,形式是 GITEA__section_name__KEY_NAME。官方镜像启动时会跑 environment-to-ini。想固化锁和注册策略,可以在 compose 里写对应变量,避免每次改文件又被示例覆盖。改完配置需要完整重启容器,Cheat Sheet 开头也写了:配置变更要完整重启才生效。

密钥、示例密码和 volume

SECRET_KEY 官方标得很重:丢了之后,用它加密的数据(文档举例含 2FA 一类)解不开。INTERNAL_TOKEN 用于进程内部校验。安装页也写了:新装会自动生成并写入 app.ini。若要手写,可用镜像自带的生成命令,例如:

docker run -it --rm docker.gitea.com/gitea:1 gitea generate secret SECRET_KEY
docker run -it --rm docker.gitea.com/gitea:1 gitea generate secret INTERNAL_TOKEN

装完之后不要随便改 SECRET_KEY。环境变量写法是 GITEA__security__SECRET_KEY / GITEA__security__INTERNAL_TOKEN。密钥本身也要有备份策略,别只存在一台随时会重装的机器上。

compose 示例里 MySQL / PostgreSQL 的用户口令常写成字面量 gitea。那是演示用串,不是生产口令。库口令、root 口令都要换成自己的,并确认没有把示例文件原样提交进仓库。管理员账号在向导里创建时同样不要用弱口令。

数据目录要落在容器外。安装页示例把宿主机 ./gitea 挂到容器 /data。用 named volume 也可以。升级段落强调:先保证数据卷在容器外面,再 docker compose pull / up -d。备份就盯这个 volume(以及数据库 volume,若库也跑在 compose 里),别只备份容器本身。仓库对象、附件、配置都在 /data 这一侧,volume 丢了等于实例空了。

HTTPS 和暴露面

安装页默认映射 3000:3000 和 SSH 相关端口。内网自建也建议前面加反代,把对外入口收到 HTTPS。Cheat Sheet 的 [server] 里有 ROOT_URL、PROTOCOL、以及 ENABLE_ACME 一类证书相关项。更常见的做法是反代终止 TLS,再把 ROOT_URL 写成用户实际访问的地址。HTTP 裸奔到不信任网段,不在「先自查」的合格线里。

SSH 端口映不映射、用不用内置 SSH,按你们实际克隆方式决定。但 web 和 SSH 都不该带着示例口令、开放注册、未锁安装页一起露到不信任网络。镜像标签安装页示例用过具体版本号,生产建议钉死版本,少用漂移很大的浮动标签。

自查时可顺手勾的几句

  • INSTALL_LOCK 已经是 true
  • DISABLE_REGISTRATION 符合你们的账号发放方式(官方默认记为关闭开放注册)
  • SECRET_KEY / INTERNAL_TOKEN 已生成,且备份策略清楚
  • 数据库与管理员口令不再是 compose 示例里的字面量
  • /data(以及库数据)volume 在容器外,并且有定期备份
  • 对外已走 HTTPS / 反代,ROOT_URL 与真实访问地址一致

你们内网 Gitea 是管理员手工发账号,还是接了 LDAP / OAuth?注册开关和身份源怎么配的,欢迎贴一下自己的做法。