オンプレGitlabの障害対応

## 趣旨
### 「Gitlabが動かなくなった！」と誰かが叫んだら。
Gitlabは経験上、安定して何年も稼働します。それだけに、何かトラブルが発生した時にどこから手を付けて良いのか途方にくれることがあります。そんなあなたに役立つ記事です。
トラブルが発生した時にこの記事を思い出していただければ嬉しいです。

## 便利な日本語情報サイト
下記のサイトは必見です！

GitLab日本語情報サイト
https://www.gitlab.jp/links/
>GitLab日本語情報サイトは、GitLabの情報を日本語で発信するために個人で立ち上げたコミュニティサイトです。

Qiitaのコミュニティサイト
https://qiita.com/organizations/gitlab-jp

## 今回の動作環境
CentOS Linux release 7.9.2009
Gitlab 14.4.1

## トラブルシューティングの初動
:::note warn
まずは基本的なサーバの状態確認を。さんざん調査した後、単なるディスクの容量不足だったことに最後に気づくと悲しいので・・・。
:::
```
top   #どのプロセスがいちばん動作しているのか
df -h #ディスク容量が足りているか
tail /var/log/secure #念のためログイン履歴を確認
```
## Gitlab のバージョンを確認したい
:::note info
grep gitlab /opt/gitlab/version-manifest.txt
を使うと、Gitlabが停止していてもバージョンを確認できます。
:::

```
[root@*** ~]# grep gitlab /opt/gitlab/version-manifest.txt
gitlab-ce 14.4.1
gitlab-config-template       14.4.1                                     
gitlab-cookbooks             14.4.1                                     
gitlab-ctl                   14.4.1                                     
gitlab-exporter              11.2.0                                     
gitlab-healthcheck           90e6447aeead4a29ac9fffc15945ce6b           
gitlab-kas                   v14.4.0                                    git:8b11694dd188b58234e776e3b0bad604145041b3                              
gitlab-pages                 v1.46.0                                    git:5e86747b6287381e2f23afe837ede1820876cf8d                              
gitlab-psql                  7e11364159031db0eb55867ad3d5713b           
gitlab-rails                 v14.4.1                                    git:1a23d731c9f1149b8be1f16a1d781490df288f18                              
gitlab-redis-cli             8866b9c12e308342bc148a794f5cc166           
gitlab-scripts               14.4.1                                     
gitlab-selinux               14.4.1                                     
gitlab-shell                 v13.21.1                                   git:593961bae309e92e9bff550d0231092f44813b06                              
registry                     v3.11.1-gitlab                             git:6d4f158b13bd8528e271f82c56f6af46bb27e6e5     
```

## Gitlab のデーモン（常駐プログラム）類の動作状況の把握
:::note info
sudo gitlab-ctl status
とすると、デーモンが正常動作しているかどうかを確認できます。
ここで "run" ではなく "down" となっていたら、そのデーモンは停止しています。
:::
本家docs：https://docs.gitlab.com/omnibus/maintenance/

```
[root@*** ~]# gitlab-ctl status
run: alertmanager: (pid 25229) 79250s; run: log: (pid 1132) 86984s
run: gitaly: (pid 25247) 79249s; run: log: (pid 1140) 86984s
run: gitlab-exporter: (pid 28452) 78338s; run: log: (pid 1134) 86984s
run: gitlab-pages: (pid 28434) 78340s; run: log: (pid 31761) 84881s
run: gitlab-workhorse: (pid 28418) 78340s; run: log: (pid 1135) 86984s
run: grafana: (pid 25289) 79247s; run: log: (pid 1125) 86984s
run: logrotate: (pid 6399) 44s; run: log: (pid 1137) 86984s
run: nginx: (pid 28427) 78340s; run: log: (pid 1123) 86984s
run: node-exporter: (pid 25315) 79246s; run: log: (pid 1124) 86984s
run: postgres-exporter: (pid 25321) 79245s; run: log: (pid 1138) 86984s
run: postgresql: (pid 25330) 79244s; run: log: (pid 1131) 86984s
run: prometheus: (pid 25343) 79244s; run: log: (pid 1126) 86984s
run: puma: (pid 28660) 78308s; run: log: (pid 1130) 86984s
run: redis: (pid 25362) 79243s; run: log: (pid 1151) 86984s
run: redis-exporter: (pid 25371) 79242s; run: log: (pid 1129) 86984s
run: registry: (pid 28442) 78339s; run: log: (pid 1122) 86984s
run: sidekiq: (pid 28322) 78374s; run: log: (pid 1127) 86984s
```

## とりあえずリスタートする場合
（状況と場合によってはバックアップが先になる場合もあるかもしれませんね。）

:::note info
sudo gitlab-ctl restart
で全体をリスタート
sudo gitlab-ctl restart nginx
でnginxのみをリスタート
:::
本家docs：https://docs.gitlab.com/ee/administration/restart_gitlab.html


## 現在のログを tail で観察/確認
:::note info
sudo gitlab-ctl tail
で最新のログを総合的に調査できます。
何か問題が発生しているとエラーが表示される可能性が高いと言えます。
:::
本家docs：https://docs.gitlab.com/omnibus/settings/logs.html

## 詳細ログ
:::note info
/var/log/gitlab
にログが色々入っています。
問題箇所を絞り込んでからこちらのログを確認するほうが結果として解決が早くなりそうです。
:::
```
[root@*** ~]# cd /var/log/gitlab
[root@*** gitlab]# ls
alertmanager  gitaly           gitlab-pages  gitlab-shell      grafana       logrotate  node-exporter      postgresql  puma         redis           registry
crond         gitlab-exporter  gitlab-rails  gitlab-workhorse  lets-encrypt  nginx      postgres-exporter  prometheus  reconfigure  redis-exporter  sidekiq
```

## Gitlab コミュニティサイト（英語）

### 公式（英語）
アップデート後のトラブルなど、一般的に遭遇しそうなエラーについては下記に最新の情報があります。
検索してみましょう。
https://forum.gitlab.com/

### Stackoverflow
こちらのスタックオーバーフローでも活発に質問と回答が流れます。
https://stackoverflow.com/questions/tagged/gitlab
https://stackoverflow.com/collectives/gitlab


## 問題が判明したら
エラーの文言で検索すると、大抵同じ問題にぶつかった例を見つけることができるでしょう。
解決まであともう少し!
がんばってください。

## Gitlab のアーキテクチャを手っ取り早く理解したい

Gitlabは複数のミドルウェアが組み合わさった複雑なシステムです。
公式情報は下記にあります。

https://docs.gitlab.com/ee/development/architecture.html

### 各種コンポーネントの名称と役割
| 名称 | 概要 | プラン |
|:-----------|------------:|:------------:|
|Certificate Management|認証管理。TLS設定、Let's Encryptなど|CE & EE|	
|Consul|データベースノードの検出、フェイルオーバー |EEのみ|
|Database Migrations|データベースのマイグレーション（移行）|CE & EE|
|Elasticsearch|GitLab内の高機能全文検索|EEのみ|
|Gitaly|Git RPCサービス。GitLabが行うすべてのGit呼び出しを処理|CE & EE|
|GitLab Exporter|GitLabメトリクスを生成|CE & EE|
|GitLab Geo Node|地理的に分散したGitLabノード| EEのみ|
|GitLab Pages |静的ページをホスト| CE & EE|
|GitLab Kubernetes Agent|Kubernetesクラスターを統合| EEのみ|
|GitLab self-monitoring: Alertmanager|Prometheusからのアラートをグループ化、ルーティング| CE & EE|
|GitLab self-monitoring: Grafana|メトリックスダッシュボード| CE & EE|
|GitLab self-monitoring: Jaeger|GitLabインスタンスが生成したViewのトレース| CE & EE|
|GitLab self-monitoring: Prometheus|時系列データベース、メトリクス収集、クエリサービス| CE & EE|
|GitLab self-monitoring: Sentry|GitLabインスタンスで発生したエラーの追跡| CE & EE|
|GitLab Shell|SSHセッションでのgit処理|CE & EE|
|GitLab Workhorse|スマートなリバースプロキシ。大規模なHTTPリクエストの処理|CE & EE|
|Inbound email (SMTP)|メッセージを受信して、課題（イシュー）を更新|CE & EE|
|Jaeger integration|デプロイされたアプリケーションの分散型トレース|EEのみ|
|LDAP Authentication|LDAPディレクトリ・ユーザー認証|CE & EE|
|Mattermost|オープンソースのSlack代替サービス| CE & EE|
|MinIO|オブジェクト・ストレージ・サービス|CE & EE|
|NGINX|リクエストを適切なコンポーネントにルーティングし、SSL処理|CE & EE|
|Node Exporter|Prometheusエンドポイント|CE & EE|
|Outbound email (SMTP)|電子メールをユーザーへ送信|CE & EE|
|Patroni|PostgreSQL HAクラスターのリーダーとレプリケーションの管理|EEのみ|
|PgBouncer Exporter|PgBouncerメトリクスに関するPrometheusエンドポイント|CE & EE|
|PgBouncer|データベース接続プーリング、フェイルオーバー|EEのみ|
|PostgreSQL Exporter|PostgreSQL メトリクスのPrometheus エンドポイント|CE & EE|
|PostgreSQL|データベース|CE & EE|
|Praefect|任意のGitクライアントとGitalyストレージノード間の透過プロキシ|CE & EE|
|Puma(GitLab Rails)|ウェブインターフェイスとAPIへのリクエスト処理|CE & EE|
|Redis Exporter|RedisメトリクスのPrometheusエンドポイント|CE & EE|
|Redis|キャッシングサービス|CE & EE|
|Registry|イメージのプッシュ／プルを可能にするコンテナレジストリ|CE & EE|
|Runner|GitLab CI/CDジョブの実行|CE & EE|
|Sentry integration|デプロイされたアプリのエラートラッキング|CE & EE|
|Sidekiq|バックグラウンドジョブプロセッサ|CE & EE|