跳至主要内容
版本:1.22.3

使用 Docker(无根)安装

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

无根镜像使用 Gitea 内部 SSH 提供 Git 协议,不支持 OpenSSH。

此参考设置指南引导用户完成基于 docker-compose 的设置,但 docker-compose 的安装不在本文档的范围内。要安装 docker-compose 本身,请按照官方的 安装说明 进行操作。

基础知识

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

dataconfig 创建一个目录

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

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

version: "2"

services:
server:
image: gitea/gitea:1.22.3-rootless
restart: always
volumes:
- ./data:/var/lib/gitea
- ./config:/etc/gitea
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "3000:3000"
- "2222:2222"

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

sudo chown 1000:1000 config/ data/

如果您没有为卷提供正确的权限,容器可能无法启动。

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

自定义端口

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

version: "2"

services:
server:
image: gitea/gitea:1.22.3-rootless
restart: always
volumes:
- ./data:/var/lib/gitea
- ./config:/etc/gitea
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- - "3000:3000"
- - "2222:2222"
+ - "80:3000"
+ - "22:2222"

MySQL 数据库

要结合 MySQL 数据库启动 Gitea,请将以下更改应用于上面创建的 docker-compose.yml 文件。

version: "2"

services:
server:
image: gitea/gitea:1.22.3-rootless
+ environment:
+ - GITEA__database__DB_TYPE=mysql
+ - GITEA__database__HOST=db:3306
+ - GITEA__database__NAME=gitea
+ - GITEA__database__USER=gitea
+ - GITEA__database__PASSWD=gitea
restart: always
volumes:
- ./data:/var/lib/gitea
- ./config:/etc/gitea
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "3000:3000"
- "2222:2222"
+ depends_on:
+ - db
+
+ db:
+ image: mysql:8
+ restart: always
+ environment:
+ - MYSQL_ROOT_PASSWORD=gitea
+ - MYSQL_USER=gitea
+ - MYSQL_PASSWORD=gitea
+ - MYSQL_DATABASE=gitea
+ volumes:
+ - ./mysql:/var/lib/mysql

PostgreSQL 数据库

要结合 PostgreSQL 数据库启动 Gitea,请将以下更改应用于上面创建的 docker-compose.yml 文件。

version: "2"

services:
server:
image: gitea/gitea:1.22.3-rootless
environment:
+ - GITEA__database__DB_TYPE=postgres
+ - GITEA__database__HOST=db:5432
+ - GITEA__database__NAME=gitea
+ - GITEA__database__USER=gitea
+ - GITEA__database__PASSWD=gitea
restart: always
volumes:
- ./data:/var/lib/gitea
- ./config:/etc/gitea
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "3000:3000"
- "2222:2222"
+ depends_on:
+ - db
+
+ db:
+ image: postgres:14
+ restart: always
+ environment:
+ - POSTGRES_USER=gitea
+ - POSTGRES_PASSWORD=gitea
+ - POSTGRES_DB=gitea
+ volumes:
+ - ./postgres:/var/lib/postgresql/data

命名卷

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

version: "2"

+volumes:
+ gitea-data:
+ driver: local
+ gitea-config:
+ driver: local
+
services:
server:
image: gitea/gitea:1.22.3-rootless
restart: always
volumes:
- - ./data:/var/lib/gitea
+ - gitea-data:/var/lib/gitea
- - ./config:/etc/gitea
+ - gitea-config:/etc/gitea
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "3000:3000"
- "2222:2222"

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

自定义用户

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

version: "2"

services:
server:
image: gitea/gitea:1.22.3-rootless
restart: always
+ user: 1001
volumes:
- ./data:/var/lib/gitea
- ./config:/etc/gitea
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "3000:3000"
- "2222:2222"

启动

注意

从 2023 年 7 月开始,Compose V1 停止接收更新。它也不再包含在 Docker Desktop 的新版本中。

Compose V2 包含在所有当前支持的 Docker Desktop 版本中。请使用 V2 执行以下操作。

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

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

注意

如果在 http 上使用非 3000 端口,请将 app.ini 更改为匹配 LOCAL_ROOT_URL = https://127.0.0.1:3000/

安装

通过 docker-compose 启动 Docker 设置后,可以使用您喜欢的浏览器访问 Gitea 以完成安装。访问 http://server-ip:3000 并按照安装向导进行操作。如果数据库如上所述使用 docker-compose 设置启动,请注意必须使用 db 作为数据库主机名。

自定义

此处 描述的自定义文件应放置在 /var/lib/gitea/custom 目录中。如果使用主机卷,则很容易访问这些文件;对于命名卷,可以通过另一个容器或通过直接访问 /var/lib/docker/volumes/gitea_gitea/_/var_lib_gitea 来完成。安装后,配置文件将保存在 /etc/gitea/app.ini 中。

升级

警告

确保您已将数据卷到 Docker 容器外部的某个位置

要将您的安装升级到最新版本

# Edit `docker-compose.yml` to update the version, if you have one specified
# Pull new images
docker-compose pull
# Start a new container, automatically removes old one
docker-compose up -d

从标准镜像升级

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

使用环境变量管理部署

除了上述环境变量外,app.ini 中的任何设置都可以使用以下形式的环境变量设置或覆盖:GITEA__SECTION_NAME__KEY_NAME。这些设置在每次 Docker 容器启动时应用,不会传递到 Gitea 的子进程中。完整信息 在此处

这些环境变量可以传递到 docker-compose.yml 中的 Docker 容器。以下示例将在主机上或 docker-compose.yml 同目录下的 .env 文件中设置了必要的环境变量 GITEA__mailer__FROMGITEA__mailer__HOSTGITEA__mailer__PASSWD 时启用 SMTP 邮件服务器。

还可以通过定义以下形式的环境变量来使用文件内容设置或覆盖设置:GITEA__section_name__KEY_NAME__FILE,该变量指向一个文件。

...
services:
server:
environment:
- GITEA__mailer__ENABLED=true
- GITEA__mailer__FROM=${GITEA__mailer__FROM:?GITEA__mailer__FROM not set}
- GITEA__mailer__PROTOCOL=smtp
- GITEA__mailer__HOST=${GITEA__mailer__HOST:?GITEA__mailer__HOST not set}
- GITEA__mailer__IS_TLS_ENABLED=true
- GITEA__mailer__USER=${GITEA__mailer__USER:-apikey}
- 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 以使用 docker exec 将命令转发到容器内的 sh 可执行文件。

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

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

请注意,上面 docker 命令中的 gitea 是容器的名称。如果您将其命名为其他名称,请务必更改它。

您还应该确保已正确设置 shell 包装器的权限

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

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

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

现在所有 SSH 命令都已转发到容器,您需要在主机上设置 SSH 身份验证。这可以通过利用 SSH AuthorizedKeysCommand 将密钥与 Gitea 接受的密钥进行匹配来完成。在主机上的 /etc/ssh/sshd_config 中添加以下块

Match User git
AuthorizedKeysCommandUser git
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 服务器

sudo systemctl restart sshd

注释

这实际上并没有使用 docker SSH - 它只是使用了它周围的命令。理论上,您无需运行内部 SSH 服务器。