【Arch Linux】GitLab インストール方法(サブディレクトリでの構築)

#ArchLinux Gitlab Install
GitlabをNginxのサブディレクトリでのアクセス方法が詰まったので備忘録も兼ねて記事を投稿します。
➤https://archdaisuki.com/gitlab
※こんな感じでアクセスしたい



【Archwiki GitLab】
https://wiki.archlinux.org/index.php/GitLab
※上記Archwikiを参考にしながら作業してください


##今回の構成
|software|version|
|:-----------------|:------------------|
| ArchLinux   |4.18.5 |
| nginx | 1.14.0|
|gitlab |  11.2.3-1 |
|PostgreSQL|10.5|
|Redis| 4.0.11|



##GitLabとは？
GitLab のホームページ より:
>
GitLab は git リポジトリの管理、コードレビュー、イシュートラッキング、アクティビティフィード、wiki を提供します。エンタープライズは自社運用な GitLab をインストールして LDAP や Active Directory サーバーと接続してセキュアな認証を行います。単一の GitLab サーバーだけで 25,000 以上のユーザーを管理することができますが、サーバーを複数用意すれば更に多数のユーザーを使えるようにすることが可能です。
>

###ディレクトリ構成
ArchLinuxのgitlab パッケージは GitLab のファイルを Linux の標準的な慣習にそって以下のようにインストールしています。
通常のgitlabの構成と違うので注意してください。

|説明|GitLab 公式|gitlab|
|:----|:----|:----|
| GitShell の設定ファイル   | /home/git/gitlab-shell/config.yml |/etc/webapps/gitlab-shell/config.yml|
| GitLab の設定ファイル   | /home/git/gitlab/config/gitlab.yml |	/etc/webapps/gitlab/gitlab.yml|
| ユーザー (ホームディレクトリ)   |git (/home/git) |	gitlab (/var/lib/gitlab)|

##インストール
GitLab は Redis とデータベースバックエンドを必要です。
またWebサーバとしてnginxを使用

今回はデータベースとしてPostgreSQLを採用
・[Redis](https://wiki.archlinux.jp/index.php/Redis)
・[PostgreSQL](https://wiki.archlinux.jp/index.php/PostgreSQL)

###Redis
下記記事参照
[ArchLinux　Redis起動方法](https://qiita.com/Gen_Arch/items/4fed572dd54a289a8dd3)

###PostgreSQL
インストール

```shell-session
sudo pacman -S postgresql
```

postgresユーザーのシェルに変更

```shell-session
sudo -u postgres -i
```
データベースクラスタを初期化

```shell-session
initdb --locale $LANG -E UTF8 -D '/var/lib/postgres/data'
```
上記コマンドの説明:

・　--locale は /etc/locale.conf ファイルに定義されているロケールを指定します。
・　-E はデータベースのデフォルトエンコーディングです。
・　-D はデータベースクラスタが保存されるデフォルトのディレクトリです。

exit で通常ユーザーに戻り、サービス起動

```shell-session
sudo systemctl start postgresql
```
※データベース設定については後述

##nginx
```shell-session
sudo pacman -S nginx
sudo systemctl start nginx
```


###GitLab
インストール

```shell-session
sudo pacman -S gitlab
```

##Gitlab基本設定
###GitLabの設定
GitLabアクセスの際のURL設定
今回の設定例URLはこちら[https://archdaisuki.com/gitlab]
設定は下記

```yaml:/etc/webapps/gitlab/gitlab.yml
## GitLab settings
  gitlab:
    host: archdaisuki.com
    https: true
    relative_url_root: /gitlab
    #port: 443　※ポートの変更がないなら特に変更不要
```

最後に uploads ディレクトリに適切なパーミッションを設定

```
sudo chmod 700 /var/lib/gitlab/uploads
```

###GitLab Shellの設定

```yaml:/etc/webapps/gitlab-shell/config.yml
# GitLab user. git by default
user: gitlab

# URL to GitLab instance, used for API calls. Default: http://localhost:8080.
# For relative URL support read http://doc.gitlab.com/ce/install/relative_url.html
# You only have to change the default if you have configured Unicorn
# to listen on a custom port, or if you have configured Unicorn to
# only listen on a Unix domain socket. For Unix domain sockets use
# "http+unix://<urlquoted-path-to-socket>", e.g.
# "http+unix://%2Fpath%2Fto%2Fsocket"
gitlab_url: "http://localhost:8080/gitlab"
```
※ここで設定するのはgitlab サーバー (unicorn)が動作するURL

###unicornの設定
```yaml:/etc/webapps/gitlab/unicorn.rb
ENV['RAILS_RELATIVE_URL_ROOT'] = "/gitlab"
```

###Secret strings
認証トークンなどの生成に使用?(よくわかってない)

```shell-session
sudo hexdump -v -n 64 -e '1/1 "%02x"' /dev/urandom > /etc/webapps/gitlab/secret
sudo chown root:gitlab /etc/webapps/gitlab/secret
sudo chmod 640 /etc/webapps/gitlab/secret
```

```shell-session
sudo hexdump -v -n 64 -e '1/1 "%02x"' /dev/urandom > /etc/webapps/gitlab-shell/secret
sudo chown root:gitlab /etc/webapps/gitlab-shell/secret
sudo chmod 640 /etc/webapps/gitlab-shell/secret
```

###Redisの設定
```yaml:/etc/webapps/gitlab/resque.yml

development: 
  url: unix:/run/redis/redis.sock
test: 
  url: unix:/run/redis/redis.sock
production:
  url: unix:/run/redis/redis.sock
```

```yaml:/etc/webapps/gitlab-shell/config.yml
# Redis settings used for pushing commit notices to gitlab
redis:
  bin: /usr/bin/redis-cli
  host: 127.0.0.1
  port: 6379
  # pass: redispass # Allows you to specify the password for Redis
  database: 5 # Use different database, default up to 16
  socket: /run/redis/redis.sock # uncomment this line
  namespace: resque:gitlab
```
設定変更後、gitlab ユーザーを redis グループに追加。

```shell-session
sudo gpasswd -a gitlab redis
```

###Serviceファイルの設定変更
```yaml:/etc/webapps/gitlab-shell/config.yml
# 変更前
ExecStart=/usr/bin/gitlab-workhorse -listenUmask 0 -listenNetwork unix -listenAddr /run/gitlab/gitlab-workhorse.socket -authBackend http://localhost:8080 -authSocket /var/lib/gitlab/sockets/gitlab.socket -documentRoot /usr/share/webapps/gitlab/public

# 変更後
ExecStart=/usr/bin/gitlab-workhorse -listenUmask 0 -listenNetwork unix -listenAddr /run/gitlab/gitlab-workhorse.socket -authBackend http://localhost:8080/gitlab -authSocket /var/lib/gitlab/sockets/gitlab.socket -documentRoot /usr/share/webapps/gitlab/public
```

##データベース設定
PostgreSQL にログインして gitlabhq_production データベースとユーザーを作成
設定例では下記情報で設定

ID：gitlab
PASS：gitgit

```shell-session
sudo -u postgres -i
psql -d template1

template1=# CREATE USER gitlab WITH PASSWORD 'gitgit';
template1=# ALTER USER gitlab SUPERUSER;
template1=# CREATE DATABASE gitlabhq_production OWNER gitlab;
template1=# \q
```

一般ユーザに戻ってテンプレートファイルをコピー

```shell-session
sudo cp /usr/share/doc/gitlab/database.yml.postgresql /etc/webapps/gitlab/database.yml
```

コピーしたファイルを開いてusername: と password: の値を設定

```yaml:/etc/webapps/gitlab/database.yml
#
# PRODUCTION
#
production:
  adapter: postgresql
  encoding: unicode
  database: gitlabhq_production
  pool: 10
  username: gitlab
  password: "gitgit"
...
```
##ファイアーウォール設定
各ポートを解放
Gitlab:8080/tcp
Redis:6369/tcp

自分の環境ではufwを使ってるので下記のように設定

```shell-session
sudo ufw allow 8080/tcp
sudo ufw allow 6369/tcp
sudo ufw reload
```

##Gitlab データベースの初期化

gitlabの起動

```
sudo systemctl start gitlab.target
```

Git ユーザーの設定

```shell-session
sudo cd /usr/share/webapps/gitlab
sudo -u gitlab -H git config --global user.name  "GitLab"
sudo -u gitlab -H git config --global user.email "example@example.com"
sudo -u gitlab -H git config --global core.autocrlf "input"
```

修飾ビットの調整

```shell-session
sudo chmod -R ug+rwX,o-rwx /var/lib/gitlab/repositories/
sudo chmod -R ug-s /var/lib/gitlab/repositories
sudo find /var/lib/gitlab/repositories/ -type d -print0 | xargs -0 chmod g+s
```


gitlabユーザーへ変更

```
sudo su - gitlab -s /bin/sh
```

データベースの初期化

```
cd '/usr/share/webapps/gitlab
bundle-2.3 exec rake gitlab:setup RAILS_ENV=production
```

下記実行して環境チェックを実行

```
bundle-2.3 exec rake gitlab:env:info RAILS_ENV=production
bundle-2.3 exec rake gitlab:check RAILS_ENV=production
```

##Nginxの設定
事前に下記記事を参照し、証明書の生成を行ってください。
[Let’s Encrypt!!を始めよう](https://qiita.com/Gen_Arch/items/2bf264a1f1c2780791ac)

nginx.confに下記追記

```config:/etc/nginx/nginx.conf
http {
  upstream gitlab-workhorse {
    server unix:/run/gitlab/gitlab-workhorse.socket fail_timeout=0;
  }
~~省略~~
include /etc/nginx/conf.d/*.conf;
}

```

新しくSSL用の設定ファイルを作成

```config:/etc/nginx/conf.d/ssl.conf
server {
  listen 443;
  server_name  archdaisuki.com;

  ssl                  on;
  ssl_certificate /etc/letsencrypt/live/archdaisuki.com/fullchain.pem; # managed by Certbot
  ssl_certificate_key /etc/letsencrypt/live/archdaisuki.com/privkey.pem; # managed by Certbot
  ssl_session_timeout  5m;
  ssl_protocols  SSLv2 SSLv3 TLSv1;
  ssl_ciphers  HIGH:!aNULL:!MD5;
  ssl_prefer_server_ciphers   on;

location /gitlab {
  access_log /var/log/gitlab/access.log main;
  error_log /var/log/gitlab/error.log;
  # unlimited upload size in nginx (so the setting in GitLab applies)
  client_max_body_size 0;

  # proxy timeout should match the timeout value set in /etc/webapps/gitlab/unicorn.rb
  proxy_read_timeout 60;
  proxy_connect_timeout 60;
  proxy_redirect off;

  proxy_set_header Host $http_host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-Ssl on;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header X-Forwarded-Proto $scheme;

  root /usr/share/webapps/gitlab/public;
  proxy_pass http://gitlab-workhorse;
}

error_page 404 /404.html;
error_page 422 /422.html;
error_page 500 /500.html;
error_page 502 /502.html;
error_page 503 /503.html;
location ~ ^/(404|422|500|502|503)\.html$ {
  root /usr/share/webapps/gitlab/public;
  internal;
}
}
```

nginxの設定ファイル読み込み

```
sudo nginx -s reload
```

##アクセス
https://archdaisuki.com/gitlab

ID：root
PASS：5iveL!


ログインできたらインストール成功！！