はじめに
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
という名前のマウントポイントを作成します:
ここから、そのデバイスをそのディレクトリにマウントして、そのストレージスペースにアクセスするために使用できます。デバイスをマウントするには、mount
コマンドを使用します:
文字列ext4
オプションは、この場合はファイルシステムタイプであるext4を指定していますが、ボリュームのファイルシステムタイプに応じて、xfs
やnfs
などの場合もあります。ボリュームがどのタイプを使用しているかを確認するには、mount
コマンドをオプションなしで実行します:
これにより、マウントされているファイルシステムごとに1行の出力が提供されます。あなたがマウントしたばかりなので、おそらくリストの最後になるでしょう:
Output. . .
/dev/sda on /mnt/gitea type ext4 (rw,noatime,discard)
これは、ファイルシステムタイプがext4
であることを示しています。
このコマンドは、そのIDで指定されたデバイスを/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/
このコマンドの出力を解説しましょう。1行につき1つのファイルまたはディレクトリがリストされます。この場合、5つのディレクトリがリストされています。.
のエントリは、現在のディレクトリを意味する特別なエントリであり、..
は1つ上のディレクトリを示します。この出力は、現在のディレクトリがrootユーザーによって所有されており、これはこの場合のDockerが特権ユーザーとして実行されているためです。また、1つ上のディレクトリは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/
ここには、2つの注目すべきディレクトリがあります。1つは、Giteaによって管理されるgitリポジトリがユーザー/組織ごとに整理されたrepositories
ディレクトリであり、もう1つは、Gitの大規模ファイルストレージ機能のデータを含むlfs
ディレクトリです。gitea
ディレクトリには、Giteaがバックグラウンドで使用する情報が含まれており、これには古いリポジトリのアーカイブや、ウェブサービスで使用されるユーザーやリポジトリ情報など、データベースが含まれています。ssh
ディレクトリには、Giteaが使用するさまざまなSSHキーペアが含まれています。
このディレクトリに保存されている情報はすべて重要ですので、添付されたボリュームにディレクトリ全体の内容を含める必要があります。
この時点からは2つのパスがあります。新規の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
ディレクトリ、データベースなど) を安全な場所にバックアップすることを意味します。
新しいボリュームにデータを移動するための2つのオプションがあります。最初の方法は、Giteaのデータをセカンダリの場所にコピーし、元の場所をボリュームのマウントポイントに変更することです。データをその場所に戻すと、そのボリュームにコピーされ、Gitea自体では変更が必要ありません。単純に以前と同様に続行されます。ただし、そのデバイス全体をその宛先にマウントしたくない場合(たとえば、Giteaのデータがそのボリューム上の唯一のものでない場合)は、Giteaのすべてのデータをそのボリューム上の新しい場所に移動し、Gitea自体にその場所を使用するように指示することができます。
どちらのオプションを選択しても、まず、Giteaウェブサービスを停止します。
GiteaをDocker Compose経由でインストールした場合、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
ディレクトリを含める必要があります。Giteaを管理するためにデータベースとしてSQLiteを使用している場合、gitea.db
という名前のファイルもgitea
ディレクトリに含まれます。
すべてのデータが移動されたことを確認したら、データディレクトリにボリュームをマウントする準備が整いました。
まず、以前にいたデータディレクトリの親ディレクトリに移動します。この例では、プレリクエストでリンクされているチュートリアルで説明されているように、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サービスとして使用している場合は、次を実行します:
GiteaをDocker Composeを使用してDockerコンテナとして実行している場合は、次を実行します:
すべてが稼働していることを確認したら、ブラウザでGiteaインスタンスにアクセスし、すべてが予想どおりに機能することを確認してください。 リポジトリ、イシューなどのGiteaで新しいオブジェクトを作成できるはずです。 SSHシムを使用してGiteaをセットアップした場合は、git clone
とgit push
を使用してリポジトリをチェックアウトおよびプッシュすることもできるはずです。
結論
このチュートリアルでは、Giteaデータをすべてブロックストレージボリュームに移動しました。 このようなボリュームは非常に柔軟で、多くの利点を提供します。たとえば、より大きなディスク、RAIDボリューム、ネットワークファイルシステム、またはDigitalOcean Volumesなどのブロックストレージを使用してストレージ費用を削減できます。 また、ディスク全体のスナップショットを取得してバックアップし、壊滅的な障害が発生した場合にその内容を復元できます。