ソフトウェア開発に取り組むときは、効率的で追跡可能な方法でソースコードを管理できることが重要です。ソースコード管理( SCM )システムは、任意の数の開発者と任意のサイズのプロジェクトで作業するための効率的で柔軟なプロセスを提供するための優れた方法です。 CVSからSubVersion、PerforceからMercurialまで、さまざまなSCMソフトウェアが何年にもわたって存在していましたが、現在の業界リーダーはGitであり、GitHubやGitLabなどのサイトの人気で大きな成長を遂げています。
ただし、これらのサービスの無料アカウントは公開のオープンソースリポジトリを対象としているため、プライベートまたはプロプライエタリソフトウェアで作業する機能には開発者のコストがかかります。さらに、リポジトリへのアクセスは外部の組織に委ねられており、多くの人は自分のソフトウェアを最初から最後まで管理することを望んでいます。
そのために、Gogs、Gitea、GitLabなどのいくつかのセルフホストソリューションが過去数年にわたって開発されてきました。このチュートリアルでは、最も人気のあるソリューションの1つであるGiteaをセットアップして、プライベートリポジトリをホストし、ライフサイクル全体を通じて独自のプロジェクトを管理できるようにすることに焦点を当てています。 Giteaは小型で、自己完結型で、軽量であるため、ハードウェア要件に負担をかけることなく、迅速に導入できます。 GiteaのDockerインストールを使用します。これにより、ソフトウェアが最新の状態に保たれます。
このチュートリアルを開始する前に、次のものが必要です。
- root以外のユーザーが
sudo
で構成されたUbuntu20.04サーバー Ubuntu20.04のサーバーの初期設定で説明されている権限。 - サーバーにDockerがインストールされています。 手順1と2に従ってください DockerをインストールするためにUbuntu20.04にDockerをインストールする方法の概要。
- サーバーにインストールされているDockerCompose。 ステップ1に従ってください これを設定するには、Ubuntu20.04にDockerComposeをインストールして使用する方法に関するガイドをご覧ください。
- サーバーを指すドメイン名。 DigitalOcean Dropletを使用している場合は、ドメインとDNSのドキュメントに従うことでこれを実現できます。このチュートリアルでは、
your_domain
全体の例で。
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 )、将来のステップで使用されるため。
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.ymlversion: "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
:環境セクションは、インストールおよび実行中にイメージで使用できる環境変数を指定します。この場合、adduser
の出力で提供されるUIDとGIDを使用して、環境のユーザーとグループIDを指定しています。 手順1のコマンド。-
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接続をリッスンします。 。この場合、ポート3000
を保持しています HTTP接続の場合、同じ番号にマッピングし、通常の22
からGiteaのコンテナのポートをマッピングします。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
を追加できます。 作成コマンドのフラグ:
- docker-compose up -d
コンテナが起動してシェルに戻ると通知が届きます。
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インスタンスに転送するためのリバースプロキシエントリを作成する必要があります。 Nginxのsites-available
に新しいファイルを作成します お好みのテキストエディタを使用してディレクトリ。次の例では、nano
を使用しています :
- sudo nano /etc/nginx/sites-available/gitea
このファイルで、/
へのリクエストを含む新しいサーバーブロックを設定します 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の初期設定ページに入力できるようになっているはずです。
CertbotとLet’s Encryptの無料認証局のおかげで、GiteaインストールアプリにTLS暗号化を追加するには、2つのコマンドしか必要ありません。
まず、CertbotとそのNginxプラグインをインストールします:
- sudo apt install certbot python3-certbot-nginx
次に、certbot
を実行します --nginx
で モードにし、Nginx server_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に切り替わります。
これでサイトは安全になり、ウェブベースのセットアップ手順を安全に続行できます。
Let’s Encryptを使用してドメインを保護する方法の詳細については、Ubuntu 20.04チュートリアルでLet’sEncryptを使用してNginxを保護する方法をご覧ください。
これで、Gitea自体の構成と最初の管理者ユーザーの作成に進むことができます。 https://your_domain
ブラウザで。最初のGitea設定画面には、サービスのいくつかのオプションがあります。
サイトのタイトルなど、これらの一部は特定の使用例に応じて異なりますが、このチュートリアルでは、以下を変更する必要があります。
- サーバードメイン: 手順3で設定したサーバードメイン
- GiteaベースURL: プロトコルを含む、ブラウザでGiteaにアクセスするために使用する完全なURL。例:
https://your_domain
。
設定の変更を保存すると、Giteaログインページに移動します。
注: 設定が保存されると、Giteaサービスが再起動します。これには数秒かかる場合があるため、 502 Bad Gatewayを示すNginxエラーが発生する場合があります 。このエラーが発生した場合は、数秒待ってからページを再起動してください。
まだユーザーがいないため、最初にユーザーを作成する必要があります。 アカウントが必要ですか?をクリックします。今すぐ登録 ログインフォームの下にあるリンクをクリックして、新しいユーザーを登録します。システムの最初のユーザーとして、このユーザーは管理者として作成されます。設定画面でメール設定を行う場合は、最初にアカウントを確認する必要があります。
そのユーザーとしてログインしたら、ページの右上隅にあるユーザーアイコンをクリックしてから、サイト管理をクリックします。 ドロップダウンメニューから、メンテナンスジョブを実行したり、ユーザーアカウントや組織を管理したり、Giteaをさらに構成したりできるページに移動します。
ウェブインターフェースとGit自体の両方でGiteaをテストするには、テストリポジトリを作成します。このリポジトリは後でいつでも削除できます。
+をクリックします ページの右上隅にサインインしてから、+新しいリポジトリをクリックします ドロップダウンメニューから。ここでは、説明、プライベートかどうかなどの設定、README
などのデフォルトのコンテンツなどの情報を使用して、リポジトリに名前を付けてカスタマイズできる画面が表示されます。 または.gitignore
ファイル。
リポジトリの作成を押したら 、試してみるための新しいリポジトリがあります。
プロセスの最後のステップは、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
が存在するため、これらのコマンドはすべてshimで機能します。 ホスト上のボリュームはコンテナ上のボリュームとしてマウントされます。つまり、コンテンツはコンテナ間で共有されます。 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 [email protected] "SSH_ORIGINAL_COMMAND=\"$SSH_ORIGINAL_COMMAND\" $0 $@"
- EOF
このスクリプトのコマンドは、Gitea DockerコンテナーにSSHで接続し、git
で使用された元のコマンドの内容を渡します。 。
最後に、スクリプトが実行可能であることを確認します。
- sudo chmod +x /usr/local/bin/gitea
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(大容量ファイルストレージ)コンテンツに合わせてストレージを拡張できます。