Giteaリポジトリを別のボリュームに格納する方法

はじめに

Giteaは、バージョン管理システムGitに基づいたソースコードリポジトリです。GitLabやGogsなどのいくつかのセルフホスト型ソリューションがありますが、Giteaは軽量であるという利点があります。そのため、比較的小さなサーバー上で動作させることができます。

しかし、特にVPSの領域では、小さなサーバーを持つことは領域の制限を意味することがあります。幸いなことに、多くのホスティングプロバイダーは、外部ボリューム、ブロックストレージ、またはネットワークファイルストレージ(NFS)形式の追加ストレージも提供しています。これにより、ユーザーはアプリケーションのために小さなVPSホストを使用しても、ストレージを犠牲にすることなくお金を節約できます。

Giteaとソースコードの保存先を決定できる機能を使用することで、プロジェクトとファイルに拡張の余地があることを確認できます。このチュートリアルでは、外部ストレージボリュームをマウントポイントにマウントし、Giteaがそのボリュームから適切な情報を読み取ることを確認します。最終的には、リポジトリやその他の重要な情報を別のストレージボリュームに保存するGiteaインストールができます。

前提条件

始める前に、以下が必要です。

  • Ubuntu 20.04サーバーは、Ubuntu 20.04の初期サーバーセットアップガイドに従って設定されています。非rootユーザーがsudo特権を持ち、ファイアウォールが有効になっています。
  • 外部ボリューム、例えばNFSまたはブロックストレージボリュームがあります。DigitalOceanのブロックストレージボリュームを設定したい場合は、製品ドキュメントに従ってください。
  • ドメイン名を介してアクセス可能なサーバー上のGiteaのインストールがあります。このガイドでは、GiteaをDockerにインストールしたものとして想定しています。これは、Ubuntu 20.04にGiteaをインストールする方法のチュートリアルで概説されています。ただし、これにはサーバーにDockerとDocker Composeがインストールされている必要があります。これらのツールをインストールするには、次のチュートリアルの手順に従ってください:
    • Ubuntu 20.04にDockerをインストールして使用する方法のステップ1と2
    • Ubuntu 20.04にDocker Composeをインストールして使用する方法のステップ1

これらの前提条件でGiteaをインストールした場合、システム上の特定のファイルやディレクトリの名前や場所が、このガイドの例で言及されているものと異なる場合があります。ただし、このチュートリアルで概説されている概念は、どのような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

これにより、マウントされているファイルシステムごとに1行の出力が提供されます。あなたがマウントしたばかりなので、おそらくリストの最後になるでしょう:

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_idfstabファイルに追加し、画面に表示します。前のmountコマンドと同様に、defaultsnofail、およびnoatimeオプションを使用して、デバイスをマウントポイントにマウントします。

変更が/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/

このコマンドの出力を解説しましょう。1行につき1つのファイルまたはディレクトリがリストされます。この場合、5つのディレクトリがリストされています。.のエントリは、現在のディレクトリを意味する特別なエントリであり、..は1つ上のディレクトリを示します。この出力は、現在のディレクトリがrootユーザーによって所有されており、これはこの場合のDockerが特権ユーザーとして実行されているためです。また、1つ上のディレクトリは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/

ここには、2つの注目すべきディレクトリがあります。1つは、Giteaによって管理されるgitリポジトリがユーザー/組織ごとに整理されたrepositoriesディレクトリであり、もう1つは、Gitの大規模ファイルストレージ機能のデータを含むlfsディレクトリです。giteaディレクトリには、Giteaがバックグラウンドで使用する情報が含まれており、これには古いリポジトリのアーカイブや、ウェブサービスで使用されるユーザーやリポジトリ情報など、データベースが含まれています。sshディレクトリには、Giteaが使用するさまざまなSSHキーペアが含まれています。

このディレクトリに保存されている情報はすべて重要ですので、添付されたボリュームにディレクトリ全体の内容を含める必要があります。

この時点からは2つのパスがあります。新規のGiteaのインストールを行い、このチュートリアルをインストールプロセス中に完了する場合と、既存のインストールを移動する方法に応じて異なります。

Giteaの新規インストールのセットアップ

Giteaの新規インストールを開始する場合、設定プロセス中に情報の保存場所を指定できます。例えば、Docker Composeを使用してGiteaをセットアップする場合、ボリュームを添付されたボリュームにマップすることができます。

お好みのテキストエディタでdocker-compose.ymlファイルを開きます。以下の例ではnanoを使用します:

  1. nano docker-compose.yml

ファイルを開いたら、コンポーズファイル内の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 + XYENTERを押すことで保存して閉じることができます。

警告: SSHサーバーは、Gitユーザー(この場合はgit)のホームディレクトリ内に.sshディレクトリを探します。このディレクトリには、Giteaが使用するすべてのSSHキーが含まれているため、このDockerボリュームのマウントを移動することはお勧めできません。この場所をボリュームにバックアップするには、cronジョブなど別のソリューションを使用するのが最適です。詳細については、cronを使用して定期的なタスクを管理するためのこのチュートリアルをチェックしてください

docker-composeを実行し、Giteaをインストールすると、ブロックストレージボリュームがデータを保存するために使用されます。

データの場所を管理するためにDockerボリュームを使用していない場合、たとえば、これらのGiteaの手順に従ってサーバーにGiteaをインストールしている場合、最終的なインストール手順をブラウザで実行する前に、構成ファイル(通常/etc/gitea/app.ini)内の場所を変更する必要があります。たとえば、次のように設定できます:

app.ini
...

# データベースにSQLiteを使用している場合、このセクション内のPATHを変更する必要があります
# このセクション内の変数
[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-repositories ディレクトリと lfs ディレクトリ、データベースなど) を安全な場所にバックアップすることを意味します。

新しいボリュームにデータを移動するための2つのオプションがあります。最初の方法は、Giteaのデータをセカンダリの場所にコピーし、元の場所をボリュームのマウントポイントに変更することです。データをその場所に戻すと、そのボリュームにコピーされ、Gitea自体では変更が必要ありません。単純に以前と同様に続行されます。ただし、そのデバイス全体をその宛先にマウントしたくない場合(たとえば、Giteaのデータがそのボリューム上の唯一のものでない場合)は、Giteaのすべてのデータをそのボリューム上の新しい場所に移動し、Gitea自体にその場所を使用するように指示することができます。

どちらのオプションを選択しても、まず、Giteaウェブサービスを停止します。

GiteaをDocker Compose経由でインストールした場合、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ディレクトリを含める必要があります。Giteaを管理するためにデータベースとしてSQLiteを使用している場合、gitea.dbという名前のファイルもgiteaディレクトリに含まれます。

すべてのデータが移動されたことを確認したら、データディレクトリにボリュームをマウントする準備が整いました。

まず、以前にいたデータディレクトリの親ディレクトリに移動します。この例では、プレリクエストでリンクされているチュートリアルで説明されているように、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

GiteaをDocker Composeを使用してDockerコンテナとして実行している場合は、次を実行します:

  1. docker-compose up -d

すべてが稼働していることを確認したら、ブラウザでGiteaインスタンスにアクセスし、すべてが予想どおりに機能することを確認してください。 リポジトリ、イシューなどのGiteaで新しいオブジェクトを作成できるはずです。 SSHシムを使用してGiteaをセットアップした場合は、git clonegit pushを使用してリポジトリをチェックアウトおよびプッシュすることもできるはずです。

結論

このチュートリアルでは、Giteaデータをすべてブロックストレージボリュームに移動しました。 このようなボリュームは非常に柔軟で、多くの利点を提供します。たとえば、より大きなディスク、RAIDボリューム、ネットワークファイルシステム、またはDigitalOcean Volumesなどのブロックストレージを使用してストレージ費用を削減できます。 また、ディスク全体のスナップショットを取得してバックアップし、壊滅的な障害が発生した場合にその内容を復元できます。

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