如何在 Rocky Linux 8 上使用 Docker 安装 Gitea 代码托管
在此页
- 先决条件
- 第 1 步 - 配置防火墙
- 第 2 步 - 安装 Docker
- 第 3 步 - 安装 Docker Compose
- 第 4 步 - 配置和安装 Gitea
- 配置系统时区
- 创建 Gitea 目录
- 配置 Gitea Docker 组合文件
- 自定义您的 Gitea 安装
- 安装 Gitea
Gitea 是一种类似于 Github、Bitbucket 和 Gitlab 的自托管代码托管服务。它是用 Go 语言编写的,可以安装在多种操作系统上,包括 Linux、macOS、Windows 以及 amd64、i386、ARM 等架构。作为一个轻量级的应用程序,它可以以最低的硬件要求安装。它包括存储库文件编辑器、OpenSSH 服务器、问题跟踪、拉取请求、用户管理、通知、内置 wiki、LFS 支持、Git 挂钩等等。
在本文中,您将学习在 Rocky Linux 8 服务器上使用 Docker 安装 Gitea。
先决条件
-
A Server running Rocky Linux 8.5.
-
A non-root user with sudo privileges.
-
Disable SELinux.
-
Update everything.
$ sudo dnf update
-
Install essential packages.
$ sudo dnf install yum-utils nano curl
-
A fully qualified domain name(FQDN) pointing to the server like
gitea.example.com
.
第 1 步 - 配置防火墙
第一步是配置防火墙。 Rocky Linux 使用 Firewalld 防火墙。检查防火墙状态。
$ sudo firewall-cmd --state running
防火墙适用于不同的区域,公共区域是我们将使用的默认区域。列出防火墙上所有活动的服务和端口。
$ sudo firewall-cmd --permanent --list-services
它应该显示以下输出。
cockpit dhcpv6-client ssh
允许 HTTP 和 HTTPS 端口。
$ sudo firewall-cmd --permanent --add-service=http $ sudo firewall-cmd --permanent --add-service=https
为 SSH 打开端口 2221。
$ sudo firewall-cmd --permanent --add-port=2221/tcp
列出防火墙启用的所有服务。
$ sudo firewall-cmd --permanent --list-all
您应该会看到类似的输出。
public target: default icmp-block-inversion: no interfaces: sources: services: cockpit dhcpv6-client http https ssh ports: 2221/tcp protocols: forward: no masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
重新加载防火墙以启用更改。
$ sudo firewall-cmd --reload
第 2 步 - 安装 Docker
Rocky Linux 附带旧版本的 Docker。要安装最新版本,首先,安装官方 Docker 存储库。
$ sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo
安装最新版本的 Docker。
$ sudo dnf install docker-ce docker-ce-cli containerd.io
启用并运行 Docker 守护进程。
$ sudo systemctl enable docker --now
验证它是否正在运行。
? docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled) Active: active (running) since Sat 2022-04-02 13:26:08 UTC; 2s ago Docs: https://docs.docker.com Main PID: 21152 (dockerd) Tasks: 7 Memory: 30.9M CGroup: /system.slice/docker.service ??21152 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock ...
默认情况下,Docker 需要 root 权限。如果您想避免每次运行
docker
命令时都使用sudo
,请将您的用户名添加到docker
组。$ sudo usermod -aG docker $(whoami)
您需要注销服务器并以同一用户身份重新登录才能启用此更改。
第 3 步 - 安装 Docker Compose
下载 Docker Compose 的最新稳定版本。
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
将可执行权限应用于 Docker Compose 二进制文件。
$ sudo chmod +x /usr/local/bin/docker-compose
测试安装。
$ docker-compose --version docker-compose version 1.29.2, build 5becea4c
安装 Docker-compose Bash Completion 脚本。
$ sudo curl \ -L https://raw.githubusercontent.com/docker/compose/1.29.2/contrib/completion/bash/docker-compose \ -o /etc/bash_completion.d/docker-compose
重新加载您的配置文件设置以使 bash-completion 工作。
$ source ~/.bashrc
第 4 步 - 配置和安装 Gitea
配置系统时区
您可以通过以下命令检查系统当前时区。
$ timedatectl Local time: Mon 2022-05-02 06:38:36 UTC Universal time: Mon 2022-05-02 06:38:36 UTC RTC time: Mon 2022-05-02 06:38:36 Time zone: Etc/UTC (UTC, +0000) System clock synchronized: yes NTP service: active RTC in local TZ: no
您可以看到系统设置为 GMT 或 UTC 时区。如果您居住在具有不同时区的区域或想要更改时区,请使用以下命令来执行此操作。
$ sudo timedatectl set-timezone Asia/Kolkata
再次检查时区。
$ timedatectl Local time: Mon 2022-05-02 12:09:23 IST Universal time: Mon 2022-05-02 06:39:23 UTC RTC time: Mon 2022-05-02 06:39:22 Time zone: Asia/Kolkata (IST, +0530) System clock synchronized: yes NTP service: active RTC in local TZ: no
您可以看到时区已更新为 IST,即 GMT+5:30。
创建 Gitea 目录
为 Gitea 创建目录。
$ mkdir ~/gitea-docker
切换到 Gitea 目录。
$ cd ~/gitea-docker
创建用于存储 Gitea 数据和 PostgreSQL 数据库的目录。
$ mkdir {gitea,postgres}
配置 Gitea Docker 组合文件
获取当前登录用户的 UID(用户标识符)和 GID(组标识符)值。第一个命令生成 UID,而第二个命令生成 GID。复制这两个值,因为配置 Docker 组合文件需要它们。
$ echo $(id -u) 1000 $ echo $(id -g) 1000
创建并打开 Docker Compose 文件进行编辑。
$ nano docker-compose.yml
将以下代码粘贴到其中。粘贴之前生成的 UID 和 GID 值。
version: "3" networks: gitea: external: false services: server: image: gitea/gitea:1.16.6 container_name: gitea environment: - USER_UID=1000 - USER_GID=1000 - GITEA__database__DB_TYPE=postgres - GITEA__database__HOST=db:5432 - GITEA__database__NAME=gitea - GITEA__database__USER=gitea - GITEA__database__PASSWD=gitea restart: always networks: - gitea volumes: - ./gitea:/data - /etc/timezone:/etc/timezone:ro - /etc/localtime:/etc/localtime:ro ports: - "3000:3000" - "2221:22" depends_on: - db db: image: postgres:14 restart: always environment: - POSTGRES_USER=gitea - POSTGRES_PASSWORD=gitea - POSTGRES_DB=gitea networks: - gitea volumes: - ./postgres:/var/lib/postgresql/data
通过按 Ctrl + X 并在出现提示时输入 Y 来保存文件。
上面的 Docker Compose 文件部署了两个容器——一个用于 Gitea,一个用于 PostgreSQL。我们添加了一些环境变量来配置数据库详细信息。为了将 PostgreSQL 数据库连接到 Gitea 容器,我们在文件中将主机指定为 PostgreSQL 服务的名称。
端口参数
\3000:3000\
和\2221:22\
指定端口映射,其中左侧端口表示主机端口右边的港口表示集装箱港口。 Gitea 的 web 服务使用端口 3000,这也是我们向服务器公开的端口。对于 SSH,我们的系统已经使用端口 22 进行日志记录。因此,我们指定一个自定义端口来执行 SSH 操作。在我们的例子中,我们使用端口 2221。这个端口也需要通过防火墙打开,我们已经在本教程的第 1 步中打开了。Gitea 和 PostgreSQL 容器都通过名为
gitea
的通用内部 Docker 网络连接。当您开始安装 Docker 时,卷挂载将在当前文件夹中自动创建gitea
和postgres
目录。撰写文件中指定的用户 ID 是 Gitea 容器将用于创建gitea
目录的用户 ID。另一方面,PostgreSQL 容器将由用户systemd-coredump
管理,这是默认行为。您可以更改该行为,但这不是必需的。自定义您的 Gitea 安装
您可以通过将 app.ini 文件添加到
~/gitea-docker/gitea/gitea/conf
目录来自定义 Gitea 安装。安装后,可以从容器内部的/data/gitea/conf/app.ini
位置编辑此文件。您可以使用 Giteas Github 存储库中的示例 ini 文件作为参考。安装 Gitea
运行以下命令以启动 Gitea 容器。
$ docker-compose up -d
检查容器的状态以确保它们正常运行。
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bd06e370c46b gitea/gitea:1.16.6 "/usr/bin/entrypoint…" 19 minutes ago Up 19 minutes 0.0.0.0:3000->3000/tcp, :::3000->3000/tcp, 0.0.0.0:2221->22/tcp, :::2221->22/tcp gitea 3fc6c4bce810 postgres:14 "docker-entrypoint.s…" 19 minutes ago Up 19 minutes 5432/tcp gitea_db_1
您还可以使用以下命令检查状态。
$ docker-compose ps Name Command State Ports ------------------------------------------------------------------------------------------------------------------------------------ gitea /usr/bin/entrypoint /bin/s ... Up 0.0.0.0:2221->22/tcp,:::2221->22/tcp, 0.0.0.0:3000->3000/tcp,:::3000->3000/tcp gitea_db_1 docker-entrypoint.sh postgres Up 5432/tcp
第 5 步 - 安装 SSL
要使用 Lets Encrypt 安装 SSL 证书,我们需要安装 Certbot 工具。
首先,您需要下载并安装 EPEL 存储库。
$ sudo dnf install epel-release
运行以下命令来安装 Certbot。
$ sudo dnf install certbot
生成 SSL 证书。
$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m -d gitea.example.com
上面的命令会将证书下载到服务器上的
/etc/letsencrypt/live/gitea.example.com
目录。生成 Diffie-Hellman 组证书。
$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096
为 Lets Encrypt 自动更新创建一个挑战网站根目录。
$ sudo mkdir -p /var/lib/letsencrypt
创建 Cron 作业以更新 SSL。它将每天运行以检查证书并在需要时更新证书。为此,首先,创建文件
/etc/cron.daily/certbot-renew
并打开它进行编辑。$ sudo nano /etc/cron.daily/certbot-renew
粘贴以下代码。
#!/bin/sh certbot renew --cert-name gitea.example.com --webroot -w /var/lib/letsencrypt/ --post-hook "systemctl reload nginx"
通过按 Ctrl + X 并在出现提示时输入 Y 来保存文件。
更改任务文件的权限以使其可执行。
$ sudo chmod +x /etc/cron.daily/certbot-renew
第 6 步 - 安装 Nginx
我们将安装最新版本的 Nginx。创建并打开文件
/etc/yum.repos.d/nginx.repo
进行编辑。$ sudo nano /etc/yum.repos.d/nginx.repo
在其中粘贴以下行。
[nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true [nginx-mainline] name=nginx mainline repo baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/ gpgcheck=1 enabled=0 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true
通过按 Ctrl + X 并在出现提示时输入 Y 来保存文件。
安装 Nginx。
$ sudo dnf install nginx
验证安装。
$ nginx -v nginx version: nginx/1.20.2
启用并启动 Nginx 服务。
$ sudo systemctl enable nginx --now
创建并打开文件
/etc/nginx/conf.d/gitea.conf
进行编辑。$ sudo nano /etc/nginx/conf.d/gitea.conf
将以下代码粘贴到其中。
# Redirect all non-encrypted to encrypted server { listen 80; listen [::]:80; server_name gitea.example.com; return 301 https://$host$request_uri; } server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name gitea.example.com; ssl_certificate /etc/letsencrypt/live/gitea.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/gitea.example.com/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/live/gitea.example.com/chain.pem; ssl_session_timeout 1d; ssl_session_cache shared:MozSSL:10m; ssl_session_tickets off; ssl_stapling on; ssl_stapling_verify on; ssl_dhparam /etc/ssl/certs/dhparam.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; access_log /var/log/nginx/gitea.example.com.access.log main; error_log /var/log/nginx/gitea.example.com.error.log; location / { client_max_body_size 100M; proxy_pass http://localhost:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
完成后,按 Ctrl + X 并在出现提示时输入 Y 来保存文件。上面的配置允许 Nginx 作为代理服务器并绑定到 localhost 上的 3000 端口。要为 Git LFS 启用大文件上传,您可以根据需要更改
client_max_body_size
变量的值。对于我们的教程,我们使用 100 MB 作为限制。打开文件
/etc/nginx/nginx.conf
进行编辑。$ sudo nano /etc/nginx/nginx.conf
在行
include /etc/nginx/conf.d/*.conf;
之前添加以下行。server_names_hash_bucket_size 64;
通过按 Ctrl + X 并在出现提示时输入 Y 来保存文件。
验证 Nginx 配置文件语法。
$ sudo nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
重新启动 Nginx 服务以启用新配置。
$ sudo systemctl restart nginx
第 7 步 - 访问和设置 Gitea
在浏览器中访问 URL
https://gitea.example.com
,将出现以下安装屏幕。大多数字段将根据 Docker 组合文件中的值预先填充。
输入
gitea.example.com
作为服务器域,输入https://gitea.example.com
作为 Gitea Base URL。将 SSH 服务器端口的值从 22 更改为 2221。保持其余设置不变。如果您想使用邮件功能,您可以添加您的 SMTP 服务器详细信息。展开页面的电子邮件设置部分并输入值,如屏幕截图所示。确保将您的 SMTP 端口包含在主机名中,如图所示。对于我们的教程,我们使用 Amazon SES 服务。您可以使用您选择的任何 SMTP 服务。
在安装之前,您还应该检查一些设置。要更改它们,请展开页面的服务器和第三方服务设置部分。
根据您的要求更改设置。我们启用了默认隐藏电子邮件地址选项以确保更好的隐私。如果您不希望人们注册帐户,请启用“禁用自注册”选项。
最后但同样重要的是,设置您的管理员帐户。展开页面的 Administrator Account Settings 部分并填写所需的值。
完成后单击 Install Gitea 按钮以完成安装。您将被重定向到 Gitea 仪表板。如果出于某种原因,您收到 502 错误,请刷新页面。
第 8 步 - 创建第一个存储库
让我们创建我们的第一个存储库。为此,请单击仪表板上的 + 号。
输入存储库详细信息。从下拉菜单中选择默认问题标签。为您的存储库选择适当的许可证。
选择存储库的默认分支。
满意后,单击创建存储库按钮以在 Gitea 安装上创建您的第一个存储库。您将被重定向到您的存储库主页。
第 9 步 - 设置 SSH
让我们设置 SSH 以与我们新创建的存储库一起使用。
对于我们的教程,我们将使用预装了 Ubuntu 的本地 PC。但是,这些命令应该可以在任何操作系统终端上运行而无需太多更改。
在本地 PC 上创建一个新的 SSH 密钥以与 Gitea 一起使用。
$ ssh-keygen -f ~/.ssh/gitea-demo -t rsa -b 4096 -C "HowtoForge Gitea Demo" -q -N "yourpassphrase"
在上面的命令中输入强密码代替占位符。这将在
~/.ssh/gitea-demo
位置创建一个 SSH 密钥。接下来,通过单击个人资料图像上的下拉菜单并选择“设置”选项,如图所示打开 Gitea 个人资料设置。
接下来,切换到页面上的 SSH/GPG Keys 选项卡。
为您的 SSH 密钥添加一个名称。回到本地PC的终端,运行以下命令输出Gitea的公钥。
$ cat ~/.ssh/gitea-demo.pub
复制生成的输出并将其粘贴回 Gitea 的 SSH 密钥页面上的内容框中。
单击“添加密钥”按钮以完成添加密钥。
返回本地 PC 并将 SSH 代理设置为保持活动状态 1 小时。
$ eval $(ssh-agent -t 3600)b
将新创建的 SSH 密钥添加到 SSH 代理。
$ ssh-add ~/.ssh/gitea-demo Enter passphrase for /home/navjot/.ssh/gitea-demo: Identity added: /home/navjot/.ssh/gitea-demo (HowtoForge Gitea Demo)
系统将提示您输入密码。
第 10 步 - 使用 SSH 克隆存储库
让我们使用 SSH 克隆新创建的存储库。再次访问存储库页面并在选择 SSH 选项后复制 SSH URL。
它应该如下所示。
ssh://:2221/navjot/howtoforge.git
在本地 PC 上运行以下命令以使用 SSH 克隆存储库。
$ git clone ssh://:2221/navjot/howtoforge.git Cloning into 'howtoforge'... The authenticity of host '[gitea.example.com]:2221 ([209.23.11.75]:2221)' can't be established. ECDSA key fingerprint is SHA256:sN0N4OkpChwuR00xpGZU1mGJrp7ktwHRC7uxGP7Nh08. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added '[gitea.example.com]:2221,[209.23.11.75]:2221' (ECDSA) to the list of known hosts. remote: Enumerating objects: 4, done. remote: Counting objects: 100% (4/4), done. remote: Compressing objects: 100% (3/3), done. remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 0 Receiving objects: 100% (4/4), done.
系统将提示您添加主机凭据。输入
yes
以继续克隆存储库。您将在系统上看到克隆的存储库。
$ ls howtoforge
切换到目录。
$ cd howtoforge
检查新克隆的存储库的 Git 状态。为此,您应该在本地 PC 上安装 Git。
$ git status On branch master Your branch is up to date with 'origin/master'. nothing to commit, working tree clean
这表明 SSH 运行良好。
第 11 步 - 测试第一次提交
现在我们已经建立了我们的第一个存储库,是时候进行一些更改并将它们提交回来了。
让我们更新
README.md
文件。在您的本地 PC 上,打开自述文件进行编辑。$ nano README.md
编辑文件,完成后按 Ctrl + X 并在出现提示时输入 Y 来保存文件。
再次检查 Git 状态。
$ git status On branch master Your branch is up to date with 'origin/master'. Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) modified: README.md no changes added to commit (use "git add" and/or "git commit -a")
这表明 Readme 文件已被编辑但未提交。添加文件以准备提交。
$ git add README.md
提交文件。
$ git commit -m "Update the Readme file for Gitea tutorial." [master 5e9b039] Update the Readme file for Gitea tutorial. 1 file changed, 3 insertions(+), 1 deletion(-)
将文件推送到您的 Gitea 服务器。
$ git push origin master Enumerating objects: 5, done. Counting objects: 100% (5/5), done. Delta compression using up to 4 threads Compressing objects: 100% (3/3), done. Writing objects: 100% (3/3), 392 bytes | 392.00 KiB/s, done. Total 3 (delta 0), reused 0 (delta 0) remote: . Processing 1 references remote: Processed 1 references in total To ssh://gitea.example.com:2221/navjot/howtoforge.git a61dfce..5e9b039 master -> master
要确认,请返回 Gitea 存储库页面。
您可以注意到自述文件已更新,并且还显示了最新的提交消息。要查看更改,请单击提交消息,您可以查看以下页面的差异。
这结束了我们对存储库的第一次提交。您可以开始为您的项目安装 Gitea。
第 12 步 - 升级 Gitea
升级 Gitea 是一个简单的过程。
关闭并移除现有容器。由于数据保存在主机上的容器之外,因此它会被保留。
$ cd ~/gitea-docker $ docker-compose down --remove-orphans
打开
docker-compose.yml
文件,修改Gitea容器的版本。接下来,拉取新的 Gitea 镜像。$ docker pull
启动新容器。
$ docker-compose up -d
检查状态。
$ docker ps
结论
我们的教程到此结束,我们在 Rocky Linux 服务器上使用 Docker 安装了 Gitea 代码托管服务。我们还安装了 Nginx 服务器作为代理,并使用 SSL 通过公共 URL 公开 Gitea。如果您有任何问题,请在下面的评论中发表。