QNAP Container Station Gitea Git Server 構築
「TS-h1283XU-RP」上のコンテナ(Container Station)で Gitea Server を構築します。
基本のセットアップ方法については、「QNAP QuTS hero 5 セットアップ」をご覧ください。
ページ内目次
Gitea って何?
セルフホスト可能なGitサービスのサーバーを構築します。
有名どころに、 GitLab, Gitea, Forgejo などがあります。
個人的にGitLabは規模が大きすぎると思っているので、GiteaかForgejoになります。(ForgejoはGiteaからForkしました)
Forgejoのほうが良さそうに見えるのですが、DockerHub上に無いのでそこが少し手間です。
QNAPではデフォルトでDockerHubのみとなるので、手間を省く上でGiteaを選択しました。
Gitea を Container Station に設定
詳細はこちらにある通りで、このDockerイメージを動かす場合には、ユーザー情報のデータベース、その他環境変数の設定が必要になります。
rootlessイメージを使用すると内部ではroot権限ではなく一般権限で動作します。
そのため指定出来るポート番号の範囲の違いや、UID/GIDの違い、保存先ディレクトリの違いがあります。
- https://docs.gitea.com/installation/install-with-docker-rootless
- https://docs.gitea.com/installation/install-with-docker
セキュリティ上、気にする場合はrootless版にしておけばいいと思います。
ただ、そもそもコンテナで隔離されている環境になるので、個人的にはどちらでも良いと思います。
(このroot権限が影響されるようなDocker自体の脆弱性があればそれどころではなく大事になっています)
私はあまりrootless版の意図がわからないですが、今回は環境変数設定を省けるrootless版を使用することにします。
(ただ、UID/GIDが決め打ちになるので、保存されたファイルを扱う時点で少し気を使います)
事前準備
保存先として以下のディレクトリを作成します。(rootless版のデフォルトなのでroot版は適宜読み替えてください)
- /share/Container/gitea/data/
- /share/Container/gitea/config/
デフォルトで生成された「/share/Container」以下、適当に「gitea」フォルダにしましたが何でもいいと思います。
コマンド例:
mkdir -p /share/Container/gitea/data/ && mkdir -p /share/Container/gitea/config/
Dockerコンテナの設定
「Container Station」を開き、「コンテナ」タブから「探索」ボタンを押してDockerHubからgiteaを探します。
「コンテナまたはアプリケーションの作成」という画面が表示されるので、検索欄に「gitea」などと入力して「gitea/gitea」を探します。
「gitea/gitea」の右に表示される「デプロイ」ボタンを押します。
確認画面が表示されますが、gitea公式なので大丈夫でしょう。
イメージバージョンの選択画面になるので、latestからlatest-rootlessに変更して進めます。
バージョンにこだわる人はlatestではないタグを指定していいと思います。
コンテナ作成の画面になるので、以下のように設定していきます。
- 名前:任意(わかりやすいもの)
- 設定・再起動ポリシー:「停止時以外」
- ネットワーク設定・露出ポート:2222/tcp, 3000/tcp
- ネットワーク設定・デフォルトの Web URL ポート:無効
ホスト側のポート番号も同様に設定しておきましょう。
「詳細設定」をクリックして、詳細設定に進む。
「ストレージ」ページ
もとからボリュームとして追加されていますが、
「ボリュームの追加」ボタン横の矢印から「マウントされたホストのパスをバインド」を選択して追加。
- ホスト「/Container/gitea/config」に対してコンテナ「/etc/gitea」(設定保存先)
- ホスト「/Container/gitea/data」に対してコンテナ「/var/lib/gitea」(データ保存先)
この設定でコンテナ内のディレクトリをファイルシステムにマッピングさせます。
なおrootless版では生成されるファイルのUID/GIDは1000:1000で現状固定されています。
バックアップ等のファイル操作時には、パーミッション等にご注意ください。
また、名前解決を行うために以下の設定を入れましょう。
- ホスト「/Container/hosts」に対してコンテナ「/etc/hosts」をROで追加
これはLDAP接続のドメイン名解決のためなので必須ではないです。
なぜ「/Container/hosts」ファイルにするのかは、「QNAP QuTS hero 5 セットアップ」をご覧ください。
確実な時刻同期のために「/etc/localtime」をROで追加してもいいかもしれません。
LDAP接続を行う場合にLDAPSを使用する際、証明書が必要になる場合があります。
Let's Encrypt等のサービスで証明書を発行している場合、Dockerイメージにはca-certificates(ルート証明書)が含まれているので、追加のファイルは必要ありません。
そうでない場合は /usr/local/share/ca-certificates/ 配下に .crt拡張子で証明書をマウント後、update-ca-certificatesコマンドを実行する必要があると思います。
設定が完了したら、実行してみましょう。
無事 Gitea Server が起動してくれば、 http://[QNAPのIPアドレス]:3000 でインストール画面にアクセスできます。
Gitea の初期設定
以下の設定は /etc/gitea/app.ini に書き込まれるもので、あとからWebUIから変更はできないものです。
(ファイルを直接書き換える場合は、反映するためにDockerコンテナの再起動が必要です)
細かい設定はWebUIから出来ないのもあるので、その場合はapp.iniの編集とDockerコンテナの再起動が必要です。
データベース設定
MySQL、PostgreSQL、MSSQL、SQLite3に対応しているようです。
そんなに規模は大きくならない予定なのでSQLiteのまま使用します。
- データベースのタイプ:SQLite3(変更無し)
- パス:/var/lib/gitea/data/gitea.db(変更無し)
基本設定
- サイトタイトル:gitea.example.com(任意)
- リポジトリのルートパス:/var/lib/gitea/git/repositories
- Git LFSルートパス:/var/lib/gitea/git/lfs
- 実行ユーザー名:git
- サーバードメイン:gitea.example.com(環境に合わせて)
- SSHサーバーのポート:2222
- Gitea HTTPポート:3000
- GiteaのベースURL:https://gitea.example.com/(環境に合わせて)
- ログの保存先パス:/var/lib/gitea/data/log
- アップデートチェッカーを有効にする:(任意)
実行ユーザー名は内部で使用するユーザー名の話になると思うので、Docker環境でなおかつUID/GIDが決め打ちの環境では設定の意味は無さそうです。
私はGiteaをリバースプロキシ以下に配置するので、ベースURLは環境に合わせて変更しておきます。
HTTP/2対応の環境(私はApacheリバースプロキシ)では、通知更新の/user/eventsのロングポーリングで他のリクエストをブロックしてしまう場合があるようです。
手元の環境もそうで、ページを開くのに10秒以上かかる場合がありました。その時はHTTP/1.1に戻せば解決します。
私はApacheの設定中、バーチャルホスト内で「Protocols http/1.1」設定を追加して、HTTP/2を無効にしました。
<VirtualHost *:443>
ServerName gitea.example.com
Protocols http/1.1
Web周りの設定については、「QNAP QuTS hero 5 セットアップ」をご覧ください。
オプション設定 - メール設定
メール設定も入れておきます。
- https://support.google.com/a/answer/176600?hl=ja
- https://support.google.com/mail/answer/185833?hl=ja
この辺を参考にして、アプリパスワードを作成しておきます。
- SMTPホスト:smtp.gmail.com
- SMTPポート:465
- メール送信者:no-reply@example.com(メールでの送信元のメールアドレス)
- SMTPユーザー名:no-reply@example.com(Googleアカウントのメールアドレス)
- SMTPパスワード:abcdefghijklmnop(発行したアプリパスワード)
- 登録にはメールによる確認が必要:無効
- メール通知を有効にする:無効→有効(変更済み)
オプション設定 - サーバーと外部サービスの設定
仲間内で小規模の使用用途なので、登録やOpenIDを無効にしておきます。
- ローカルモードを有効にする:有効
- Gravatarを無効にする:有効
- フェデレーテッド・アバターを有効にする:無効
- OpenIDを使ったサインインを有効にする:有効→無効(変更済み)
- セルフ登録を無効にする:無効→有効(変更済み)
- 外部サービスを使用した登録のみを許可:無効
- OpenIDを使ったセルフ登録を有効にする:有効→無効(変更済み)
- 登録時のCAPTCHAを有効にする:無効
- ページ閲覧にサインインが必要:無効
- デフォルトでメールアドレスを隠す:無効→有効(変更済み)
- デフォルトで組織の作成を許可:有効
- デフォルトでタイムトラッキング有効:有効
- メールを隠すときのドメイン:noreply.example.com(変更済み)
- パスワードハッシュアルゴリズム:pbkdf2
次のアルゴリズムが使えます。(pbkdf2, argon2, bcrypt, scrypt, pbkdf2_hi)
安全のためには、argon2, scrypt, pbkdf2_hi あたりを選択するべきですが、メモリ消費や計算時間などの兼ね合いがあるので、デフォルトのpbkdf2でも良いとは思います。
オプション設定 - 管理者アカウントの設定
「管理者アカウントの作成は任意です。 最初に登録したユーザーは自動的に管理者になります。」との表示があります。
- 管理者ユーザー名:admin(例)
- メールアドレス:admin@example.com(例)
- パスワード:
- パスワード確認:
後述のLDAP設定に管理者アカウントが必要なので作成しておきます。
(通常使用するユーザーはLDAPで認証をかけたいので、設定をするために管理者アカウントを別に作りたかったのです)
ここまで入力して「Giteaをインストール」ボタンを押せば、インストールが行われます。
比較的すぐ終わり、管理者アカウントを作成した場合、ログイン後の画面に遷移します。
LDAP 設定の方法
例として「 QNAP Container Station LLDAP Server 構築」設定済みとします。
LDAPで認証する場合、初期のインストールメニューには設定画面が出ないので、ログイン後に設定します。
管理者ユーザーを作成して、ログイン後、右上のメニュー内「サイト管理」アイコンより設定画面を開きます。
管理設定中の「アイデンティティとアクセス」「認証ソース」の順に開きます。
「認証ソースの管理」画面が開いたら右上の「認証ソースを追加」ボタンを押します。
認証ソースを追加
- 認証タイプ:LDAP (via BindDN)
- 認証名:(任意の名前)
- セキュリティプロトコル:LDAPS
- ホスト:ldap.example.com(接続先情報)
- ポート:6360
- TLS検証を省略:無効(LDAPS選択時に現れる・自己署名証明書の場合セキュリティ低下承知で無効化可能)
- バインドDN:uid=ldap-readonly,ou=people,dc=ldap,dc=example,dc=com
- バインドパスワード:(LDAP中ldap-readonlyパスワード)
- ユーザー検索ベース:ou=people,dc=ldap,dc=example,dc=com
- Userフィルター:(&(objectClass=person)(|(uid=%[1]s)(mail=%[1]s)))
- Adminフィルター:
- 制限付きフィルター:
- ユーザー名:uid
- 名:givenName
- 姓:sn
- メールアドレス:mail
- SSH公開鍵:
- アバター:jpegPhoto
- LDAPグループを有効にする:無効
- ページ分割検索を使用:無効
- ローカルの2要素認証をスキップ:無効
- サーチ結果が空のときは全ユーザーを非アクティブ化:無効
- バインドDNのコンテクストから属性を取得する:無効
- ユーザー同期を有効にする:有効
- 認証ソースはアクティベート済み:有効
「認証ソースを追加」ボタンを押すとその時点からLDAP認証でのサインインが可能になります。
バインドユーザーを除外したい場合は、Userフィルターを以下のようにしてもいいかもしれません。
(&(objectClass=person)(|(uid=%[1]s)(mail=%[1]s))(!(uid=ldap-readonly)))
LLDAPを使用する上での設定例は以下を参照。
ユーザー同期を有効にしていると、LDAP側のユーザーがGitea側に作成されます。
この同期タスクは定期的に実行されるが即時実行するオプションはなく、Giteaを再起動するしか実行方法はないようです。
無効にした場合は、ユーザー作成以外に既存のユーザーの情報同期もされなくなるようなので、小規模な運用では同期を有効にするしかなさそうです。
認証タイプ:LDAP (simple auth)にするとログイン時にユーザーの情報でLDAPサーバーに問い合わせるため、その際にアカウント作成ということも可能ではあります。
この場合は、ログイン毎にしかLDAP側の情報が反映されない上、ログイン時にLDAPサーバーにアクセスされるので、運用に合わせて選ぶと良いと思います。
ユーザー情報を得るためのバインドするユーザーを選択しなくて良いということもあります。
どちらにせよLDAPのユーザーが作成されて、デフォルトではパブリックでユーザー一覧が公開されてしまうので、LDAP設定を入れる前に以下の設定をapp.iniに入れてデフォルトのプロフィール公開をプライベートにしておくと良いかもしれません。
[service]
DEFAULT_USER_VISIBILITY = private
もちろん管理者権限でプロフィールを編集してもいいですし、各ユーザーに任せても構いません。
各ユーザーは、ユーザー設定、プロフィール中にあるプライバシー、ユーザーの公開範囲で設定可能です。
また、デフォルトのブランチ名はmasterのままで慣れているので、私はapp.iniに以下の設定を入れました。
[repository]
DEFAULT_BRANCH = master
Gitea の使用方法
といっても、GitHubと同様に使えるので特に解説することもなさそうです。
Giteaでも、クライアントとしてGitHub Desktopは使用できます。
Gitの使い方自体は以下にまとめてあります。
