code.gitea.io/gitea@v1.22.3/docs/content/installation/with-docker-rootless.zh-cn.md (about)

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