序章

ソフトウェア開発に取り組むときは、効率的で追跡可能な方法でソースコードを管理できることが重要です。 ソースコード管理( SCM )システムは、任意の数の開発者が任意のサイズのプロジェクトで作業するための効率的で柔軟なプロセスを提供する優れた方法です。 CVSからSubVersion、PerforceからMercurialまで、さまざまなSCMソフトウェアが長年にわたって存在していましたが、現在の業界リーダーは Git であり、GitHubやGitLabなどのサイトの人気で大きな成長を遂げています。 。

ただし、これらのサービスの無料アカウントは公開のオープンソースリポジトリを対象としているため、プライベートまたはプロプライエタリソフトウェアで作業する機能には開発者のコストがかかります。 さらに、リポジトリへのアクセスは外部の組織に委ねられており、多くの人は自分のソフトウェアを最初から最後まで制御することを好みます。

そのために、 Gogs Gitea GitLabなどのいくつかのセルフホストソリューションが過去数年にわたって開発されてきました。 このチュートリアルでは、最も人気のあるソリューションの1つであるGiteaをセットアップして、プライベートリポジトリをホストし、ライフサイクル全体を通じて独自のプロジェクトを管理できるようにすることに焦点を当てています。 Giteaは小型で、自己完結型で、軽量であるため、ハードウェア要件に負担をかけることなく、迅速に導入できます。 GiteaのDockerインストールを使用します。これにより、ソフトウェアが最新の状態に保たれます。

前提条件

このチュートリアルを開始する前に、次のものが必要です。

  • root以外のユーザーがで構成されたUbuntu20.04サーバー sudo 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の値をメモします(この場合、UIDは 112 およびのGID 119)、将来のステップで使用されるため。

ステップ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:環境セクションは、インストールおよび実行中にイメージで使用できる環境変数を指定します。 この場合、出力で提供されるUIDとGIDを使用して、環境のユーザーIDとグループIDを指定しています。 adduser 手順1のコマンド。
    • restart: always:この行は、コンテナ自体がダウンしたか、ホストマシンがダウンしたかに関わらず、コンテナがダウンした場合は常にコンテナを再起動するようにDockerに指示します。 基本的に、Giteaは起動時に起動します。
    • networks:これは、Giteaサービスが上記のネットワークにアクセスしてアクセスできることを指定します。
    • ./gitea:/data/home/git/.ssh/:/data/git/.ssh:これらは、Giteaがリポジトリと関連データを保存する場所です。 現在、これはという名前のフォルダにマップされています gitea 現在のディレクトリにあります。 Dockerは、コンテナーが存在しない場合、コンテナーの起動時にこのフォルダーを作成します。 The .ssh フォルダについては、後の手順6で詳しく説明します。
    • /etc/timezone/etc/localtime:これらの2つのファイルには、ホストマシンのタイムゾーンと時刻に関する情報が含まれています。 これらを読み取り専用ファイルとしてコンテナに直接マッピングすることにより(最後のファイルで指定) :ro 定義の一部)、コンテナはホストと同じ情報を持ちます。
    • ports:Giteaは2つのポートで接続をリッスンします。 ポートでHTTP接続をリッスンします 3000、ソースコードリポジトリのWebインターフェイスを提供し、ポートでSSH接続をリッスンします 22. この場合、あなたはポートを維持しています 3000 HTTP接続の場合、同じ番号にマッピングし、Giteaのコンテナのポートを通常の状態からマッピングします 222222 ポートの衝突を避けるため。 ステップ6では、要求に応じてトラフィックをGiteaに転送するようにSSHシムを設定します。

注:これは、Gitea用のDockerComposeファイルの最小限の例です。 MySQLまたはPostGreSQLをバッキングデータベースとして使用したり、ストレージ用の名前付きボリュームを使用したりするなど、他にもいくつかのオプションを含めることができます。 この最小限のセットアップでは、SQLiteをバッキングデータベースとして使用し、ボリュームは次の名前のディレクトリを使用します gitea 保管用。 これらのオプションの詳細については、Giteaのドキュメントをご覧ください。

ファイルを保存して閉じます。 使用した場合 nano ファイルを編集するには、を押して編集できます CTRL + X, Y、 その後 ENTER.

このファイルを配置したら、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 作成コマンドへのフラグ:

  1. docker-compose up -d

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

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

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

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

  1. sudo apt update

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

  1. sudo apt install nginx

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

  1. sudo ufw allow "Nginx Full"

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

この時点で、着信トラフィックをNginx経由でDockerで実行されているGiteaインスタンスに転送するためのリバースプロキシエントリを作成する必要があります。 Nginxで新しいファイルを作成します sites-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は、それらのファイルが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 モードにし、Nginxで使用したものと同じドメインを指定します server_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自体の構成と最初の管理者ユーザーの作成に進むことができます。 を開いてGiteaインスタンスにアクセスします https://your_domain ブラウザで。 最初のGitea設定画面には、サービスのいくつかのオプションがあります。

サイトタイトルなど、これらの一部は特定のユースケースに依存しますが、このチュートリアルの目的のために、以下を変更する必要があります。

  • サーバードメイン:手順3で設定したサーバードメイン
  • GiteaベースURL:ブラウザでGiteaにアクセスするために使用する完全なURL(プロトコルを含む)。 例えば、 https://your_domain.

設定の変更を保存すると、Giteaのログインページに移動します。

注:構成が保存されると、Giteaサービスが再起動します。 これには数秒かかる場合があるため、 502 BadGatewayを示すNginxエラーが発生する場合があります。 このエラーが発生した場合は、数秒待ってからページを再起動してください。

まだユーザーがいないため、最初にユーザーを作成する必要があります。 クリックアカウントが必要です? 今すぐ登録ログインフォームの下にあるリンクをクリックして、新しいユーザーを登録します。 システムの最初のユーザーとして、このユーザーは管理者として作成されます。 設定画面でメール設定を行う場合は、最初にアカウントの確認が必要になる場合があります。

そのユーザーとしてログインしたら、ページの右上隅にあるユーザーアイコンをクリックし、ドロップダウンメニューからサイト管理をクリックすると、次のページに移動します。メンテナンスジョブを実行し、ユーザーアカウントと組織を管理し、さらにGiteaを構成することができます。

テストリポジトリの作成

ウェブインターフェースとGit自体の両方でGiteaをテストするには、テストリポジトリを作成します。 このリポジトリは後でいつでも削除できます。

ページの右上隅にある+記号をクリックし、ドロップダウンメニューから+新しいリポジトリをクリックします。 ここでは、説明、プライベートかどうかなどの設定、およびなどのデフォルトのコンテンツを使用して、リポジトリに名前を付けてカスタマイズできる画面が表示されます。 README また .gitignore ファイル。

リポジトリの作成を押すと、新しいリポジトリを試してみることができます。

ステップ6—SSHシムの設定

プロセスの最後のステップは、SSHシムを使用してホストマシンを準備することです。 GiteaはDockerコンテナで実行されているため、デフォルトのポートでSSH接続を受け入れることはできません。 22、これはホストと衝突するためです。 の中に docker-compose.yml 上で作成したファイルで、Dockerはホスト上のポートをポートにマップするように指示されました 22 ポートへのSSH接続を受け入れるようにコンテナ上で 2222. さらに、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 $@"
  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 git@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(ラージファイルストレージ)コンテンツに合わせてストレージを拡張できます。