介紹
Gitea是基於版本控制系統Git的源代碼存儲庫。雖然有一些像是GitLab和Gogs這樣的自托管解決方案可用,但Gitea的好處在於它輕巧,這意味著它可以在相對較小的伺服器上運行。
然而,擁有一個小型伺服器,特別是在VPS領域,通常意味著在空間上受到限制。幸運的是,許多主機提供商還提供額外的存儲空間,以外部卷、塊存儲或網絡文件存儲(NFS)的形式。這使用戶可以在較小的VPS主機上為其應用節省資金,而不會犧牲存儲空間。
有了Gitea和能夠決定源代碼存儲位置的能力,您可以確保您的項目和文件有擴展的空間。在本教程中,您將掛載一個外部存儲卷到一個掛載點,並確保Gitea從該卷讀取相應的信息。最終,您將擁有一個將存儲庫和其他重要信息存儲在單獨存儲卷上的Gitea安裝。
先決條件
在開始之前,您需要以下東西:
- 根据我们的Ubuntu 20.04 初始服务器设置指南设置了一个服务器,具有具有sudo特权的非root用户和启用的防火墙。
- 一个外部卷,例如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
的掛載點:
從這裡,您可以將設備掛載到該目錄,以便使用它來訪問該存儲空間。使用 mount
命令掛載設備:
字符串 ext4
選項指定文件系統類型,在這種情況下是 ext4,不過根據您的卷的文件系統類型,它可能是像 xfs
或 nfs
這樣的東西;要檢查您的卷使用的是哪種類型,請使用不帶任何選項的 mount
命令運行:
這將為每個掛載的文件系統提供一行輸出。由於您剛剛掛載了您的,它可能是列表中的最後一個:
Output. . .
/dev/sda on /mnt/gitea type ext4 (rw,noatime,discard)
這顯示文件系統類型為 ext4
。
此命令將指定的設備掛載到 /mnt/gitea
。 -o
選項指定掛載時使用的選項。在這種情況下,您使用默認選項,允許掛載讀/寫文件系統,而 noatime
選項指定內核不應更新設備上文件和目錄的上次訪問時間,以提高效率。
現在您已經掛載了設備,它將在系統運行時保持掛載。但是,一旦系統重新啟動,它將不再掛載(儘管數據將保留在卷上),因此您需要告訴系統在啟動時立即掛載卷,使用 /etc/fstab
(’文件系統表’)文件。此文件以制表符分隔的格式列出可用的文件系統及其掛載點。
使用 echo
和 tee
,將新行添加到 /etc/fstab
的末尾:
此命令將字符串/dev/disk/by-uid/your_disk_id
附加到fstab
文件並顯示在您的屏幕上。與之前的mount
命令一樣,它使用defaults
、nofail
和noatime
選項將設備掛載到掛載點。
一旦您對/etc/fstab
進行了更改,內核將在啟動時掛載您的卷。
注意:Linux上的存儲設備非常靈活,有各種不同的類型,從網絡文件系統(NFS)到普通的硬盤。要了解有關Linux中塊存儲和設備的更多信息,您可以閱讀我們的Linux存儲術語和概念介紹。
步驟2 — 配置Gitea以將數據存儲在塊存儲卷上
Gitea在一個中央位置維護所有存儲庫。這包括所有用戶和組織的存儲庫。除非另有配置,否則所有信息都保存在單個目錄中。在默認安裝中,此目錄名為data
。對於本教程,我們將使用運行在Docker上的Gitea版本,就像上面鏈接的教程中一樣。
首先,讓我們了解一下這個數據目錄包含什麼內容。您可以移動到數據目錄並運行 ls
命令來查看。使用 -l
格式將告訴我們有關文件的更多信息:
這將提供如下的清單:
Outputtotal 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
目錄很重要,因為它包含了我們可能想要存儲在單獨卷上的所有存儲庫。列出目錄的內容:
這將提供目錄的詳細列表:
Outputtotal 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/
其中有兩個值得注意的目錄:repositories
目錄包含由 Gitea 管理的 git 存儲庫,按用戶/組織排序,以及包含 Git 大文件存儲功能數據的 lfs
目錄。 gitea
目錄包含 Gitea 在後台使用的信息,包括舊存儲庫的存檔,以及包含用戶和存儲庫信息的數據庫,這些信息被 web 服務使用。 ssh
目錄包含 Gitea 使用的各種 SSH 密鑰對。
考慮到此目錄中存儲的所有信息都很重要,您將希望將整個目錄的內容包含在我們附加的卷上。
從這一點出發,有兩條路可以選擇,取決於您是否正在使用新安裝的 Gitea 並在安裝過程中完成此教程。在第一條路徑中,您將能夠在完成安裝之前指定位置,在第二條路徑中,您將學習如何移動現有的安裝。
設置新的 Gitea 安裝
如果您從頭開始安裝全新的 Gitea,您可以在配置過程中指定所有信息存儲的位置。例如,如果您正在使用 Docker Compose 設置 Gitea,您可以將卷映射到附加的卷上。
使用您喜歡的文本編輯器打開 docker-compose.yml
文件。以下示例使用 nano
:
文件打開後,在組合文件中搜索 volumes
條目,並修改冒號左側的映射,使其指向 Gitea 數據目錄的適當位置。
完成設置後,保存並關閉文件。如果您使用的是 nano
,您可以按 CTRL + X
,Y
,然後 ENTER
完成此操作。
警告:SSH 服务器会在 Git 用户(git,在本例中)的主目录中查找 .ssh
目录。该目录包含 Gitea 将使用的所有 SSH 密钥,因此不建议移动此 Docker 卷的挂载。为了在您的卷上备份此位置,最好使用另一种解决方案,例如使用 cron
作业定期备份该目录。要了解更多,请查看 使用 cron
管理定期任务的教程。
当您运行 docker-compose
并安装 Gitea 时,它将使用您的块存储卷来存储其数据。
如果您没有使用 Docker 卷来管理数据位置 — 例如,如果您根据 Gitea 的 这些说明 通过二进制发布在服务器上安装 Gitea — 那么您将需要在设置所有值并执行浏览器中的最终安装步骤之前修改配置文件中的位置(通常为 /etc/gitea/app.ini
)。例如,您可以将它们设置如下:
注意:确保您的git用户具有对此位置的写访问权限。您可以在这里了解有关Linux权限的详细信息。
移动现有的Gitea安装
如果您已经安装并运行了Gitea实例,则仍然可以将数据存储在单独的卷上,但需要仔细确保所有数据都保持安全且对Gitea可访问。
注意:与涉及您的数据的任何操作一样,确保您拥有一份最新的备份非常重要。在这种情况下,这意味着将数据目录中的所有文件(SSH文件、gitea-repositories
和lfs
目录、数据库等)备份到安全位置。
有兩種選擇將您的數據移動到新的卷。第一種方法是將您的 Gitea 數據複製到次要位置,然後將原始位置變成您的卷的掛載點。當您將數據複製回該位置時,您將把它複製到該卷上,而且 Gitea 本身不需要進行任何更改;它將繼續像以前一樣運行。然而,如果您不想將整個設備掛載到該目的地(例如,如果您的 Gitea 數據不會是該卷上唯一的內容),那麼第二個選擇是將所有的 Gitea 數據移動到該卷上的新位置,並指示 Gitea 本身使用該位置。
無論您選擇哪個選項,首先,停止 Gitea Web 服務。
如果您是通過 Docker Compose 安裝的 Gitea,請使用 docker-compose
停止服務。在包含 docker-compose.yml
文件的同一目錄中,運行:
如果您已將其安裝為 systemd 服務,請使用 systemctl
命令:
一旦停止了 Gitea,將數據目錄的所有內容移動到第 1 步中創建的掛載點:
通過列出當前目錄的內容來確保所有文件都已移動:
這將僅返回當前和父目錄的條目:
total 8
drwxrwxr-x 2 sammy sammy 4096 Jun 27 13:56 ./
drwxr-xr-x 7 sammy sammy 4096 Jun 27 13:56 ../
一旦所有數據都已移動,切換到新的數據目錄:
使用 ls
確保一切看起來正確:
這將顯示目錄的內容:
Outputtotal 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/
與之前一樣,它應該包含ssh
、git
和gitea
目錄。如果您正在使用SQLite作為管理Gitea的數據庫,它還將在gitea
目錄中包含一個名為gitea.db
的文件。
當您確定所有數據都已移動完畢,就該將卷掛載到數據目錄中了。
首先,移動到您之前所在的數據目錄的父目錄。在本例中,使用Docker Compose安裝Gitea,如先決條件中所述的教程所述,這是包含您的docker-compose.yml
文件的目錄。
與之前一樣,使用mount
命令,但這次將剛剛清空的目錄作為目的地:
現在,當您列出該目錄的內容時,所有文件應該都已放置:
此命令將輸出預期的信息。請注意,根據您卷的文件系統類型,您可能會發現一個名為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
命令:
此時,您可以重新啟動 Gitea。如果您正在使用 Gitea 作為 systemd 服務,請運行:
如果您正在使用 Docker Compose 將 Gitea 運行為 Docker 容器,請運行:
現在,一切都已經啟動並運行,請在瀏覽器中訪問您的 Gitea 實例,並確保一切按照預期運作。您應該能夠在 Gitea 中創建新的對象,例如存儲庫、問題等。如果您使用 SSH 偽裝設置了 Gitea,您還應該能夠使用 git clone
和 git push
檢出和推送存儲庫。
結論
在本教程中,您將所有 Gitea 數據移動到了一個塊存儲卷中。這些卷非常靈活,並提供許多好處,例如允許您將所有數據存儲在更大的磁盤、RAID 卷、網絡文件系統中,或使用像 DigitalOcean Volumes 這樣的塊存儲來減少存儲費用。它還允許您對整個磁盤進行快照備份,以便在災難性故障發生時恢復其內容。