序章

ソフトウェア開発に取り組むときは、効率的で追跡可能な方法でソースコードを管理できることが重要です。 ソースコード管理( 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にアクセスできるように、最初に完了します。

まず、これらの接続を受け入れるホスト上にユーザーを作成します。

  1. sudo adduser --system --shell /bin/bash --gecos 'Git Version Control' --group --disabled-password --home /home/git git

このコマンドでは、シェルとして bash を使用するが、ログインパスワードを持たないシステムユーザーを作成します。 これにより、sudoを使用してそのユーザーとしてコマンドを実行できますが、そのユーザーとしてログインすることはできません。 また、ユーザーのホームディレクトリを/home/gitに設定します。

このコマンドは、作成したばかりのユーザーに関する情報を出力します。

Output
Adding 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を使用します。

まず、サービスをホストするディレクトリを作成し、次のように入力します。

  1. mkdir ~/gitea
  2. cd ~/gitea

そこで、お好みのテキストエディタを使用してdocker-compose.ymlというファイルを作成します。 次の例では、nanoを使用しています。 このファイルには、Giteaインストールの一部として実行されるコンテナの説明が含まれています。

  1. 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 + XYENTERの順に押すと編集できます。

このファイルを配置したら、DockerComposeを使用してコンテナを起動できます。

  1. 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コマンドに追加できます。

  1. docker-compose up -d

コンテナが起動してシェルに戻ると通知が届きます。

ステップ3—リバースプロキシとしてのNginxのインストール

ApacheやNginxなどの最新のサーバーソフトウェアは、1台のマシンで複数のサービスをより簡単に処理し、複数のサーバー間で負荷を分散し、SSLを処理できるため、リバースプロキシの背後でGiteaなどのWebサービスを実行するのが一般的です。 さらに、これにより、標準のHTTP(S)ポートで実行されているGiteaインスタンスを指すドメイン名を設定できます。

このチュートリアルでは、Nginxを使用します。 まず、ホストマシンのパッケージリストを更新します。

  1. sudo apt update

次に、aptを使用してNginxをインストールします。

  1. sudo apt install nginx

ここで、ファイアウォールufwを使用しているため、次のポートへのアクセスを許可する必要があります。

  1. sudo ufw allow "Nginx Full"

これをインストールすると、http://your_domainにアクセスして、ブラウザでサーバーにアクセスできるようになります。 これにより、Nginxを歓迎する非常にわかりやすいページが表示されます。

この時点で、着信トラフィックをNginx経由でDockerで実行されているGiteaインスタンスに転送するためのリバースプロキシエントリを作成する必要があります。 お好みのテキストエディタを使用して、Nginxsites-availableディレクトリに新しいファイルを作成します。 次の例では、nanoを使用しています。

  1. 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つを作成する必要があります。

  1. sudo ln -s /etc/nginx/sites-available/gitea /etc/nginx/sites-enabled/gitea

Nginxを再起動して変更を公開する前に、Nginx自体に、構成をテストしてそれらの変更が有効であることを確認してもらう必要があります。

  1. sudo nginx -t

すべて問題がなければ、このコマンドは次のような出力を返します。

Output
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful

問題がある場合は、それが何でどこにあるかを教えてくれます。

この変更を進める準備ができたら、Nginxシステムサービスを再起動します。

  1. sudo systemctl restart nginx

これで、ブラウザでhttp://your_domainにアクセスすると、Giteaの初期設定ページで入力できるようになっているはずです。

ステップ4—CertbotのインストールとTLS証明書の設定

CertbotとLet’sEncryptの無料認証局のおかげで、GiteaインストールアプリにTLS暗号化を追加するのに必要なコマンドは2つだけです。

まず、CertbotとそのNginxプラグインをインストールします。

  1. sudo apt install certbot python3-certbot-nginx

次に、certbot--nginxモードで実行し、Nginxserver_name構成ディレクティブで使用したものと同じドメインを指定します。

  1. sudo certbot --nginx -d your_domain_here

Let’s Encryptの利用規約に同意し、メールアドレスを入力するよう求められます。

その後、すべてのHTTPトラフィックをHTTPSにリダイレクトするかどうかを尋ねられます。 それはあなた次第ですが、これは一般的に推奨され、安全に行うことができます。

その後、Let’s Encryptがリクエストを確認し、Certbotが証明書をダウンロードします。

Output
Congratulations! 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キーを作成する必要があります。 これは以下の手順でのみ使用され、ホスト外の人と共有されることはありません。

  1. sudo -u git ssh-keygen -t rsa -b 4096 -C "Gitea Host Key"

このコマンドは、sudoを使用して、上記で作成したユーザーとしてSSHキーを作成します。 この場合、キーは4096ビットのRSAキーになります。 キーに使用するパスワードやキーファイルの名前など、一連の質問が表示されます。 それぞれについてENTERを押し、デフォルトを受け入れるために空白のままにします。

警告:キーにパスワードを設定すると、シムを使用できなくなります。

Giteaコンテナ内のユーザーがこのキーを受け入れることを確認する必要があります。 これを行うには、.ssh/authorized_keysファイルに追加します。

  1. sudo -u git cat /home/git/.ssh/id_rsa.pub | sudo -u git tee -a /home/git/.ssh/authorized_keys
  2. 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に書き込みます。

  1. cat <<"EOF" | sudo tee /usr/local/bin/gitea
  2. #!/bin/sh
  3. ssh -p 2222 -o StrictHostKeyChecking=no [email protected] "SSH_ORIGINAL_COMMAND=\"$SSH_ORIGINAL_COMMAND\" $0 [email protected]"
  4. EOF

このスクリプトのコマンドは、Gitea DockerコンテナーにSSHで接続し、gitで使用されていた元のコマンドの内容を渡します。

最後に、スクリプトが実行可能であることを確認します。

  1. sudo chmod +x /usr/local/bin/gitea

GitSSH接続のテスト

SSHキーをGiteaユーザーに追加することで、GiteaインスタンスのGitリポジトリからのプルとプッシュをテストできます。

SSH公開鍵の内容が必要になります。 これは通常、キーの作成時に使用したアルゴリズムに応じて、~/.ssh/id_rsa.pubのような名前のファイルに存在します。

  1. cat ~/.ssh/id_rsa.pub

注:初めてSSHキーを作成する必要がある場合は、この Ubuntu20.04チュートリアルでSSHキーを設定する方法を使用して作成する方法を学ぶことができます。

このコマンドの出力をコピーします。

Giteaで、右上隅にあるユーザーアイコンをクリックし、設定を選択します。 設定ページでは、上部に一連のタブがあります。 SSH / GPGキーをクリックし、SSHキーの管理の横にあるキーの追加ボタンをクリックします。 フォームの大きなテキスト領域にキーを貼り付け、その下にあるキーの追加ボタンをクリックします。

次に、手順3で作成したテストリポジトリに移動し、提供されたSSHURLをコピーします。 ローカルマシンで、リポジトリのクローンを作成します。

  1. git clone [email protected]your_domain:username/test

これはSSHを使用してリポジトリのクローンを作成します。 SSHキーにパスワードを設定している場合は、パスワードを入力するように求められます。

そのディレクトリに移動し、新しいファイルを作成します。

  1. cd test
  2. touch just_testing

次に、それを段階的な変更に追加します。

  1. git add just_testing

最後に、そのファイルをコミットします。

  1. git commit -am "Just testing pushing over SSH!"

これで、変更をリモートリポジトリにプッシュできるようになります。

  1. git push origin master

ブラウザでページを更新すると、新しいファイルがリポジトリに表示されます。

結論

ソースコードリポジトリをセルフホストするために、Dockerを使用してGiteaサービスを設定しました。 ここから、プルリクエストコードレビューや組織ごとに編成されたプロジェクトなど、使い慣れたワークフローを使用して、パブリックリポジトリとプライベートリポジトリの両方で作業できるようになります。 Giteaは、Drone、Jenkins、GoCDなどのさまざまな継続的インテグレーションおよびデプロイメント(CI / CD)ツールともうまく機能します。 さらに、このようなDockerボリュームを使用すると、ネットワークまたはブロックストレージ上のGit LFS(ラージファイルストレージ)コンテンツに合わせてストレージを拡張できます。