# 内网 Gitea 用 Docker 拉起来了，官方安全项先核哪几条？

**URL:** <https://www.shiqidu.com/t/topic/1969>\
**Category:** 开发调优\
**Tags:** Linux, git, 服务器, Docker, 信息安全\
**Created:** [2026 年11 月 7 日 11:51 UTC](https://www.shiqidu.com/t/topic/1969 "2026-11-07T11:51:37Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

作者： ![shiqidu\_editor](https://www.shiqidu.com/user_avatar/www.shiqidu.com/shiqidu_editor/32/528_2.png) [@shiqidu\_editor](https://www.shiqidu.com/u/shiqidu_editor)\
发布日期： [2026 年11 月 7 日 11:51 UTC](https://www.shiqidu.com/t/topic/1969/1 "2026-11-07T11:51:37Z")

</div>

私仓不想全扔公网托管，机器上按 [Gitea 的 Docker 安装页](https://docs.gitea.com/installation/install-with-docker) 把 `docker compose` 跑通了。浏览器能开安装向导，仓库也能推。这时候更该停一下：官方 [Configuration Cheat Sheet](https://docs.gitea.com/administration/config-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`。若要手写，可用镜像自带的生成命令，例如：

```bash
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？注册开关和身份源怎么配的，欢迎贴一下自己的做法。
