You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

with-docker-rootless.zh-cn.md 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  1. ---
  2. date: "2020-02-09T20:00:00+02:00"
  3. title: "使用 Docker 安装 (rootless)"
  4. slug: "install-with-docker-rootless"
  5. sidebar_position: 60
  6. toc: false
  7. draft: false
  8. aliases:
  9. - /zh-cn/install-with-docker-rootless
  10. menu:
  11. sidebar:
  12. parent: "installation"
  13. name: "使用 Docker 安装 (rootless)"
  14. sidebar_position: 60
  15. identifier: "install-with-docker-rootless"
  16. ---
  17. # 使用 Docker 安装
  18. Gitea 在其 Docker Hub 组织中提供自动更新的 Docker 镜像。您可以始终使用最新的稳定标签,或使用其他处理 Docker 镜像更新的服务。
  19. rootless 镜像使用 Gitea 内部 SSH 功能来提供 Git 协议,但不支持 OpenSSH。
  20. 本参考设置指南将用户引导通过基于 `docker-compose` 的设置。但是,`docker-compose` 的安装超出了本文档的范围。要安装`docker-compose` 本身, 请按照官方的 [安装说明](https://docs.docker.com/compose/install/)进行操作。
  21. ## 基础设置
  22. 最简单的设置只需创建一个卷和一个网络,并将 `gitea/gitea:latest-rootless` 镜像作为服务启动。由于没有可用的数据库,可以使用 SQLite3 来初始化一个。
  23. 创建一个名为 `data` 和 `config`:
  24. ```sh
  25. mkdir -p gitea/{data,config}
  26. cd gitea
  27. touch docker-compose.yml
  28. ```
  29. 然后将以下内容粘贴到名为 `docker-compose.yml` 的文件中:
  30. ```yaml
  31. version: "2"
  32. services:
  33. server:
  34. image: gitea/gitea:@version@-rootless
  35. restart: always
  36. volumes:
  37. - ./data:/var/lib/gitea
  38. - ./config:/etc/gitea
  39. - /etc/timezone:/etc/timezone:ro
  40. - /etc/localtime:/etc/localtime:ro
  41. ports:
  42. - "3000:3000"
  43. - "2222:2222"
  44. ```
  45. 请注意,卷应由在配置文件中指定的UID/GID的用户/组所有。默认情况下,Docker中的Gitea将使用uid:1000 gid:1000。如果需要,您可以使用以下命令设置这些文件夹的所有权:
  46. ```sh
  47. sudo chown 1000:1000 config/ data/
  48. ```
  49. > 如果未为卷设置正确的权限,容器可能无法启动。
  50. 对于稳定版本,您可以使用 `:latest-rootless`、`:1-rootless`,或指定特定的版本,如: `@version@-rootless`。如果您想使用最新的开发版本,则可以使用 `:dev-rootless` 标签。如果您想运行发布分支的最新提交,可以使用 `:1.x-dev-rootless` 标签,其中 x是 Gitea 的次要版本号(例如:`1.16-dev-rootless`)。
  51. ## 自定义端口
  52. 要将集成的SSH和Web服务器绑定到不同的端口,请调整端口部分。通常只需更改主机端口并保持容器内的端口不变。
  53. ```diff
  54. version: "2"
  55. services:
  56. server:
  57. image: gitea/gitea:@version@-rootless
  58. restart: always
  59. volumes:
  60. - ./data:/var/lib/gitea
  61. - ./config:/etc/gitea
  62. - /etc/timezone:/etc/timezone:ro
  63. - /etc/localtime:/etc/localtime:ro
  64. ports:
  65. - - "3000:3000"
  66. - - "2222:2222"
  67. + - "80:3000"
  68. + - "22:2222"
  69. ```
  70. ## MySQL 数据库
  71. 要将 Gitea 与 MySQL 数据库结合使用,请对上面创建的 `docker-compose.yml` 文件进行以下更改。
  72. ```diff
  73. version: "2"
  74. services:
  75. server:
  76. image: gitea/gitea:@version@-rootless
  77. + environment:
  78. + - GITEA__database__DB_TYPE=mysql
  79. + - GITEA__database__HOST=db:3306
  80. + - GITEA__database__NAME=gitea
  81. + - GITEA__database__USER=gitea
  82. + - GITEA__database__PASSWD=gitea
  83. restart: always
  84. volumes:
  85. - ./data:/var/lib/gitea
  86. - ./config:/etc/gitea
  87. - /etc/timezone:/etc/timezone:ro
  88. - /etc/localtime:/etc/localtime:ro
  89. ports:
  90. - "3000:3000"
  91. - "222:22"
  92. + depends_on:
  93. + - db
  94. +
  95. + db:
  96. + image: mysql:8
  97. + restart: always
  98. + environment:
  99. + - MYSQL_ROOT_PASSWORD=gitea
  100. + - MYSQL_USER=gitea
  101. + - MYSQL_PASSWORD=gitea
  102. + - MYSQL_DATABASE=gitea
  103. + volumes:
  104. + - ./mysql:/var/lib/mysql
  105. ```
  106. ## PostgreSQL 数据库
  107. 要将 Gitea 与 PostgreSQL 数据库结合使用,请对上面创建的 `docker-compose.yml` 文件进行以下更改。
  108. ```diff
  109. version: "2"
  110. services:
  111. server:
  112. image: gitea/gitea:@version@-rootless
  113. environment:
  114. + - GITEA__database__DB_TYPE=postgres
  115. + - GITEA__database__HOST=db:5432
  116. + - GITEA__database__NAME=gitea
  117. + - GITEA__database__USER=gitea
  118. + - GITEA__database__PASSWD=gitea
  119. restart: always
  120. volumes:
  121. - ./data:/var/lib/gitea
  122. - ./config:/etc/gitea
  123. - /etc/timezone:/etc/timezone:ro
  124. - /etc/localtime:/etc/localtime:ro
  125. ports:
  126. - "3000:3000"
  127. - "2222:2222"
  128. + depends_on:
  129. + - db
  130. +
  131. + db:
  132. + image: postgres:14
  133. + restart: always
  134. + environment:
  135. + - POSTGRES_USER=gitea
  136. + - POSTGRES_PASSWORD=gitea
  137. + - POSTGRES_DB=gitea
  138. + volumes:
  139. + - ./postgres:/var/lib/postgresql/data
  140. ```
  141. ## 命名卷 (Named Volumes)
  142. 要使用命名卷 (Named Volumes) 而不是主机卷 (Host Volumes),请在 `docker-compose.yml` 配置中定义和使用命名卷。这样的更改将自动创建所需的卷。您不需要担心权限问题,Docker 会自动处理。
  143. ```diff
  144. version: "2"
  145. +volumes:
  146. + gitea-data:
  147. + driver: local
  148. + gitea-config:
  149. + driver: local
  150. +
  151. services:
  152. server:
  153. image: gitea/gitea:@version@-rootless
  154. restart: always
  155. volumes:
  156. - - ./data:/var/lib/gitea
  157. + - gitea-data:/var/lib/gitea
  158. - - ./config:/etc/gitea
  159. + - gitea-config:/etc/gitea
  160. - /etc/timezone:/etc/timezone:ro
  161. - /etc/localtime:/etc/localtime:ro
  162. ports:
  163. - "3000:3000"
  164. - "2222:2222"
  165. ```
  166. MySQL 或 PostgreSQL 容器需要单独创建。
  167. ## 自定义用户
  168. 你可以选择使用自定义用户 (遵循 --user 标志定义 https://docs.docker.com/engine/reference/run/#user)。
  169. 例如,要克隆主机用户 `git` 的定义,请使用命令 `id -u git` 并将其添加到 `docker-compose.yml` 文件中:
  170. 请确用户对保挂载的文件夹具有写权限。
  171. ```diff
  172. version: "2"
  173. services:
  174. server:
  175. image: gitea/gitea:@version@-rootless
  176. restart: always
  177. + user: 1001
  178. volumes:
  179. - ./data:/var/lib/gitea
  180. - ./config:/etc/gitea
  181. - /etc/timezone:/etc/timezone:ro
  182. - /etc/localtime:/etc/localtime:ro
  183. ports:
  184. - "3000:3000"
  185. - "2222:2222"
  186. ```
  187. ## 启动
  188. 要启动基于 `docker-compose` 的这个设置,请执行 `docker-compose up -d`,以在后台启动 Gitea。使用 `docker-compose ps` 命令可以查看 Gitea 是否正确启动。可以使用 `docker-compose logs` 命令查看日志。
  189. 要关闭设置,请执行 `docker-compose down` 命令。这将停止和终止容器,但卷仍将存在。
  190. 注意:如果在 HTTP 上使用的是非 3000 端口,请将 app.ini 更改为匹配 `LOCAL_ROOT_URL = http://localhost:3000/`。
  191. ## 安装
  192. 在通过 `docker-compose` 启动 Docker 设置后,可以使用喜爱的浏览器访问 Gitea,完成安装过程。访问 `http://<服务器-IP>:3000` 并按照安装向导进行操作。如果数据库是使用上述文档中的 `docker-compose` 设置启动的,请注意必须使用 `db` 作为数据库主机名。
  193. # 自定义
  194. 自定义文件的位置位于 `/var/lib/gitea/custom` 目录中,可以在这里找到有关自定义的文件说明。如果使用主机卷(host volumes),很容易访问这些文件;如果使用命名卷(named volumes),则可以通过另一个容器或直接访问 `/var/lib/docker/volumes/gitea_gitea/_/var_lib_gitea` 来进行访问。在安装后,配置文件将保存在 `/etc/gitea/app.ini` 中。
  195. # 升级
  196. :exclamation::exclamation: **确保您已将数据卷迁移到 Docker 容器之外的其他位置** :exclamation::exclamation:
  197. 要将安装升级到最新版本,请按照以下步骤操作:
  198. ```
  199. # 如果在 docker-compose.yml 中指定了版本,请编辑该文件以更新版本
  200. # 拉取新的镜像
  201. docker-compose pull
  202. # 启动一个新的容器,自动移除旧的容器
  203. docker-compose up -d
  204. ```
  205. # 从标准镜像升级
  206. - 备份您的设置
  207. - 将卷挂载点从 `/data` 更改为 `/var/lib/gitea`
  208. - 如果使用了自定义的 `app.ini`,请将其移动到新的挂载到 `/etc/gitea` 的卷中
  209. - 将卷中的文件夹(gitea)重命名为 custom
  210. - 如果需要,编辑 `app.ini`
  211. - 设置 `START_SSH_SERVER = true`
  212. - 使用镜像 `gitea/gitea:@version@-rootless`
  213. ## 使用环境变量管理部署
  214. 除了上述的环境变量外,`app.ini` 中的任何设置都可以通过形式为 `GITEA__SECTION_NAME__KEY_NAME` 的环境变量进行设置或覆盖。这些设置在每次 Docker 容器启动时都会生效。完整信息请参考[这里](https://github.com/go-gitea/gitea/tree/main/contrib/environment-to-ini).
  215. 这些环境变量可以在 `docker-compose.yml` 中传递给 Docker 容器。以下示例将启用 SMTP 邮件服务器,如果主机上设置了所需的环境变量 GITEA__mailer__FROM、GITEA__mailer__HOST、GITEA__mailer__PASSWD,或者在与 `docker-compose.yml` 相同目录中的 `.env` 文件中设置了这些环境变量:
  216. ```bash
  217. ...
  218. services:
  219. server:
  220. environment:
  221. - GITEA__mailer__ENABLED=true
  222. - GITEA__mailer__FROM=${GITEA__mailer__FROM:?GITEA__mailer__FROM not set}
  223. - GITEA__mailer__PROTOCOL=smtp
  224. - GITEA__mailer__HOST=${GITEA__mailer__HOST:?GITEA__mailer__HOST not set}
  225. - GITEA__mailer__IS_TLS_ENABLED=true
  226. - GITEA__mailer__USER=${GITEA__mailer__USER:-apikey}
  227. - GITEA__mailer__PASSWD="""${GITEA__mailer__PASSWD:?GITEA__mailer__PASSWD not set}"""
  228. ```
  229. 要设置所需的 TOKEN 和 SECRET 值,可以使用 Gitea 的内置[生成使用函数](administration/command-line.md#generate).
  230. # SSH 容器透传
  231. 由于 SSH 在容器内运行,如果需要 SSH 支持,需要将 SSH 从主机透传到容器。一种选择是在容器内运行 SSH,并使用非标准端口(或将主机端口移动到非标准端口)。另一种可能更直接的选择是将主机上的 SSH 命令转发到容器。下面解释了这种设置。
  232. 本指南假设您已在主机上创建了一个名为 `git` 的用户,并具有运行 `docker exec` 的权限,并且 Gitea 容器的名称为 `gitea`。您需要修改该用户的 shell,以将命令转发到容器内的 `sh` 可执行文件,使用 `docker exec`。
  233. 首先,在主机上创建文件 `/usr/local/bin/gitea-shell`,并填入以下内容:
  234. ```bash
  235. #!/bin/sh
  236. /usr/bin/docker exec -i --env SSH_ORIGINAL_COMMAND="$SSH_ORIGINAL_COMMAND" gitea sh "$@"
  237. ```
  238. 注意上述 docker 命令中的 `gitea` 是容器的名称。如果您的容器名称不同,请记得更改。
  239. 还应确保正确设置了 shell 包装器的权限:
  240. ```bash
  241. sudo chmod +x /usr/local/bin/gitea-shell
  242. ```
  243. 一旦包装器就位,您可以将其设置为 `git` 用户的 shell:
  244. ```bash
  245. sudo usermod -s /usr/local/bin/gitea-shell git
  246. ```
  247. 现在,所有的 SSH 命令都会被转发到容器,您需要在主机上设置 SSH 认证。这可以通过利用 [SSH AuthorizedKeysCommand](administration/command-line.md#keys) 来匹配 Gitea 接受的密钥。在主机的 `/etc/ssh/sshd_config` 文件中添加以下代码块:
  248. ```bash
  249. Match User git
  250. AuthorizedKeysCommandUser git
  251. AuthorizedKeysCommand /usr/bin/docker exec -i gitea /usr/local/bin/gitea keys -c /etc/gitea/app.ini -e git -u %u -t %t -k %k
  252. ```
  253. (从 1.16.0 开始,您将不需要设置 `-c /etc/gitea/app.ini` 选项。)
  254. 剩下的就是重新启动 SSH 服务器:
  255. ```bash
  256. sudo systemctl restart sshd
  257. ```
  258. **注意**
  259. 这实际上并没有使用 Docker 的 SSH,而是仅仅使用了围绕它的命令。
  260. 从理论上讲,您可以不运行内部的 SSH 服务器。