Dockerを使用してUbuntuにGiteaをインストールする方法
序章
ソフトウェア開発に取り組むときは、効率的で追跡可能な方法でソースコードを管理できることが重要です。 ソースコード管理( SCM )システムは、任意の数の開発者が任意のサイズのプロジェクトで作業するための効率的で柔軟なプロセスを提供する優れた方法です。 CVSからSubVersion、PerforceからMercurialまで、さまざまなSCMソフトウェアが長年にわたって存在していましたが、現在の業界リーダーは Git であり、GitHubやGitLabなどのサイトの人気で大きな成長を遂げています。 。
ただし、これらのサービスの無料アカウントは公開のオープンソースリポジトリを対象としているため、プライベートまたはプロプライエタリソフトウェアで作業する機能には開発者のコストがかかります。 さらに、リポジトリへのアクセスは外部の組織に委ねられており、多くの人は自分のソフトウェアを最初から最後まで制御することを好みます。
そのために、 Gogs 、 Gitea 、GitLabなどのいくつかのセルフホストソリューションが過去数年にわたって開発されてきました。 このチュートリアルでは、最も人気のあるソリューションの1つであるGiteaをセットアップして、プライベートリポジトリをホストし、ライフサイクル全体を通じて独自のプロジェクトを管理できるようにすることに焦点を当てています。 Giteaは小型で、自己完結型で、軽量であるため、ハードウェア要件に負担をかけることなく、迅速に導入できます。 GiteaのDockerインストールを使用します。これにより、ソフトウェアが最新の状態に保たれます。
前提条件
このチュートリアルを開始する前に、次のものが必要です。
- Ubuntu 20.04 の初期サーバー設定で説明されているように、
sudo
権限で構成された非rootユーザーのUbuntu20.04サーバー。 - サーバーにDockerがインストールされています。 Ubuntu 20.04にDockerをインストールする方法のステップ1と2に従って、Dockerをインストールします。
- サーバーにインストールされているDockerCompose。 これを設定するには、 Ubuntu20.04にDockerComposeをインストールして使用する方法に関するガイドのステップ1に従ってください。
- サーバーを指すドメイン名。 DigitalOcean Dropletを使用している場合は、ドメインとDNSのドキュメントに従ってください。 このチュートリアルでは、例全体で
your_domain
を使用します。
ステップ1—Gitユーザーを作成する
Giteaは、多くのソースコードリポジトリと同様に、リモートリポジトリへのアクセスにSSHを使用します。 これにより、ユーザーはGitea自体の中でSSHキーを管理することにより、コードへのアクセスを制御できます。 ただし、ユーザーがSSH経由でホストにアクセスできるようにするには、ホストマシン上にgitユーザーを作成する必要があります。 このステップは、ユーザーのユーザーとグループIDにアクセスできるように、最初に完了します。
まず、これらの接続を受け入れるホスト上にユーザーを作成します。
sudo adduser --system --shell /bin/bash --gecos 'Git Version Control' --group --disabled-password --home /home/git git
このコマンドでは、シェルとして bash を使用するが、ログインパスワードを持たないシステムユーザーを作成します。 これにより、sudo
を使用してそのユーザーとしてコマンドを実行できますが、そのユーザーとしてログインすることはできません。 また、ユーザーのホームディレクトリを/home/git
に設定します。
このコマンドは、作成したばかりのユーザーに関する情報を出力します。
OutputAdding system user `git' (UID 112) ... Adding new group `git' (GID 119) ... Adding new user `git' (UID 112) with group `git' ... Creating home directory `/home/git' …
将来のステップで使用されるため、ここで提供されるUIDとGIDの値(この場合、112
のUIDと119
のGID)をメモします。
ステップ2—GiteaDockerイメージをインストールする
Giteaには、グローバルDockerリポジトリで使用可能なイメージがあります。つまり、Docker Composeを使用すると、追加の作業をほとんど必要とせずに、そのイメージをサービスとしてインストールして実行できます。 イメージ自体がGiteaWebおよびSSHサービスを実行し、ブラウザーとコマンドラインの両方からGitにアクセスできるようにします。
Giteaコンテナーを起動するには、環境をセットアップするための宣言型ツールであるDockerComposeを使用します。
まず、サービスをホストするディレクトリを作成し、次のように入力します。
mkdir ~/gitea cd ~/gitea
そこで、お好みのテキストエディタを使用してdocker-compose.yml
というファイルを作成します。 次の例では、nano
を使用しています。 このファイルには、Giteaインストールの一部として実行されるコンテナの説明が含まれています。
nano docker-compose.yml
この新しいファイルに以下を追加します。
〜/ gitea / docker-compose.yml
version: "3" networks: gitea: external: false services: server: image: gitea/gitea:1.16.5 container_name: gitea environment: - USER_UID=UID_from_step_1 - USER_GID=GID_from_step_1 restart: always networks: - gitea volumes: - ./gitea:/data - /home/git/.ssh/:/data/git/.ssh - /etc/timezone:/etc/timezone:ro - /etc/localtime:/etc/localtime:ro ports: - "127.0.0.1:3000:3000" - "127.0.0.1:2222:22"
このファイルの機能を見ていきましょう。
version: "3"
:これにより、Dockerはこれがどのバージョンの構成ファイルであるかを作成できます。networks
:このセクションでは、コンテナーのコレクションのネットワーク設定を宣言します。 この場合、gitea
ネットワークが作成されますが、外部には公開されません。services
image: gitea/gitea:1.16.5
:これはGiteaバージョン1.16.5を使用することを指定します。 ただし、コロンの後の値を変更して、特定のリリース、:1
などのメジャーバージョン、:latest
や:dev
などのタグなどの他のバージョンを指定できます。environment
:環境セクションは、インストールおよび実行中にイメージで使用できる環境変数を指定します。 この場合、ステップ1のadduser
コマンドの出力で提供されたUIDとGIDを使用して、環境のユーザーIDとグループIDを指定しています。restart: always
:この行は、コンテナー自体がダウンしたか、ホストマシンがダウンしたかに関わらず、コンテナーがダウンした場合は常にコンテナーを再起動するようにDockerに指示します。 基本的に、Giteaは起動時に起動します。networks
:これは、Giteaサービスが上記のネットワークにアクセスでき、アクセスできることを指定します。./gitea:/data
および/home/git/.ssh/:/data/git/.ssh
:これらはGiteaがリポジトリと関連データを保存する場所です。 現在、これは現在のディレクトリのgitea
という名前のフォルダにマップされています。 Dockerは、コンテナーが存在しない場合、コンテナーの起動時にこのフォルダーを作成します。.ssh
フォルダーについては、後のステップ6で詳しく説明します。/etc/timezone
および/etc/localtime
:これらの2つのファイルには、ホストマシンのタイムゾーンと時刻に関する情報が含まれています。 これらを読み取り専用ファイル(定義の最後の:ro
部分で指定)としてコンテナーに直接マッピングすることにより、コンテナーはホストと同じ情報を持ちます。ports
:Giteaは2つのポートで接続をリッスンします。 ポート3000
でHTTP接続をリッスンし、ソースコードリポジトリのWebインターフェイスを提供し、ポート22
でSSH接続をリッスンします。 この場合、HTTP接続用のポート3000
を同じ番号にマッピングし、Giteaのコンテナのポートを通常の22
から2222
にマッピングします。ポートの衝突を避けるため。 ステップ6では、要求に応じてトラフィックをGiteaに転送するようにSSHシムを設定します。
注:これは、Gitea用のDockerComposeファイルの最小限の例です。 MySQLまたはPostGreSQLをバッキングデータベースとして使用したり、ストレージ用の名前付きボリュームを使用したりするなど、他にもいくつかのオプションを含めることができます。 この最小限のセットアップでは、バッキングデータベースとしてSQLiteを使用し、ストレージにgitea
という名前のディレクトリを使用するボリュームを使用します。 これらのオプションの詳細については、Giteaのドキュメントをご覧ください。
ファイルを保存して閉じます。 nano
を使用してファイルを編集した場合は、CTRL + X
、Y
、ENTER
の順に押すと編集できます。
このファイルを配置したら、DockerComposeを使用してコンテナを起動できます。
docker-compose up
このコマンドは、画像をプルダウンし、Giteaコンテナを起動し、次のような出力を返します。
Output[+] Running 9/9 ⠿ server Pulled 8.2s ⠿ e1096b72685a Pull complete 1.4s ⠿ ac9df86bb932 Pull complete 3.3s ⠿ 6d34ed99b58a Pull complete 3.4s ⠿ a8913d040fab Pull complete 3.6s ⠿ a5d3a72a2366 Pull complete 5.3s ⠿ 1f0dcaae29cc Pull complete 5.6s ⠿ f284bcea5adb Pull complete 7.3s ⠿ 0f09c34c97e3 Pull complete 7.5s [+] Running 2/2 ⠿ Network gitea_gitea Created 0.2s ⠿ Container gitea Created 0.2s Attaching to gitea gitea | Generating /data/ssh/ssh_host_ed25519_key... gitea | Generating /data/ssh/ssh_host_rsa_key... gitea | Generating /data/ssh/ssh_host_dsa_key... gitea | Generating /data/ssh/ssh_host_ecdsa_key... gitea | Server listening on :: port 22. gitea | Server listening on 0.0.0.0 port 22. gitea | 2022/03/31 17:26:21 cmd/web.go:102:runWeb() [I] Starting Gitea on PID: 14 gitea | 2022/03/31 17:26:21 ...s/install/setting.go:21:PreloadSettings() [I] AppPath: /usr/local/bin/gitea gitea | 2022/03/31 17:26:21 ...s/install/setting.go:22:PreloadSettings() [I] AppWorkPath: /app/gitea gitea | 2022/03/31 17:26:21 ...s/install/setting.go:23:PreloadSettings() [I] Custom path: /data/gitea gitea | 2022/03/31 17:26:21 ...s/install/setting.go:24:PreloadSettings() [I] Log path: /data/gitea/log gitea | 2022/03/31 17:26:21 ...s/install/setting.go:25:PreloadSettings() [I] Configuration file: /data/gitea/conf/app.ini gitea | 2022/03/31 17:26:21 ...s/install/setting.go:26:PreloadSettings() [I] Prepare to run install page gitea | 2022/03/31 17:26:21 ...s/install/setting.go:29:PreloadSettings() [I] SQLite3 is supported gitea | 2022/03/31 17:26:21 cmd/web.go:208:listen() [I] Listen: http://0.0.0.0:3000 gitea | 2022/03/31 17:26:21 cmd/web.go:212:listen() [I] AppURL(ROOT_URL): http://localhost:3000/
ただし、これによりコンテナはフォアグラウンドで実行されたままになり、Ctrl + C
でプロセスを終了するか、接続が失われるとすぐに停止します。 コンテナを別のプロセスとしてバックグラウンドで実行するために、-d
フラグをComposeコマンドに追加できます。
docker-compose up -d
コンテナが起動してシェルに戻ると通知が届きます。
ステップ3—リバースプロキシとしてのNginxのインストール
ApacheやNginxなどの最新のサーバーソフトウェアは、1台のマシンで複数のサービスをより簡単に処理し、複数のサーバー間で負荷を分散し、SSLを処理できるため、リバースプロキシの背後でGiteaなどのWebサービスを実行するのが一般的です。 さらに、これにより、標準のHTTP(S)ポートで実行されているGiteaインスタンスを指すドメイン名を設定できます。
このチュートリアルでは、Nginxを使用します。 まず、ホストマシンのパッケージリストを更新します。
sudo apt update
次に、apt
を使用してNginxをインストールします。
sudo apt install nginx
ここで、ファイアウォールufw
を使用しているため、次のポートへのアクセスを許可する必要があります。
sudo ufw allow "Nginx Full"
これをインストールすると、http://your_domain
にアクセスして、ブラウザでサーバーにアクセスできるようになります。 これにより、Nginxを歓迎する非常にわかりやすいページが表示されます。
この時点で、着信トラフィックをNginx経由でDockerで実行されているGiteaインスタンスに転送するためのリバースプロキシエントリを作成する必要があります。 お好みのテキストエディタを使用して、Nginxsites-available
ディレクトリに新しいファイルを作成します。 次の例では、nano
を使用しています。
sudo nano /etc/nginx/sites-available/gitea
このファイルで、Giteaインスタンスにプロキシされた/
へのリクエストを含む新しいサーバーブロックを設定します。
/ etc / nginx / sites-available / gitea
server { # Listen for requests on your domain/IP address. server_name your_domain; root /var/www/html; location / { # Proxy all requests to Gitea running on port 3000 proxy_pass http://localhost:3000; # Pass on information about the requests to the proxied service using headers proxy_set_header HOST $host; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
ファイルの編集が終了したら、保存して閉じます。
注:これらのディレクティブ内で何が起こっているかを理解するための詳細については、 Nginx HTTPプロキシ、負荷分散、バッファリング、およびキャッシングについてチュートリアルを参照してください。
Nginxは、それらのファイルがsites-enabled
ディレクトリに存在するかどうかに基づいて、実際にサービスを提供するサイトを決定します。 これは、sites-available
ディレクトリ内のファイルを指すシンボリックリンクを介して管理されます。 NginxがGiteaの提供を開始するには、これらのシンボリックリンクの1つを作成する必要があります。
sudo ln -s /etc/nginx/sites-available/gitea /etc/nginx/sites-enabled/gitea
Nginxを再起動して変更を公開する前に、Nginx自体に、構成をテストしてそれらの変更が有効であることを確認してもらう必要があります。
sudo nginx -t
すべて問題がなければ、このコマンドは次のような出力を返します。
Outputnginx: 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
これで、ブラウザでhttp://your_domain
にアクセスすると、Giteaの初期設定ページで入力できるようになっているはずです。
ステップ4—CertbotのインストールとTLS証明書の設定
CertbotとLet'sEncryptの無料認証局のおかげで、GiteaインストールアプリにTLS暗号化を追加するのに必要なコマンドは2つだけです。
まず、CertbotとそのNginxプラグインをインストールします。
sudo apt install certbot python3-certbot-nginx
次に、certbot
を--nginx
モードで実行し、Nginxserver_name
構成ディレクティブで使用したものと同じドメインを指定します。
sudo certbot --nginx -d your_domain_here
Let's Encryptの利用規約に同意し、メールアドレスを入力するよう求められます。
その後、すべてのHTTPトラフィックをHTTPSにリダイレクトするかどうかを尋ねられます。 それはあなた次第ですが、これは一般的に推奨され、安全に行うことができます。
その後、Let's Encryptがリクエストを確認し、Certbotが証明書をダウンロードします。
OutputCongratulations! You have successfully enabled https://your_domain You should test your configuration at: https://www.ssllabs.com/ssltest/analyze.html?d=your_domain - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/your_domain/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/your_domain/privkey.pem Your cert will expire on 2022-05-09. To obtain a new or tweaked version of this certificate in the future, simply run certbot again with the "certonly" option. To non-interactively renew *all* of your certificates, run "certbot renew" - Your account credentials have been saved in your Certbot configuration directory at /etc/letsencrypt. You should make a secure backup of this folder now. This configuration directory will also contain certificates and private keys obtained by Certbot so making regular backups of this folder is ideal. - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le
Certbotは、新しい構成と証明書を使用してNginxを自動的にリロードします。 ブラウザにサイトをリロードすると、リダイレクトオプションを選択した場合、自動的にHTTPSに切り替わります。
これでサイトは安全になり、Webベースのセットアップ手順を安全に続行できます。
Let's Encryptを使用したドメインの保護の詳細については、 Ubuntu20.04チュートリアルでLet'sEncryptを使用してNginxを保護する方法を参照してください。
ステップ5—Giteaの設定と最初のユーザーの追加
これで、Gitea自体の構成と最初の管理者ユーザーの作成に進むことができます。 ブラウザでhttps://your_domain
を開いて、Giteaインスタンスにアクセスします。 最初のGitea設定画面には、サービスのいくつかのオプションがあります。
サイトタイトルなど、これらの一部は特定のユースケースに依存しますが、このチュートリアルの目的のために、以下を変更する必要があります。
- サーバードメイン:手順3で設定したサーバードメイン
- GiteaベースURL:ブラウザでGiteaにアクセスするために使用する完全なURL(プロトコルを含む)。 たとえば、
https://your_domain
です。
設定の変更を保存すると、Giteaのログインページに移動します。
注:構成が保存されると、Giteaサービスが再起動します。 これには数秒かかる場合があるため、 502 BadGatewayを示すNginxエラーが発生する場合があります。 このエラーが発生した場合は、数秒待ってからページを再起動してください。
まだユーザーがいないため、最初にユーザーを作成する必要があります。 クリックアカウントが必要です? 今すぐ登録ログインフォームの下にあるリンクをクリックして、新しいユーザーを登録します。 システムの最初のユーザーとして、このユーザーは管理者として作成されます。 設定画面でメール設定を行う場合は、最初にアカウントの確認が必要になる場合があります。
そのユーザーとしてログインしたら、ページの右上隅にあるユーザーアイコンをクリックし、ドロップダウンメニューからサイト管理をクリックすると、次のページに移動します。メンテナンスジョブを実行し、ユーザーアカウントと組織を管理し、さらにGiteaを構成することができます。
テストリポジトリの作成
ウェブインターフェースとGit自体の両方でGiteaをテストするには、テストリポジトリを作成します。 このリポジトリは後でいつでも削除できます。
ページの右上隅にある+記号をクリックし、ドロップダウンメニューから+新しいリポジトリをクリックします。 ここでは、説明、プライベートかどうかなどの設定、README
や.gitignore
ファイル。
リポジトリの作成を押すと、新しいリポジトリを試してみることができます。
ステップ6—SSHシムの設定
プロセスの最後のステップは、SSHシムを使用してホストマシンを準備することです。 GiteaはDockerコンテナで実行されているため、22
のデフォルトポートでSSH接続を受け入れることができません。これは、ホストと衝突するためです。 上記で作成したdocker-compose.yml
ファイルで、Dockerは、ホストのポートをコンテナーのポート22
にマップして、ポート2222
へのSSH接続を受け入れるように指示されました。 さらに、SSH authorized_keys
ファイルには、デフォルトでホストにSSHで接続しているユーザーはアクセスできません。
これを考慮に入れるには、SSH接続をホスト上のgitユーザーにコンテナーに渡すSSHシムを作成する必要があります。 作成ファイルでは、コンテナー内のUSERのユーザーとグループIDが1000になるように指定し、Giteaの構成画面で、gitという名前のユーザーを使用するようにサービスに指示しました。
GitユーザーとそのSSHキーの作成
次に、ユーザーのSSHキーを作成する必要があります。 これは以下の手順でのみ使用され、ホスト外の人と共有されることはありません。
sudo -u git ssh-keygen -t rsa -b 4096 -C "Gitea Host Key"
このコマンドは、sudo
を使用して、上記で作成したユーザーとしてSSHキーを作成します。 この場合、キーは4096ビットのRSAキーになります。 キーに使用するパスワードやキーファイルの名前など、一連の質問が表示されます。 それぞれについてENTER
を押し、デフォルトを受け入れるために空白のままにします。
警告:キーにパスワードを設定すると、シムを使用できなくなります。
Giteaコンテナ内のユーザーがこのキーを受け入れることを確認する必要があります。 これを行うには、.ssh/authorized_keys
ファイルに追加します。
sudo -u git cat /home/git/.ssh/id_rsa.pub | sudo -u git tee -a /home/git/.ssh/authorized_keys sudo -u git chmod 600 /home/git/.ssh/authorized_keys
ホスト上のディレクトリ/home/git/.ssh
がコンテナ上のボリュームとしてマウントされているため、これらのコマンドはすべてシムで機能します。つまり、コンテンツはそれらの間で共有されます。 SSH経由のgitを介したホストへの接続が受信されると、コンテナーと同じauthorized_keys
ファイルが使用されます。
SSHシムスクリプトの作成
シムの最後のステップは、ホスト上にスタブgitea
コマンドを作成することです。 これにより、gitコマンドがSSH上で機能できるようになります。SSH接続が確立されると、デフォルトのコマンドが実行されます。 ホスト上のこのgitea
コマンドは、SSH接続をコンテナーにプロキシするものです。
このスクリプトでは、cat
を使用してファイル/usr/local/bin/gitea
に書き込みます。
cat <<"EOF" | sudo tee /usr/local/bin/gitea #!/bin/sh ssh -p 2222 -o StrictHostKeyChecking=no git@127.0.0.1 "SSH_ORIGINAL_COMMAND=\"$SSH_ORIGINAL_COMMAND\" $0 $@" EOF
このスクリプトのコマンドは、Gitea DockerコンテナーにSSHで接続し、git
で使用されていた元のコマンドの内容を渡します。
最後に、スクリプトが実行可能であることを確認します。
sudo chmod +x /usr/local/bin/gitea
GitSSH接続のテスト
SSHキーをGiteaユーザーに追加することで、GiteaインスタンスのGitリポジトリからのプルとプッシュをテストできます。
SSH公開鍵の内容が必要になります。 これは通常、キーの作成時に使用したアルゴリズムに応じて、~/.ssh/id_rsa.pub
のような名前のファイルに存在します。
cat ~/.ssh/id_rsa.pub
注:初めてSSHキーを作成する必要がある場合は、この Ubuntu20.04チュートリアルでSSHキーを設定する方法を使用して作成する方法を学ぶことができます。
このコマンドの出力をコピーします。
Giteaで、右上隅にあるユーザーアイコンをクリックし、設定を選択します。 設定ページでは、上部に一連のタブがあります。 SSH / GPGキーをクリックし、SSHキーの管理の横にあるキーの追加ボタンをクリックします。 フォームの大きなテキスト領域にキーを貼り付け、その下にあるキーの追加ボタンをクリックします。
次に、手順3で作成したテストリポジトリに移動し、提供されたSSHURLをコピーします。 ローカルマシンで、リポジトリのクローンを作成します。
git clone git@your_domain:username/test
これはSSHを使用してリポジトリのクローンを作成します。 SSHキーにパスワードを設定している場合は、パスワードを入力するように求められます。
そのディレクトリに移動し、新しいファイルを作成します。
cd test touch just_testing
次に、それを段階的な変更に追加します。
git add just_testing
最後に、そのファイルをコミットします。
git commit -am "Just testing pushing over SSH!"
これで、変更をリモートリポジトリにプッシュできるようになります。
git push origin master
ブラウザでページを更新すると、新しいファイルがリポジトリに表示されます。
結論
ソースコードリポジトリをセルフホストするために、Dockerを使用してGiteaサービスを設定しました。 ここから、プルリクエストコードレビューや組織ごとに編成されたプロジェクトなど、使い慣れたワークフローを使用して、パブリックリポジトリとプライベートリポジトリの両方で作業できるようになります。 Giteaは、Drone、Jenkins、GoCDなどのさまざまな継続的インテグレーションおよびデプロイメント(CI / CD)ツールともうまく機能します。 さらに、このようなDockerボリュームを使用すると、ネットワークまたはブロックストレージ上のGit LFS(ラージファイルストレージ)コンテンツに合わせてストレージを拡張できます。