wide and deep

Samba・subversion・gitlabサーバ構築の覚書

今回したこと

所属する研究室内のファイルサーバはCentOS6上に構築されているが,サポートは2020/11に切れるので,CentOS7での建て替えを行った.

大体はソフトウェア依存の設定が多いのでCentOS6とCentOS7での大まかな手順は変わらなかったが,samba・subversion・gitlabサーバを構築する手順・詰まった点をブログに書ける範囲でまとめる.

試行錯誤しながら構築したので間違っている点があるかもしれません....

概要

  • OS: CentOS7 minimal
  • ストレージ: 500GB(OS用),8TB x3->RAID5(データ用)
    • OSインストール時に500GBのストレージを選択しておく
  • 用途: samba・subversion・gitlabサーバ
  • 旧データは/data配下にあるので新サーバにscpなどで持ってくる.

構成するデータ構造

/data
┣ /Files(samba)
┣ /svn
┗ /gitlab

f:id:catdance124:20190819182815j:plain:w400
最後には本番マシンにHDDを載せ換えるので雑に接続する図
ダイレクト空冷環境です

1. 基本設定

1.1 ネットワーク設定

nmcliコマンドでIP固定などをする.
バイス名を確認したらIPアドレスゲートウェイDNSを指定.
ここは適宜書き換える

# nmcli d
デバイス  タイプ    状態      接続
enp1s0    ethernet  接続済み  enp1s0
lo        loopback  管理無し  --
# nmcli c s enp1s0 ipv4.method static ipv4.addresses 192.168.2.230/24 ipv4.gateway 192.168.1.1 ipv4.dns xxx.xxx.xxx.xxx

設定が反映されたかを確認する

# less /etc/sysconfig/network-scripts/ifcfg-enp1s0
BOOTPROTO=none
DEVICE=enp1s0
ONBOOT=yes
IPADDR=192.168.2.230
GATEWAY=192.168.1.1
DNS1=xxx.xxx.xxx.xxx

インターネットに通じているかを確認する

# ping 8.8.8.8

1.2 SSH設定

SSHポートが22のままだとマズいので変更する.この記事では12345に変更する.
SELinuxを導入し,12345をsshポートとして許可する.

# yum install policycoreutils-python
# semanage port -a -t ssh_port_t -p tcp 12345

次にssh設定を変更する.
指定ネットワーク内からのみパスワードログイン可能にする.

# vi /etc/ssh/sshd_config
Port 12345
PasswordAuthentication no
Match Address XXX.XXX.XXX.XXX/24
    PasswordAuthentication yes
# systemctl restart sshd

ファイアウォールsshポートを開け,接続できるようにする.

# firewall-cmd --add-port 12345/tcp
# firewall-cmd --runtime-to-permanent
success

1.3 ストレージ設定

今回は/dev/sda...500GB,/dev/sd[bcd]...8TB x3が割り当てられている.
割り当てはfdiskコマンドで調べることができる.
sd[bcd]にパーティションを作成し,RAID用にセットする

# parted /dev/sdb
(parted) mklabel gpt
(parted) mkpart primary ext4 0% 100%
(parted) set 1 raid on
(parted) quit
# parted /dev/sdc
(parted) mklabel gpt
(parted) mkpart primary ext4 0% 100%
(parted) set 1 raid on
(parted) quit
# parted /dev/sdd
(parted) mklabel gpt
(parted) mkpart primary ext4 0% 100%
(parted) set 1 raid on
(parted) quit

mdadmを使用し,RAID5デバイスmd0を構築した.
構築には18時間ほどかかった.

# yum install mdadm
# mdadm --create /dev/md0 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1

構築したRAIDの設定を保存しておく.

# mdadm --detail --scan >> /etc/mdadm.conf

バイス/dev/md0をフォーマット・/dataにマウントする.
これで/data/に置いたものはRAID5で保存されることになる.

# mkfs -t ext4 /dev/md0
# vi /etc/fstab
/dev/md0 /data ext4 defaults 1 2
# mkdir /data
# mount -a

2. Sambaサーバ

2.1 インストール&設定

設定についてはこの記事では省く.

# yum install epel-release
# yum install samba4
# vi /etc/samba/smb.conf
色々設定する
# systemctl restart smb
# systemctl enable smb

2.2 SELinuxの設定

semanageでsambaからのアクセス許可するディレクトリを登録し,restoreconを実行してラベルを設定する.

# semanage fcontext -a -t samba_share_t '/data/Files(/.*)?'
# restorecon -R /data/Files

2.3 ファイアウォールの設定

sambaのポートを指定ネットワーク内からのみアクセスできるようにリッチルールを追加

# firewall-cmd --zone=public --add-rich-rule="rule family=ipv4 source address=XXX.XXX.XXX.XXX/24 port protocol=tcp port=139 accept"
# firewall-cmd --zone=public --add-rich-rule="rule family=ipv4 source address=XXX.XXX.XXX.XXX/24 port protocol=tcp port=445 accept"
# firewall-cmd --runtime-to-permanent

3. subversionサーバ

3.1 インストール&設定

# yum install subversion
# mkdir /data/svn
# svnadmin create /data/svn
# vi /data/svn/conf/svnserve.conf
    # 先頭の'#'を外す
    anon-access = read
    auth-access = write
    password-db = passwd
# vi /etc/sysconfig/svnserve
    # svnserveで利用するリポジトリを設定
    OPTIONS="-r /data/svn"
# systemctl start svnserve
# systemctl enable svnserve

3.2 ファイアウォール設定

# semanage port --list | grep svn
svn_port_t                     tcp      3690
svn_port_t                     udp      3690

svnのポートはすでにSELinuxには登録されていたので,ファイアウォール設定のみを行う.
sambaと同じく指定ネットワーク内からのみアクセス許可を行う.

# firewall-cmd --zone=public --add-rich-rule="rule family=ipv4 source address=XXX.XXX.XXX.XXX/24 port protocol=tcp port=3690 accept"
# firewall-cmd --runtime-to-permanent

ここでsvnサーバにアクセスすると,permission deniedで閲覧することができなかった.
色々試すとSELinuxが悪さをしているようだった.

3.3 SELinux設定

laboradian.com
serverfault.com

上記サイトを参考にした結果,svnserve_content_tがファイルに紐付いていないとsvn_port_tがファイルを読み込めないらしいことがわかった.
下記コマンドを実行するとアクセスできる様になったことを確認した.

svnコンテキストタイプを確認
# semanage fcontext -l | grep svn
svnserve_content_tを/data/svn配下に付与(コンテキストタイプのルール付け)
# semanage fcontext -a -t svnserve_content_t "/data/svn(/.*)?"
chconを使い,実際にコンテキストタイプを紐付ける
# chcon -R -h -t svnserve_content_t /data/svn/

4. gitlabサーバ

4.1 インストール

公式に沿って入れていく
about.gitlab.com

# sudo yum install -y curl policycoreutils-python openssh-server
# sudo systemctl enable sshd
# sudo systemctl start sshd
# sudo firewall-cmd --permanent --add-service=http
# sudo systemctl reload firewalld
# sudo yum install postfix
# sudo systemctl enable postfix
# sudo systemctl start postfix

# curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
# yum install -y gitlab-ce

4.2 設定

# vi /etc/gitlab/gitlab.rb
    # バックアップを保持する期間を1週間に設定
    gitlab_rails['backup_keep_time'] = 604800
    # RAIDが動いているディレクトリにリポジトリを保存
    git_data_dirs({
    "default" => { "path" => "/data/gitlab/git-data" },
    "alternative" => { "path" => "/data/gitlab/git-data" }
    })
    # タイムゾーンをAsia/Tokyoに変更
    gitlab_rails['time_zone'] = 'Asia/Tokyo'

# gitlab-ctl reconfigure
# gitlab-ctl restart

5. データ移行

/data配下を全コピーすればよいのだが,subversionとgitlabはそれぞれで移行メソッドを持っているので活用する.

5.1 subversionデータ移行

svnsyncを用いて旧サーバとリポジトリを同期する

# vi /data/svn/hooks/pre-revprop-change
    #!/bin/sh
    exit 0
# chmod 755 /data/svn/hooks/pre-revprop-change
# svnsync init file:///data/svn svn://<old_svn_server_IP>
リビジョン 0 の属性をコピーしました (属性 svn:sync-* は飛ばしました)# svnsync sync file:///data/svn

svnsyncではユーザ名とパスワードを移行できないので,別途コピーする.

# scp -P 12345 root@<old_svn_server_IP>:/data/svn/conf/passwd /data/svn/conf/passwd

リポジトリごとに固有のUUIDがあり,これが一致していないとコミット時とかにエラーになるらしいので合わせておく.

# svn info svn://<old_svn_server_IP>
リポジトリ UUID: <old_svn_server_UUID>
# svnadmin setuuid /data/svn <old_svn_server_UUID>

5.2 gitlabデータ移行

旧サーバの/data/gitlab/を/data/.tarにアーカイブしておく.
新サーバの/var/opt/gitlab/backups/にコピーし,権限を編集し,gitlab-rakeでリストアする.

# scp -P 12345 root@<old_gitlab_server_IP>:/data/<filename>.tar /var/opt/gitlab/backups/<filename>.tar
# chmod 777 /var/opt/gitlab/backups/<filename>.tar
# gitlab-rake gitlab:backup:restore
# gitlab-ctl restart

5.3 sambaデータ移行

rsyncで同期させる.

# rsync -e "ssh -p 12345 -c arcfour256" -ahv --progress root@<old_samba_server_IP>:/data/ /data

6. 終に

サーバ構築をガッツリとやるいい機会でした.
何かうまく行かないときは大体SELinuxが悪いので,トラブルシューティングがうまくなってきた気がします.
実のところまだsambaのデータコピーが完了しておらず,あと1週間位は掛かりそうな見込みです.(研究室のみんなスマン...)
待っている間に他のサーバーの建て替えも行わなければいけないので,時間を有効に使っていきたいと思います.
また進捗があれば記事を書きたいと思います.