如何将 Gitea 仓库存储在单独的卷上

介绍

Gitea 是基于版本控制系统 Git 的源代码存储库。虽然有几种自托管的解决方案可用,如 GitLab 和 Gogs,但 Gitea 具有轻量级的优势,这意味着它可以在相对较小的服务器上运行。

然而,拥有一个小服务器,特别是在 VPS 领域,通常意味着在空间上受到限制。幸运的是,许多托管提供商还提供额外的存储,以外部卷、块存储或网络文件存储(NFS)的形式。这为用户提供了在较小的 VPS 主机上为其应用程序节省资金而不牺牲存储空间的选择。

通过 Gitea 和决定源代码存储位置的能力,您可以确保您的项目和文件有空间来扩展。在本教程中,您将把外部存储卷挂载到一个挂载点,并确保 Gitea 从该卷中读取适当的信息。最终,您将拥有一个将存储库和其他重要信息存储在独立存储卷上的 Gitea 安装。

先决条件

在开始之前,您需要以下内容:

  • 根据我们的Ubuntu 20.04服务器初始设置指南,设置了一个非root用户并赋予了sudo权限,并启用了防火墙。
  • 外部存储卷,比如NFS或块存储卷。如果您想设置一个来自DigitalOcean的块存储卷,请按照我们的产品文档进行操作。
  • 在该服务器上安装了Gitea,并通过域名访问。本指南假设您已经按照我们在Ubuntu 20.04上安装Gitea的Docker教程中概述的步骤安装了Gitea。请注意,这将需要您在服务器上安装Docker和Docker Compose。您可以按照以下教程中的步骤安装这些工具:
    • 《在Ubuntu 20.04上安装和使用Docker的步骤1和2》
    • 《在Ubuntu 20.04上安装和使用Docker Compose的步骤1》

请注意,如果您使用的安装方法与这些先决条件中概述的不同,系统中某些文件和目录的名称和位置可能与本指南中示例提到的不同。但是,本教程中概述的概念应适用于任何 Gitea 安装。

步骤 1 — 挂载块存储卷

A volume can take many different forms. It could be an NFS volume, which is storage available on the network provided via a file share. Another possibility is that it takes the form of block storage via a service such as DigitalOcean’s Volumes. In both cases, storage is mounted on a system using the mount command.

这些卷将显示为存储在 /dev 中的设备文件。这些文件是内核与存储设备通信的方式;实际上不会使用这些文件来存储数据。为了能够在存储设备上存储文件,您需要使用 mount 命令将它们挂载起来。

首先,您需要创建一个挂载点 —— 也就是一个文件夹,该文件夹将与设备关联,因此存储在其中的数据最终会存储在该设备上。此类存储设备的挂载点通常位于 /mnt 目录中。

使用 mkdir 命令创建名为 gitea 的挂载点,就像创建普通目录一样:

  1. sudo mkdir /mnt/gitea

从这里,您可以将设备挂载到该目录,以便使用它访问该存储空间。 使用mount命令挂载设备:

  1. sudo mount -t ext4 -o defaults,noatime /dev/disk/by-id/your_disk_id /mnt/gitea

字符串ext4选项指定文件系统类型,在这种情况下是ext4,但根据您的卷的文件系统类型,它可能是xfsnfs之类的东西;要检查卷使用的类型,运行mount命令而不带任何选项:

  1. mount

这将为您提供每个已挂载文件系统的一行输出。 由于您刚刚挂载了您的,它可能是列表中的最后一个:

Output
. . . /dev/sda on /mnt/gitea type ext4 (rw,noatime,discard)

这显示文件系统类型是ext4

此命令将指定ID的设备挂载到/mnt/gitea-o选项指定挂载时使用的选项。 在这种情况下,您正在使用默认选项,允许挂载读/写文件系统,并且noatime选项指定内核不应更新设备上文件和目录的最后访问时间,以便更高效。

现在,您已经挂载了设备,只要系统运行,它就会保持挂载状态。 但是,一旦系统重新启动,它将不再挂载(尽管数据将保留在卷上),因此您需要告诉系统在启动时立即挂载卷,使用/etc/fstab(‘文件系统表’)文件。 该文件以制表符分隔的格式列出了可用文件系统及其挂载点。

使用echotee,在/etc/fstab的末尾添加新行:

  1. echo '/dev/disk/by-id/your_disk_id /mnt/gitea ext4 defaults,nofail,noatime 0 0' | sudo tee /etc/fstab

这个命令将字符串/dev/disk/by-uid/your_disk_id附加到fstab文件,并将其打印到屏幕上。与之前的mount命令一样,它会使用defaultsnofailnoatime选项将设备挂载到挂载点。

一旦你对/etc/fstab进行了更改,内核将在启动时挂载你的卷。

注意: Linux上的存储设备非常灵活,有各种不同类型,从网络文件系统(NFS)到普通的硬盘。要了解有关Linux中的块存储和设备的更多信息,你可以阅读我们的Linux存储术语和概念简介

步骤2 — 配置 Gitea 将数据存储在块存储卷上

Gitea将其所有存储库保存在一个中央位置。这包括所有用户和组织的存储库。除非另有配置,否则所有信息都保存在一个目录中。在默认安装中,此目录名为data。为了本教程的目的,我们将使用一个运行在 Docker 上的 Gitea 版本,就像上面链接的教程中一样。

首先,让我们了解一下这个数据目录包含的内容。您可以通过进入数据目录并运行 ls 命令来做到这一点。使用 -l 格式将会提供更多关于文件的信息:

  1. cd gitea
  2. ls -l

这将提供如下所示的列表:

Output
total 20 drwxr-xr-x 5 root root 4096 Jun 23 22:34 ./ drwxrwxr-x 3 sammy sammy 4096 Jun 26 22:35 ../ drwxr-xr-x 5 git git 4096 Jun 23 22:42 git/ drwxr-xr-x 12 git git 4096 Jun 26 22:35 gitea/ drwx------ 2 root root 4096 Jun 23 22:34 ssh/

让我们解析一下这个命令的输出。它每行列出一个文件或目录。在这种情况下,它列出了五个目录。. 的条目是一个特殊条目,表示当前目录,而 .. 表示上一级目录。这个输出显示当前目录的所有者是 root 用户,这在本例中是正确的,因为 Docker 以特权用户运行,而上一级目录的所有者是 sammy

git 目录对我们很重要,因为它包含了我们可能想要存储在单独卷上的所有存储库。列出目录的内容:

  1. ls -l git

这将提供目录的详细列表:

Output
total 24 drwxr-xr-x 5 git git 4096 Jun 23 22:42 ./ drwxr-xr-x 6 root root 4096 Jun 27 14:21 ../ -rw-r--r-- 1 git git 190 Jun 23 22:42 .gitconfig drwxr-xr-x 2 root root 4096 Jun 23 22:34 .ssh/ drwxr-xr-x 2 git git 4096 Jun 23 22:42 lfs/ drwxr-xr-x 5 git git 4096 Jun 30 20:03 repositories/

其中有两个值得注意的目录:包含由 Gitea 管理的 Git 存储库(按用户/组织排序)的 repositories 目录,以及包含 Git 大文件存储功能数据的 lfs 目录。gitea 目录包含 Gitea 在后台使用的信息,包括旧存储库的存档,以及包含用户和存储库信息的数据库,该信息被 Web 服务使用。ssh 目录包含 Gitea 使用的各种 SSH 密钥对。

考虑到存储在此目录中的所有信息都很重要,您会希望在我们附加的卷上包含整个目录的内容。

从这一点出发,有两条路径可供选择,取决于您是否正在使用新安装的 Gitea 并在安装过程中完成本教程。在第一条路径中,您将能够在完成安装之前指定位置,在第二条路径中,您将学习如何移动现有的安装。

设置新的 Gitea 安装

如果您正在开始全新的 Gitea 安装,您可以在配置过程中指定所有信息存储的位置。例如,如果您正在使用 Docker Compose 设置 Gitea,则可以将卷映射到附加的卷。

使用您喜欢的文本编辑器打开 docker-compose.yml 文件。以下示例使用 nano

  1. nano docker-compose.yml

打开文件后,搜索 compose 文件中的 volumes 条目,并修改冒号左侧的映射,以将其指向 Gitea 数据目录在您的块存储卷上的适当位置。

docker-compose.yml
...

    volumes:
      - /mnt/gitea:/data
      - /home/git/.ssh/:/data/git/.ssh
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro

...

设置完信息后,保存并关闭文件。如果您使用的是 nano,您可以按 CTRL + XY,然后 ENTER 完成。

警告:SSH 服务器在 Git 用户(在本例中是 git)的主目录中查找 .ssh 目录。该目录包含 Gitea 将使用的所有 SSH 密钥,因此不建议移动此 Docker 卷的挂载。为了在您的卷上备份此位置,最好使用另一个解决方案,如使用 cron 任务定期备份该目录。要了解更多信息,请查看此教程,了解使用 cron 管理定时任务的方法。

当您运行 docker-compose 并安装 Gitea 时,它将使用您的块存储卷来存储其数据。

如果您不使用 Docker 卷来管理数据位置,例如,如果您按照 Gitea 的这些说明在服务器上通过二进制版本安装 Gitea,则在您设置所有值并在浏览器中执行最终安装步骤之前,您需要修改配置文件中的位置(通常是 /etc/gitea/app.ini)。例如,您可能会将它们设置如下:

app.ini
...

# 如果您使用 SQLite 作为数据库,您需要更改此部分中的路径
# 变量
[database]
...
PATH = /mnt/gitea/gitea.db

[server]
...
LFS_CONTENT_PATH = /mnt/gitea/lfs

[repository]
ROOT = /mnt/gitea/gitea-repositories

...

注意:确保您的git用户对此位置具有写入权限。您可以在这里了解Linux权限。

移动现有的 Gitea 安装

如果您已经安装并运行了 Gitea 实例,仍然可以将数据存储在单独的卷上,但需要确保所有数据仍然安全且对 Gitea 可访问。

注意:与涉及您的数据的任何操作一样,确保您的所有数据都有最新备份非常重要。在这种情况下,这意味着将您数据目录中的所有文件(SSH 文件、gitea-repositorieslfs 目录、数据库等)备份到安全位置。

将数据迁移到新卷有两种选择。第一种方法是将您的 Gitea 数据复制到一个辅助位置,然后将原始位置转换为卷的挂载点。当您将数据复制回该位置时,您将把它复制到该卷上,Gitea 本身不需要做任何更改;它将简单地继续像以前一样运行。但是,如果您不想将整个设备挂载到目标位置(例如,如果您的 Gitea 数据不是该卷上唯一的内容),那么第二个选择是将所有的 Gitea 数据移动到该卷上的一个新位置,并指示 Gitea 自己使用该位置。

无论您选择哪种选项,首先停止 Gitea 网络服务。

如果您是通过 Docker Compose 安装的 Gitea,请使用 docker-compose 命令停止服务。在包含 docker-compose.yml 文件的同一目录中运行:

  1. docker-compose down

如果您是将其安装为 systemd 服务,请使用 systemctl 命令:

  1. sudo systemctl stop gitea

一旦 Gitea 停止,将数据目录的所有内容移动到第 1 步中创建的挂载点:

  1. sudo mv * /mnt/gitea

通过列出当前目录的内容来确保所有文件都已移动:

  1. ls -la

这将仅返回当前和父目录条目:

total 8
drwxrwxr-x 2 sammy sammy 4096 Jun 27 13:56 ./
drwxr-xr-x 7 sammy sammy 4096 Jun 27 13:56 ../

一旦所有数据都已移动,请切换到新的数据目录:

  1. cd /mnt/gitea

使用 ls 命令确保一切看起来正确:

  1. ls -l

这将显示目录的内容:

Output
total 36 drwxr-xr-x 6 root root 4096 Jun 27 14:21 ./ drwxr-xr-x 3 root root 4096 Jun 27 14:21 ../ drwxr-xr-x 5 git git 4096 Jun 23 22:42 git/ drwxr-xr-x 13 git git 4096 Jul 11 08:25 gitea/ drwx------ 2 root root 16384 Jun 27 03:46 lost+found/ drwx------ 2 root root 4096 Jun 23 22:34 ssh/

与以前一样,它应该包含 sshgitgitea 目录。如果您使用 SQLite 作为管理 Gitea 的数据库,它还将在 gitea 目录中包含一个名为 gitea.db 的文件。

当您确信所有数据已移动时,就是将卷挂载到数据目录的时候了。

首先,移动到您之前所在的数据目录的父目录。在本例中,假设您是在使用 Docker Compose 安装 Gitea,如先决条件中链接的教程所述,这个目录包含您的 docker-compose.yml 文件。

  1. cd ~/gitea/

与以前一样,使用 mount 命令,但这次,将刚刚清空的目录用作目标:

  1. sudo mount -o defaults,noatime /dev/disk/by-id/your_disk_id gitea

现在,当您列出该目录的内容时,所有文件都应该已经放置好了:

  1. ls -la gitea

此命令将输出预期的信息。请注意,根据您的卷的文件系统类型,您可能会找到一个名为 lost+found 的附加目录;这是正常的,是日常文件系统使用的一部分:

total 36
drwxr-xr-x  6 root  root   4096 Jun 27 13:58 ./
drwxrwxr-x  3 sammy sammy  4096 Jun 27 02:23 ../
drwxr-xr-x  5 git   git    4096 Jun 23 22:42 git/
drwxr-xr-x 12 git   git    4096 Jun 27 00:00 gitea/
drwx------  2 root  root   16384 Jun 27 03:46 lost+found/
drwx------  2 root  root   4096 Jun 23 22:34 ssh/

如前所述,如果您希望 Gitea 使用块存储卷中的一个目录,那么在重新启动 Gitea 之前,您需要完成一个额外的步骤。例如,假设您希望在挂载在 /mnt/gitea 上的卷上使用一个名为 scm 的文件夹。在将所有 Gitea 数据移动到 /mnt/gitea/scm 后,您需要从旧数据目录创建一个符号链接到新目录。为此,您将使用 ln 命令:

  1. sudo ln -s /mnt/gitea/scm gitea

在这一点上,你可以重新启动 Gitea。如果你正在使用 Gitea 作为 systemd 服务,请运行:

  1. sudo systemctl restart gitea

如果你正在使用 Docker Compose 将 Gitea 作为 Docker 容器运行,请运行:

  1. docker-compose up -d

现在一切都已经启动并运行,访问浏览器中的 Gitea 实例,确保一切都按预期工作。你应该能够在 Gitea 中创建新的对象,如仓库、问题等。如果你使用 SSH shim 设置了 Gitea,你还应该能够使用 git clonegit push 检出和推送仓库。

结论

在本教程中,你将所有的 Gitea 数据移动到一个块存储卷中。这样的卷非常灵活,并提供许多好处,比如允许你将所有数据存储在更大的磁盘、RAID 卷、网络文件系统中,或者使用像 DigitalOcean Volumes 这样的块存储来降低存储成本。它还允许你对整个磁盘进行快照备份,以便在发生灾难性故障时恢复其内容。

Source:
https://www.digitalocean.com/community/tutorials/how-to-store-gitea-repositories-on-a-separate-volume