如何使用 Docker 在 Ubuntu 上安装 Gitea

介绍

在开发软件时,重要的是能够以高效和可追溯的方式管理源代码。源代码管理(SCM)系统是提供一个高效和灵活的流程,以便在任何规模的项目上与任何数量的开发者一起工作。多年来,从CVS到SubVersion、Perforce到Mercurial,SCM软件的许多不同部件已经存在,但当前的行业领导者是Git(https://git-scm.com),随着GitHub和GitLab等网站的普及,该领域的增长显著。

然而,随着这些服务的免费帐户面向公共、开源存储库,在私人或专有软件上工作的能力会给开发人员带来成本。

为此,在过去的几年中,开发了几种自托解决方案,如Gogs(https://gogs.io),Gitea(https://gitea.com)和GitLab(https://gitlab.com)。本教程专注于设置一个更受欢迎的解决方案,Gitea,以便您在整个生命周期内托管私人存储库并管理自己的项目。Gitea小,自托,轻量化,使其成为一个快速的部署过程,而不会破坏硬件要求的银行。

前提条件

在开始本教程之前,你应该有以下内容:

步骤 1 – 创建 Git 用户

Gitea 和许多源代码存储库一样,使用 SSH 来访问远程存储库,这允许用户通过在 Gitea 内部管理他们的 SSH 密钥来控制对他们的代码的访问。

首先,在主机上创建将接受这些连接的用户:

1sudo adduser --system --shell /bin/bash --gecos 'Git Version Control' --group --disabled-password --home /home/git git

在此命令中,您创建一个系统用户,该用户使用 bash作为其壳,但没有登录密码。

此命令将输出一些关于它刚刚创建的用户的信息:

1[secondary_label Output]
2Adding system user `git' (UID 112) ...
3Adding new group `git' (GID 119) ...
4Adding new user `git' (UID 112) with group `git' ...
5Creating home directory `/home/git' …

请注意这里提供的UID和GID值(在这种情况下,UID为112和GID为119),因为它们将在未来一步中使用。

步骤 2:安装 Gitea Docker 图像

Gitea在全球Docker存储库中有可用的图像,这意味着使用Docker Compose,您可以安装和运行该图像作为一个服务,而不需要额外工作。

为了旋转Gitea容器,您将使用Docker Compose,这是设置环境的声明工具。

首先,创建一个目录来托管您的服务,然后输入它:

1mkdir ~/gitea
2cd ~/gitea

一旦在那里,使用您喜爱的文本编辑器创建一个名为docker-compose.yml的文件. 下面的示例使用nano。本文件将包含将作为您的Gitea安装的一部分运行的容器的描述:

1nano docker-compose.yml

将以下内容添加到新文件中:

 1[label ~/gitea/docker-compose.yml]
 2version: "3"
 3
 4networks:
 5  gitea:
 6    external: false
 7
 8services:
 9  server:
10    image: gitea/gitea:1.16.5
11    container_name: gitea
12    environment:
13      - USER_UID=UID_from_step_1
14      - USER_GID=GID_from_step_1
15    restart: always
16    networks:
17      - gitea
18    volumes:
19      - ./gitea:/data
20      - /home/git/.ssh/:/data/git/.ssh
21      - /etc/timezone:/etc/timezone:ro
22      - /etc/localtime:/etc/localtime:ro
23    ports:
24      - "127.0.0.1:3000:3000"
25      - "127.0.0.1:2222:22"

让我们通过这个文件做什么:

*'版本:"3"':这让多克编集这个配置文件的哪个版本. *'网络':本节宣布我们收集容器的联网设置. 在这种情况下,创建了 " gitea " 网络,但不对外曝光。 - " 图像:gitea/gitea:1.1.6.5 " :这说明我们将使用Gitea版本1.16.5;然而,在结肠后,您可以更改数值,以指定其他版本,无论是 " :1 " ,还是 " :latst " 或 ":dev " 等主要版本。 在这种情况下,我们正在使用步骤1中`aduser'命令的输出中提供的UID和GID来指定环境用户和组ID。

  • `重新开始:永远':此行指示 如果容器下沉,Docker将永远重新启动;无论是集装箱本身下沉还是主机下沉;基本上,Gitea将从启动起.
  • " 网络 " :这说明Gitea服务将可进入上面提到的网络并可在其中访问。 这些是Gitea存储其储存库和相关数据的地点。 目前,这已映入当前目录中名为 " gitea " 的文件夹。 容器不存在时, Docker 会创建此文件夹 。 .sh'文件夹稍后将在步骤6中进一步说明。 -/etc/timezone'和/etc/localtime':这两个文件载有关于主机上的时区和时间的信息。 通过将这些直接映射到容器中作为只读文件(定义中的最后:ro'部分具体说明),容器将拥有与主机相同的信息. -ports':Gitea在两个端口上监听连接. 它在端口3000'上监听HTTP连接,为源代码寄存器的网络界面服务,在端口22'上监听SSH连接. 在这种情况下,您通过将HTTP连接的3000端口绘制到同一号码,您正在将Gitea集装箱上的端口从通常的222222`端口绘制图来避免港口堵塞。 在第六步中, 您会设置一个 SSH shim , 以便在接获请求时引导交通前往 Gitea 。

<$>[注] ** 注:** 这是Gitea的Docker Compose文件的最小示例。 可以包括几个其他选项,例如使用MySQL或PostGreSQL作为备份数据库或用于存储的命名量。 此最小设置使用SQLite作为备份数据库和使用名为gitea的目录进行存储。 您可以在 Gitea的文档中阅读更多有关这些选项的内容。

如果您使用nano来编辑文件,您可以通过按CTRL + X,Y,然后按ENTER来进行编辑。

有了此文件,您可以使用 Docker Compose 将容器带上:

1docker-compose up

此命令将拉下图像,启动 Gitea 容器,并以以下方式返回输出:

 1[secondary_label Output]
 2[+] Running 9/9
 3  server Pulled 8.2s
 4    e1096b72685a Pull complete 1.4s
 5    ac9df86bb932 Pull complete 3.3s
 6    6d34ed99b58a Pull complete 3.4s
 7    a8913d040fab Pull complete 3.6s
 8    a5d3a72a2366 Pull complete 5.3s
 9    1f0dcaae29cc Pull complete 5.6s
10    f284bcea5adb Pull complete 7.3s
11    0f09c34c97e3 Pull complete 7.5s
12[+] Running 2/2
13  Network gitea_gitea Created 0.2s
14  Container gitea Created 0.2s
15Attaching to gitea
16gitea  | Generating /data/ssh/ssh_host_ed25519_key...
17gitea  | Generating /data/ssh/ssh_host_rsa_key...
18gitea  | Generating /data/ssh/ssh_host_dsa_key...
19gitea  | Generating /data/ssh/ssh_host_ecdsa_key...
20gitea  | Server listening on :: port 22.
21gitea  | Server listening on 0.0.0.0 port 22.
22gitea  | 2022/03/31 17:26:21 cmd/web.go:102:runWeb() [I] Starting Gitea on PID: 14
23gitea  | 2022/03/31 17:26:21 ...s/install/setting.go:21:PreloadSettings() [I] AppPath: /usr/local/bin/gitea
24gitea  | 2022/03/31 17:26:21 ...s/install/setting.go:22:PreloadSettings() [I] AppWorkPath: /app/gitea
25gitea  | 2022/03/31 17:26:21 ...s/install/setting.go:23:PreloadSettings() [I] Custom path: /data/gitea
26gitea  | 2022/03/31 17:26:21 ...s/install/setting.go:24:PreloadSettings() [I] Log path: /data/gitea/log
27gitea  | 2022/03/31 17:26:21 ...s/install/setting.go:25:PreloadSettings() [I] Configuration file: /data/gitea/conf/app.ini
28gitea  | 2022/03/31 17:26:21 ...s/install/setting.go:26:PreloadSettings() [I] Prepare to run install page
29gitea  | 2022/03/31 17:26:21 ...s/install/setting.go:29:PreloadSettings() [I] SQLite3 is supported
30gitea  | 2022/03/31 17:26:21 cmd/web.go:208:listen() [I] Listen: http://0.0.0.0:3000
31gitea  | 2022/03/31 17:26:21 cmd/web.go:212:listen() [I] AppURL(ROOT_URL): http://localhost:3000/

然而,这会让容器在前沿运行,一旦您用Ctrl + C退出或失去连接,它就会停止运行,为了使容器作为一个单独的过程在后台运行,您可以将-d标志附加到组成命令:

1docker-compose up -d

您将被通知当容器开始,然后返回您的壳。

步骤 3 — 安装 Nginx 作为反向代理

运行像Gitea这样的Web服务背后的反向代理程序是常见的做法,因为现代服务器软件如Apache或Nginx可以更容易地处理一个机器上的多个服务,平衡多个服务器的负载,并处理SSL。

对于本教程的目的,我们将使用 Nginx. 首先,更新您的主机上的包列表:

1sudo apt update

接下来,使用apt来安装 Nginx:

1sudo apt install nginx

现在,当您使用ufw防火墙时,您需要允许访问这些端口:

1sudo ufw allow "Nginx Full"

一旦安装,您应该能够访问您的浏览器中的服务器,访问http://your_domain.这将带您到一个非常简单的页面欢迎您到 Nginx。

在此时,您需要创建一个反向代理入口,将通过 Nginx 导入的流量导向到在 Docker 中运行的 Gitea 实例。 使用您喜爱的文本编辑器在 Nginx 可用网站 目录中创建一个新文件。

1sudo nano /etc/nginx/sites-available/gitea

在此文件中,设置一个新的服务器块,请求对您的 Gitea 实例进行 / 代理:

 1[label /etc/nginx/sites-available/gitea]
 2server {
 3    # Listen for requests on your domain/IP address.
 4    server_name your_domain;
 5
 6    root /var/www/html;
 7
 8    location / {
 9        # Proxy all requests to Gitea running on port 3000
10        proxy_pass http://localhost:3000;
11
12        # Pass on information about the requests to the proxied service using headers
13        proxy_set_header HOST $host;
14        proxy_set_header X-Forwarded-Proto $scheme;
15        proxy_set_header X-Real-IP $remote_addr;
16        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
17    }
18}

一旦你完成了编辑文件,保存并关闭它。

<$>[注] 注: 有关了解这些指令内发生的事情的更多信息,请参阅 理解 Nginx HTTP 代理、负载平衡、缓存和缓存 教程。

Nginx 会根据这些文件是否存在于其网站启用目录来确定它实际上将服务的网站。 通过象征链接来管理,指向网站可用目录中的文件。

1sudo ln -s /etc/nginx/sites-available/gitea /etc/nginx/sites-enabled/gitea

在重新启动 Nginx 以使您的更改生动之前,您应该让 Nginx 自己通过测试其配置来检查这些更改是否有效。

1sudo nginx -t

如果一切顺利,此命令将返回如下输出:

1[secondary_label Output]
2nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
3nginx: configuration file /etc/nginx/nginx.conf test is successful

如果有任何问题,它会告诉你它们是什么以及在哪里。

当您准备好进行此更改时,请重新启动 Nginx 系统服务:

1sudo systemctl restart nginx

现在,当您在浏览器中访问http://your_domain,您应该在Gitea的初始设置页面上为您准备填写。

步骤 4 – 安装 Certbot 和设置 TLS 证书

由于Certbot和Let's Encrypt免费证书授权,将TLS加密添加到您的Gitea安装应用程序只需要两个命令。

首先,安装 Certbot 及其 Nginx 插件:

1sudo apt install certbot python3-certbot-nginx

接下来,在--nginx模式下运行certbot,并指定您在 Nginxserver_name配置指令中使用的相同域:

1sudo certbot --nginx -d your_domain_here

您将被要求同意 Let's Encrypt 服务条款,并输入电子邮件地址。

之后,您将被问及是否要将所有HTTP流量重定向到HTTPS。

之后,Let’s Encrypt 将确认您的请求,Certbot 将下载您的证书:

 1[secondary_label Output]
 2Congratulations! You have successfully enabled https://your_domain
 3
 4You should test your configuration at:
 5https://www.ssllabs.com/ssltest/analyze.html?d=your_domain
 6- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 7
 8IMPORTANT NOTES:
 9 - Congratulations! Your certificate and chain have been saved at:
10   /etc/letsencrypt/live/your_domain/fullchain.pem
11   Your key file has been saved at:
12   /etc/letsencrypt/live/your_domain/privkey.pem
13   Your cert will expire on 2022-05-09. To obtain a new or tweaked
14   version of this certificate in the future, simply run certbot again
15   with the "certonly" option. To non-interactively renew *all* of
16   your certificates, run "certbot renew"
17 - Your account credentials have been saved in your Certbot
18   configuration directory at /etc/letsencrypt. You should make a
19   secure backup of this folder now. This configuration directory will
20   also contain certificates and private keys obtained by Certbot so
21   making regular backups of this folder is ideal.
22 - If you like Certbot, please consider supporting our work by:
23
24   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
25   Donating to EFF:                    https://eff.org/donate-le

Certbot 将自动重新加载 Nginx 与新的配置和证书. 在您的浏览器中重新加载您的网站,如果您选择了重定向选项,它应该自动切换到 HTTPS。

您的网站现在是安全的,它是安全的继续基于Web的设置步骤。

您可以找到有关使用 Let's Encrypt 保护域的更多信息,请参阅 How to Secure Nginx with Let's Encrypt on Ubuntu 20.04 教程。

步骤 5 — 配置 Gitea 并添加第一个用户

现在您可以继续配置 Gitea 并创建第一个管理员用户。 通过在浏览器中打开 https://your_domain 来访问您的 Gitea 实例。 在最初的 Gitea 配置屏幕上,服务将有几个选项:

Gitea setup screen

其中一些,如网站标题,取决于您的特定用例,但对于本教程的目的,您需要更改以下内容:

  • 服务器域: 您在步骤 3 中设置的服务器域 Gitea Base URL: 您将在浏览器中使用的完整URL,包括协议。

当您保存配置更改时,您将被引导到Gitea登录页面。

<$>[注] 注: 配置已保存后,Gitea 服务将重新启动.由于可能需要几秒钟,您可能会遇到一个 Nginx 错误,表示 ** 502 Bad Gateway** . 如果您遇到此错误,请等待几秒钟,然后重新启动页面。

因为你还没有用户,你将需要创建一个,首先. 点击 需要帐户? 注册现在 链接下面的登录表格注册一个新的用户. 作为系统上的第一个用户,这个用户将被创建为管理员. 如果你设置电子邮件设置在配置屏幕上,你可能需要先验证你的帐户。

一旦您登录为该用户,点击页面的右上角的用户图标,然后从下滑菜单中点击 **网站管理 ** 将带您到一个页面,您将能够运行维护工作,管理用户帐户和组织,并进一步配置Gitea。

创建测试存储库

为了测试Gitea,无论是在Web界面上还是使用Git本身,请创建一个测试存储库,随时可以稍后删除该存储库。

点击页面的右上角的 + 标记,然后从下滑菜单中点击 ** +新存储库** ,在这里,您将看到一个屏幕,允许您命名和自定义您的存储库,如其描述,设置,如是否私有,以及任何默认内容,如READMEgitoreign文件。

一旦你点击创建存储库,你将有一个新的存储库来玩。

步骤 6 – 配置 SSH Shim

该过程的最后一步是用 SSH shim 准备主机. 由于 Gitea 正在运行在 Docker 容器中,它无法在默认端口 22 上接受 SSH 连接,因为这会与主机发生冲突。 在您上面创建的 docker-compose.yml 文件中,Docker 被指示将主机上的一个端口绘制到容器上的 22 端口,以便它接受 SSH 连接到 2222 端口。

要考虑到这一点,您需要创建一个SSH shim,它将将SSH连接传递给主机上的 git 用户到容器上。在组合文件中,您还指定了容器中的用户将有一个用户和组 ID 1000,在Gitea配置屏幕上,您告诉服务使用用户名为 ** git** 。

创建 Git 用户及其 SSH 密钥

接下来,您将需要为用户创建一个SSH密钥,这只会在下面的步骤中使用,不会与主机以外的任何人共享。

1sudo -u git ssh-keygen -t rsa -b 4096 -C "Gitea Host Key"

此命令使用sudo来创建一个 SSH 密钥,作为您在上面创建的用户. 在这种情况下,密钥将是一个 4096 位 RSA 密钥. 您将被问到一系列问题,如您想为密钥创建什么密码,以及如何命名密钥文件。

<$>[警告] 警告 :如果您在密钥上设置密码,您将无法使用Shim。

您需要确保 Gitea 容器中的用户将接受此密钥,您可以通过将其添加到 .ssh/authorized_keys 文件中:

1sudo -u git cat /home/git/.ssh/id_rsa.pub | sudo -u git tee -a /home/git/.ssh/authorized_keys
2sudo -u git chmod 600 /home/git/.ssh/authorized_keys

这些命令都与 shim 一起工作,因为主机上的 目录 `/home/git/.ssh 作为容器上的卷,这意味着内容在它们之间共享。

创建 SSH Shim 脚本

shim 的最后一步是在主机上创建一个 stub gitea 命令,这就是 git 命令可以在 SSH 上工作:当建立 SSH 连接时,将运行默认命令。

对于这个脚本,使用cat来写入文件/usr/local/bin/gitea:

1cat <<"EOF" | sudo tee /usr/local/bin/gitea
2#!/bin/sh
3ssh -p 2222 -o StrictHostKeyChecking=no [email protected] "SSH_ORIGINAL_COMMAND=\"$SSH_ORIGINAL_COMMAND\" $0 $@"
4EOF

本脚本中的命令将 SSH 传送到 Gitea Docker 容器中,传递了由 'git' 使用的原始命令的内容。

最后,确保脚本是可执行的:

1sudo chmod +x /usr/local/bin/gitea

测试 Git SSH 连接

您可以通过向您的 Gitea 用户添加您的 SSH 密钥来测试从 Gitea 存储库中抽取和推到 Git 存储库。

这通常生活在一个名为~/.ssh/id_rsa.pub的文件中,取决于您在创建密钥时使用的算法:

1[environment local]
2cat ~/.ssh/id_rsa.pub

<$>[注] 注: 如果您需要首次创建 SSH 密钥,您可以学习如何使用本教程(如何在 Ubuntu 20.04 上设置 SSH 密钥)。

复制此命令的输出。

在 Gitea 中,点击您的用户图标在右上角,选择 设置 . 在设置页面上,将有一系列的卡在顶部. 点击 ** SSH/GPG 密钥** ,然后按一下 ** 添加密钥** 按钮旁边 ** 管理 SSH 密钥** . 将您的密钥粘贴到表单中的大文本区域,然后点击其下的 ** 添加密钥** 按钮。

现在,导航到您在步骤 3 中创建的测试存储库,并复制所提供的 SSH URL。

1[environment local]
2git clone git@your_domain:username/test

这将使用SSH来克隆存储库. 如果您在SSH密钥上设置了密码,您将被要求提供。

移动到该目录,创建一个新的文件:

1[environment local]
2cd test
3touch just_testing

接下来,将其添加到您的阶段变更中:

1[environment local]
2git add just_testing

最后,把这个文件放进去:

1[environment local]
2git commit -am "Just testing pushing over SSH!"

现在,您应该能够将更改推到远程存储库:

1[environment local]
2git push origin master

当您在浏览器中更新页面时,您的新文件将出现在存储库中。

结论

您已使用 Docker 设置了 Gitea 服务,以便自行托管您的源代码存储库. 从这里开始,您将能够在公共和私人存储库中工作,使用熟悉的工作流程,如提取请求代码审查和组织组织的项目。 Gitea 还与各种连续集成和部署(CI/CD)工具(如 Drone、Jenkins 和 GoCD)一起工作。此外,使用 Docker 卷,您可以将存储空间扩展到网络或区块存储上的 Git LFS (大文件存储) 内容。

Published At
Categories with 技术
comments powered by Disqus