使用 Docker 安装

Gitea 在其 Docker Hub 组织中提供自动更新的 Docker 镜像。您可以始终使用最新的稳定标签,或使用其他处理 Docker 镜像更新的服务。

rootless 镜像使用 Gitea 内部 SSH 功能来提供 Git 协议,但不支持 OpenSSH。

本参考设置指南将用户引导通过基于 docker-compose 的设置。但是,docker-compose 的安装超出了本文档的范围。要安装docker-compose 本身, 请按照官方的 安装说明进行操作。

基础设置

最简单的设置只需创建一个卷和一个网络,并将 gitea/gitea:latest-rootless 镜像作为服务启动。由于没有可用的数据库,可以使用 SQLite3 来初始化一个。

创建一个名为 dataconfig:

  1. mkdir -p gitea/{data,config}
  2. cd gitea
  3. touch docker-compose.yml

然后将以下内容粘贴到名为 docker-compose.yml 的文件中:

  1. version: "2"
  2. services:
  3. server:
  4. image: gitea/gitea:1.21.1-rootless
  5. restart: always
  6. volumes:
  7. - ./data:/var/lib/gitea
  8. - ./config:/etc/gitea
  9. - /etc/timezone:/etc/timezone:ro
  10. - /etc/localtime:/etc/localtime:ro
  11. ports:
  12. - "3000:3000"
  13. - "2222:2222"

请注意,卷应由在配置文件中指定的UID/GID的用户/组所有。默认情况下,Docker中的Gitea将使用uid:1000 gid:1000。如果需要,您可以使用以下命令设置这些文件夹的所有权:

  1. sudo chown 1000:1000 config/ data/

如果未为卷设置正确的权限,容器可能无法启动。

对于稳定版本,您可以使用 :latest-rootless:1-rootless,或指定特定的版本,如: 1.21.1-rootless。如果您想使用最新的开发版本,则可以使用 :dev-rootless 标签。如果您想运行发布分支的最新提交,可以使用 :1.x-dev-rootless 标签,其中 x是 Gitea 的次要版本号(例如:1.16-dev-rootless)。

自定义端口

要将集成的SSH和Web服务器绑定到不同的端口,请调整端口部分。通常只需更改主机端口并保持容器内的端口不变。

  1. version: "2"
  2. services:
  3. server:
  4. image: gitea/gitea:1.21.1-rootless
  5. restart: always
  6. volumes:
  7. - ./data:/var/lib/gitea
  8. - ./config:/etc/gitea
  9. - /etc/timezone:/etc/timezone:ro
  10. - /etc/localtime:/etc/localtime:ro
  11. ports:
  12. - - "3000:3000"
  13. - - "2222:2222"
  14. + - "80:3000"
  15. + - "22:2222"

MySQL 数据库

要将 Gitea 与 MySQL 数据库结合使用,请对上面创建的 docker-compose.yml 文件进行以下更改。

  1. version: "2"
  2. services:
  3. server:
  4. image: gitea/gitea:1.21.1-rootless
  5. + environment:
  6. + - GITEA__database__DB_TYPE=mysql
  7. + - GITEA__database__HOST=db:3306
  8. + - GITEA__database__NAME=gitea
  9. + - GITEA__database__USER=gitea
  10. + - GITEA__database__PASSWD=gitea
  11. restart: always
  12. volumes:
  13. - ./data:/var/lib/gitea
  14. - ./config:/etc/gitea
  15. - /etc/timezone:/etc/timezone:ro
  16. - /etc/localtime:/etc/localtime:ro
  17. ports:
  18. - "3000:3000"
  19. - "222:22"
  20. + depends_on:
  21. + - db
  22. +
  23. + db:
  24. + image: mysql:8
  25. + restart: always
  26. + environment:
  27. + - MYSQL_ROOT_PASSWORD=gitea
  28. + - MYSQL_USER=gitea
  29. + - MYSQL_PASSWORD=gitea
  30. + - MYSQL_DATABASE=gitea
  31. + volumes:
  32. + - ./mysql:/var/lib/mysql

PostgreSQL 数据库

要将 Gitea 与 PostgreSQL 数据库结合使用,请对上面创建的 docker-compose.yml 文件进行以下更改。

  1. version: "2"
  2. services:
  3. server:
  4. image: gitea/gitea:1.21.1-rootless
  5. environment:
  6. + - GITEA__database__DB_TYPE=postgres
  7. + - GITEA__database__HOST=db:5432
  8. + - GITEA__database__NAME=gitea
  9. + - GITEA__database__USER=gitea
  10. + - GITEA__database__PASSWD=gitea
  11. restart: always
  12. volumes:
  13. - ./data:/var/lib/gitea
  14. - ./config:/etc/gitea
  15. - /etc/timezone:/etc/timezone:ro
  16. - /etc/localtime:/etc/localtime:ro
  17. ports:
  18. - "3000:3000"
  19. - "2222:2222"
  20. + depends_on:
  21. + - db
  22. +
  23. + db:
  24. + image: postgres:14
  25. + restart: always
  26. + environment:
  27. + - POSTGRES_USER=gitea
  28. + - POSTGRES_PASSWORD=gitea
  29. + - POSTGRES_DB=gitea
  30. + volumes:
  31. + - ./postgres:/var/lib/postgresql/data

命名卷 (Named Volumes)

要使用命名卷 (Named Volumes) 而不是主机卷 (Host Volumes),请在 docker-compose.yml 配置中定义和使用命名卷。这样的更改将自动创建所需的卷。您不需要担心权限问题,Docker 会自动处理。

  1. version: "2"
  2. +volumes:
  3. + gitea-data:
  4. + driver: local
  5. + gitea-config:
  6. + driver: local
  7. +
  8. services:
  9. server:
  10. image: gitea/gitea:1.21.1-rootless
  11. restart: always
  12. volumes:
  13. - - ./data:/var/lib/gitea
  14. + - gitea-data:/var/lib/gitea
  15. - - ./config:/etc/gitea
  16. + - gitea-config:/etc/gitea
  17. - /etc/timezone:/etc/timezone:ro
  18. - /etc/localtime:/etc/localtime:ro
  19. ports:
  20. - "3000:3000"
  21. - "2222:2222"

MySQL 或 PostgreSQL 容器需要单独创建。

自定义用户

你可以选择使用自定义用户 (遵循 —user 标志定义 https://docs.docker.com/engine/reference/run/#user)。%E3%80%82) 例如,要克隆主机用户 git 的定义,请使用命令 id -u git 并将其添加到 docker-compose.yml 文件中: 请确用户对保挂载的文件夹具有写权限。

  1. version: "2"
  2. services:
  3. server:
  4. image: gitea/gitea:1.21.1-rootless
  5. restart: always
  6. + user: 1001
  7. volumes:
  8. - ./data:/var/lib/gitea
  9. - ./config:/etc/gitea
  10. - /etc/timezone:/etc/timezone:ro
  11. - /etc/localtime:/etc/localtime:ro
  12. ports:
  13. - "3000:3000"
  14. - "2222:2222"

启动

要启动基于 docker-compose 的这个设置,请执行 docker-compose up -d,以在后台启动 Gitea。使用 docker-compose ps 命令可以查看 Gitea 是否正确启动。可以使用 docker-compose logs 命令查看日志。

要关闭设置,请执行 docker-compose down 命令。这将停止和终止容器,但卷仍将存在。

注意:如果在 HTTP 上使用的是非 3000 端口,请将 app.ini 更改为匹配 LOCAL_ROOT_URL = http://localhost:3000/

安装

在通过 docker-compose 启动 Docker 设置后,可以使用喜爱的浏览器访问 Gitea,完成安装过程。访问 http://<服务器-IP>:3000 并按照安装向导进行操作。如果数据库是使用上述文档中的 docker-compose 设置启动的,请注意必须使用 db 作为数据库主机名。

自定义

自定义文件的位置位于 /var/lib/gitea/custom 目录中,可以在这里找到有关自定义的文件说明。如果使用主机卷(host volumes),很容易访问这些文件;如果使用命名卷(named volumes),则可以通过另一个容器或直接访问 /var/lib/docker/volumes/gitea_gitea/_/var_lib_gitea 来进行访问。在安装后,配置文件将保存在 /etc/gitea/app.ini 中。

升级

❗❗ 确保您已将数据卷迁移到 Docker 容器之外的其他位置 ❗❗

要将安装升级到最新版本,请按照以下步骤操作:

  1. # 如果在 docker-compose.yml 中指定了版本,请编辑该文件以更新版本
  2. # 拉取新的镜像
  3. docker-compose pull
  4. # 启动一个新的容器,自动移除旧的容器
  5. docker-compose up -d

从标准镜像升级

  • 备份您的设置
  • 将卷挂载点从 /data 更改为 /var/lib/gitea
  • 如果使用了自定义的 app.ini,请将其移动到新的挂载到 /etc/gitea 的卷中
  • 将卷中的文件夹(gitea)重命名为 custom
  • 如果需要,编辑 app.ini
    • 设置 START_SSH_SERVER = true
  • 使用镜像 gitea/gitea:1.21.1-rootless

使用环境变量管理部署

除了上述的环境变量外,app.ini 中的任何设置都可以通过形式为 GITEA__SECTION_NAME__KEY_NAME 的环境变量进行设置或覆盖。这些设置在每次 Docker 容器启动时都会生效。完整信息请参考这里.

这些环境变量可以在 docker-compose.yml 中传递给 Docker 容器。以下示例将启用 SMTP 邮件服务器,如果主机上设置了所需的环境变量 GITEA__mailer__FROM、GITEA__mailer__HOST、GITEA__mailer__PASSWD,或者在与 docker-compose.yml 相同目录中的 .env 文件中设置了这些环境变量:

  1. ...
  2. services:
  3. server:
  4. environment:
  5. - GITEA__mailer__ENABLED=true
  6. - GITEA__mailer__FROM=${GITEA__mailer__FROM:?GITEA__mailer__FROM not set}
  7. - GITEA__mailer__PROTOCOL=smtp
  8. - GITEA__mailer__HOST=${GITEA__mailer__HOST:?GITEA__mailer__HOST not set}
  9. - GITEA__mailer__IS_TLS_ENABLED=true
  10. - GITEA__mailer__USER=${GITEA__mailer__USER:-apikey}
  11. - GITEA__mailer__PASSWD="""${GITEA__mailer__PASSWD:?GITEA__mailer__PASSWD not set}"""

要设置所需的 TOKEN 和 SECRET 值,可以使用 Gitea 的内置生成使用函数.

SSH 容器透传

由于 SSH 在容器内运行,如果需要 SSH 支持,需要将 SSH 从主机透传到容器。一种选择是在容器内运行 SSH,并使用非标准端口(或将主机端口移动到非标准端口)。另一种可能更直接的选择是将主机上的 SSH 命令转发到容器。下面解释了这种设置。

本指南假设您已在主机上创建了一个名为 git 的用户,并具有运行 docker exec 的权限,并且 Gitea 容器的名称为 gitea。您需要修改该用户的 shell,以将命令转发到容器内的 sh 可执行文件,使用 docker exec

首先,在主机上创建文件 /usr/local/bin/gitea-shell,并填入以下内容:

  1. #!/bin/sh
  2. /usr/bin/docker exec -i --env SSH_ORIGINAL_COMMAND="$SSH_ORIGINAL_COMMAND" gitea sh "$@"

注意上述 docker 命令中的 gitea 是容器的名称。如果您的容器名称不同,请记得更改。

还应确保正确设置了 shell 包装器的权限:

  1. sudo chmod +x /usr/local/bin/gitea-shell

一旦包装器就位,您可以将其设置为 git 用户的 shell:

  1. sudo usermod -s /usr/local/bin/gitea-shell git

现在,所有的 SSH 命令都会被转发到容器,您需要在主机上设置 SSH 认证。这可以通过利用 SSH AuthorizedKeysCommand 来匹配 Gitea 接受的密钥。在主机的 /etc/ssh/sshd_config 文件中添加以下代码块:

  1. Match User git
  2. AuthorizedKeysCommandUser git
  3. 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

(从 1.16.0 开始,您将不需要设置 -c /etc/gitea/app.ini 选项。)

剩下的就是重新启动 SSH 服务器:

  1. sudo systemctl restart sshd

注意

这实际上并没有使用 Docker 的 SSH,而是仅仅使用了围绕它的命令。 从理论上讲,您可以不运行内部的 SSH 服务器。