リンク:中日新聞「南海トラフ80%の内幕 小沢慧一(社会部)」

とても読み応えのある記事だった。中日新聞の小沢記者 Good Job!

文部科学省は、議事録のすべてを最初から公開したわけではなかった。「税金を優先的に投入」「まず、お金を取らないと」。80%の確率を採用する決定打となったこれらの衝撃的な発言が記録された議事録は当初、文科省に開示を拒否された。それも「議事録はないので、公開できない」と担当者が伝えてきたのだ。結果的に公開されたのは、他の議事録の中に、このくだりの存在を暗示する発言を偶然見つけたからだ。

(7)実力不足の地震学より)

南海トラフ80%を報じたNHKWebの例
www3.nhk.or.jp

Ubuntu 18.04LTS上でのRuby on Rails公開環境の構築

はじめに

Dell Precision 5820に標準でインストールされていたUbuntu 18.04LTSにRuby on Railsの公開環境を構築する。

環境

# more lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.3 LTS"

Ubuntu 18.04をCUIモードで動かす

デフォルトがGUI(ランレベル5)で動いているが、サーバとしてしか使わないのでCUI(ランレベル3)で動かす。

% sudo systemctl set-default runlevel3.target

不要なサービスを止める

/etc/rc3.d/にシンボリックリンクされているものを眺めて不要なものはリンクを外す。

% ls /etc/rc3.d/
% sudo update-rc.d -f avahi-daemon remove 
% sudo update-rc.d -f bluetooth remove
% sudo update-rc.d -f cups remove
% sudo update-rc.d -f cups-browesed remove
% sudo update-rc.d -f speech-dispatcher remove

参考:

再起動する。

rbenvをシステムワイドにインストールする

CentOSでrbenvをシステムにインストールする - Qiitarbenvでsystem wideに入れるときに気をつけたいこと - Qiitaを参考にインストールする。

Githubからrbenv, ruby-build, そして rbenv-default-gemsを取得する。

% cd /usr/local
% sudo git clone https://github.com/rbenv/rbenv.git rbenv
% sudo chgrp -R staff rbenv
% sudo chmod -R g+rwxXs rbenv
% sudo mkdir rbenv/plugins
% cd rbenv/plugins
% sudo git clone https://github.com/rbenv/ruby-build.git ruby-build
% sudo chgrp -R staff ruby-build
% sudo chmod -R g+rwxs ruby-build
% sudo git clone https://github.com/rbenv/rbenv-default-gems.git rbenv-default-gems

グループstaffに現在のユーザhogehogeを付け加える。

% sudo usermod -aG staff hogehoge

rbenvの設定をログイン時を読み込むことができるように/etc/profile.d/rbenv.shを作成する。

% sudo touch /etc/profile.d/rbenv.sh
% sudo vi /etc/profile.d/rbenv.sh

中見は以下のようにした。

export RBENV_ROOT=/usr/local/rbenv
export PATH="$RBENV_ROOT/bin:$PATH"
eval "$(rbenv init --no-rehash -)"

rbenvで初期化を行う。

% sudo su
# source /etc/profile
# exit

rbenvでsystem wideに入れるときに気をつけたいこと - Qiitaでおすすめのrbenv-default-gemsを設定する。これを設定することでrubyのインストール時に合わせてインストールするべきgemライブラリを指定することができる。

% sudo touch /usr/local/rbenv/default-gems
% sudo vi  /usr/local/rbenv/default-gems

中見は以下のようにした。

bundler
pry
rbenv-rehash

rubyのインストール

rubyのコンパイルに必要なパッケージをインストールする。

% sudo apt-get install -y libssl-dev libreadline-dev zlib1g-dev

rubyのインストール

% sudo su
# source /etc/profile
# which rbenv
# rbenv install --list | 2.6.5
# rbenv install 2.6.5
# rbenv rehash
# rbenv global 2.6.5

gemのバージョンを最新にしておく。

# gem update --system
# gem -v
3.0.6

gemパッケージをインストールする際にドキュメントをつくらないように設定する。

# touch ~/.gemrc
# vi ~/.gemrc

.gemrcの中見は以下の通り。

install: --no-document
update: --no-document

Ruby on Railsのインストール

SQLite3関連のパッケージをインストールする。

sudo apt install libsqlite3-dev sqlite3

Rails6から webpackerというものを使うようになる。このために必要なパッケージをインストールする。

% sudo apt install -y curl
% curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
% echo "deb  https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
% sudo apt update
% sudo apt install yarn


Ubuntu 18.04LTSの標準のNode.jsは古いため、Node.jsを別途インストールする。

% sudo apt install -y nodejs npm
% sudo npm install n -g
% sudo n stable
% sudo apt purge nodejs npm
% exec $SHELL -l

% which node
/usr/local/bin/node

% node -v
v12.13.1

Ruby on Railsをインストールする。

% sudo su
# source /etc/profile
# gem install rails
# which rails
/usr/local/rbenv/shims/rails
# rails -v
Rails 6.0.1

Ruby on Railsの動作確認&gem ライブラリをインストールする。

# cd /tmp
# rails new demo
# cd demo
# rails webpacker:install
# rails generate scaffold person name:string age:integer
# rails db:migrate
# rails server

nftableによるアクセス制限

Debian 10 (buster)のnftablesでアクセス制御 - 発声練習を参考にする。

40080, 400081をアプリ用に公開する。/etc/nftables.confに以下を追加する。

tcp dport 40080 counter 
tcp dport 40081 counter

反映させる。

% sudo nft -f /etc/nftables.conf

確認する。

% sudo nft list ruleset

ApacheとPassengerのインストール

Installing Passenger + Nginx on Ubuntu 18.04 LTS (with APT) - Passenger LibraryにしたがってPassengerをインストールする。

Passengerをaptでインストールできるように設定する。GPG鍵の登録。

% sudo apt-get install -y dirmngr gnupg
% sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 561F9B9CAC40B2F7
% sudo apt-get install -y apt-transport-https ca-certificates

/etc/apt/source.listに追加する。

sudo sh -c 'echo deb https://oss-binaries.phusionpassenger.com/apt/passenger bionic main > /etc/apt/sources.list.d/passenger.list'
sudo apt-get update

PassengerおよびApacheモジュールのインストール。

% sudo apt-get install -y apache2 apache2-dev libapache2-mod-passenger

Apacheにモジュールを付け加える。

% sudo a2enmod passenger
% sudo apache2ctl restart

正しくインストールできているかどうかを確かめる。Apacheを使う方を選ぶ。

sudo /usr/bin/passenger-config validate-install

PassengerInstanceRegistryDirを設定する。

% sudo mkdir -p /var/run/passenger-instreg

/var/runは tmpfsとして設定されているため、そのままだと再起動の度に削除されてしまう(参考:/var/run の中身が再起動すると消えてしまうので・・・お前らもさっさとハマって泣くべきCentOS7の落とし穴4つ - Qiita)。そこで、 /etc/tmpfiles.d に設定を記載する。

% sudo touch /etc/tmpfiles.d/passenger.conf

/etc/tmpfiles.d/passenger.confの中見は以下のとおりにする。

d /var/run/passenger-instreg 0755 root root

rootのホームディレクトリ(/root)のシェルの設定ファイルに上記の添付ファイルに関する設定を記述する。たとえば、.bash_profileに以下を記述する。以下の例では合わせてRailsの実行モードについても記載する。

export PASSENGER_INSTANCE_REGISTRY_DIR=/var/run/passenger-instreg
export RAILS_ENV=production

railsのソースファイルが/home/hogehoge/rails-serverとし、http://hogehoge.net/rails/でアクセスできるようにするとき、シンボリックリンクをはる。Apacheのデフォルトが/var/www/htmlになっているのでその下に置く。

% sudo ln -s  /home/hogehoge/rails-server/public /var/www/html/rails

Apacheの設定

/etc/apache2/ports.conf に新しく開けたポートの記述を追加する。

Listen 40080
Listen 40081

ポート番号40080でアクセスする設定を/etc/apache2/sites-available/001-vhost1.confとして設定する。以下の設定ファイルでSECRET_KEY_BASEの環境変数を定義しているのは、passenger経由だとユーザディレクトリの設定ファイル(.bash_profileなど)で設定した環境変数が反映されないため(参考→http://blog.mkt-sys.jp/2015/11/secret-key-base-on-production.html)。

PassengerInstanceRegistryDir /var/run/passenger-instreg #上述のディレクトリ

<VirtualHost *:40080>
	ServerName サーバのFQDN

	ServerAdmin 連絡先メールアドレス
	DocumentRoot /var/www/html

	ErrorLog ${APACHE_LOG_DIR}/vhost1_error.log
	CustomLog ${APACHE_LOG_DIR}/vhost1_access.log combined

	PassengerRuby /usr/local/rbenv/versions/2.4.2/bin/ruby # rbenvで導入したrubyを指定する
	PassengerFriendlyErrorPages off  #onにするとエラー時にログが表示される。
	
	SetEnv SECRET_KEY_BASE 「秘密鍵につかう文字列 bundle exec rails secret で生成」
	RackEnv production
	RackBaseURI /rails

</VirtualHost>

設定を反映させる。

% sudo a2ensite vhost1
% sudo systemctl reload apache2

Railsアプリを修正したとき

passengerを再起動する(参考:Restarting applications)。

% sudo passenger-config restart-app

Linux OOM Killerメモ

バックグラウンドで動かしているプロセスが突然停止しており、理由がわからない。多分、OOM Killerのせい。

環境

  • Ubuntu 18.04 LTS

対処方法: OOM Killerを停止する

/proc/sys/vm/overcommit_memory の値を2にする(デフォルトは0)

現在の値を変更。

% sudo su
# echo 2 > /proc/sys/vm/overcommit_memory

起動時に変更

% sudo su
# touch /etc/sysctl.d/10-overcommit.conf
# echo "vm.overcommit_memory = 2" >> /proc/sys/vm/overcommit_memory

対処方法: OOM Killer呼び出ししきい値を変更する

/proc/sys/vm/overcommit_ratio の値を適切なものにする(デフォルトは50。メモリ容量の50%でOOM Killerが呼び出される)

現在の値を変更。

% sudo su
# echo 90 > /proc/sys/vm/overcommit_ratio

起動時に変更

% sudo su
# touch /etc/sysctl.d/10-overcommit.conf
# echo "vm.overcommit_ratio = 90" >> /proc/sys/vm/overcommit_memory

Debian 10上のGitLabをMuninで監視する

やりたいこと

複数のサーバの負荷状況をmuninで可視化する。

  • muninデータのとりまとめは別サーバで行う
  • 本サーバではサーバの負荷状況&Gitlabの状況を監視する

muninのインストールと設定ファイルの変更

% sudo aptitude install munin munin-node

設定ファイルを修正し、muninの親サーバからアクセスできるようにする。

% cd /etc/munin
% sudo cp -p munin-node.conf munin-node.conf.org
% sudo vi munin-node.conf

変更場所は以下のとおり

% diff munin-node.conf.org munin-node.conf
37a38
> host_name hogehoge.localdomain  #このサーバのFQDNを記載
45c46,47
< allow ^::1$
---
> #allow ^::1$
> allow ^192\.168\.11\.100$  # muninの親サーバのIPアドレスを記載

監視対象の確認

% sudo munin-node-configure

ハードディスクの監視

Debian 9 (Stretch) - munin 各種監視追加! - mk-mode BLOGに従い、設定する。

smartmontoolsのインストール

% sudo apt install smartmontools

ハードディスク監視用の設定の記述。

% sudo touch /etc/munin/plugin-conf.d/hddtemp_smartctl
% sudo vi /etc/munin/plugin-conf.d/hddtemp_smartctl

監視対象とするハードディスクドライブのディスク情報を確認する。私の環境では /dev/sda が監視対象。

% df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
udev             7.8G     0  7.8G    0% /dev
tmpfs            1.6G   17M  1.6G    2% /run
/dev/sda2        900G  6.9G  848G    1% /
tmpfs            7.9G   12K  7.9G    1% /dev/shm
tmpfs            5.0M     0  5.0M    0% /run/lock
tmpfs            7.9G     0  7.9G    0% /sys/fs/cgroup
/dev/sda1        511M  5.1M  506M    1% /boot/efi
tmpfs            1.6G     0  1.6G    0% /run/user/1000

/etc/munin/plugin-conf.d/hddtemp_smartctlの中見

[hddtemp_smartctl]
user root
env.drives sda
env.smartctl /usr/sbin/smartctl
env.args_sda --all -d ata

プラグインを組み込む。

% sudo ln -s /usr/share/munin/plugins/hddtemp_smartctl /etc/munin/plugins/

CPUや電源の監視

lm-sensorsと関連パッケージをインストールする。

% sudo apt -y install lm-sensors libsensors5 fancontrol

sensors-detect を実行する。いいなりにEnterキーをおし、最後の /etc/modulesへの書き込みはYesを選択する。

% sudo sensors-detect 

センサーのチェック

% sudo sensors

センサー監視用の設定ファイルを作成する。

% sudo touch /etc/munin/plugin-conf.d/sensors
% sudo vi /etc/munin/plugin-conf.d/sensors

/etc/munin/plugin-conf.d/sensorsの中見は以下の通り。

[sensors_*]
user root

プラグインを組み込む。

% sudo ln -s /usr/share/munin/plugins/sensors_ /etc/munin/plugins/sensors_volt
% sudo ln -s /usr/share/munin/plugins/sensors_ /etc/munin/plugins/sensors_temp
% sudo ln -s /usr/share/munin/plugins/sensors_ /etc/munin/plugins/sensors_fan

GitLabの監視

GitHub - MatthiasLohr/munin-plugins-gitlab: Munin-plugins for monitoring a GitLab instanceで提供されているプラグインを利用する。Readmeに従い作業する。

関連するパッケージをインストールする。

% sudo apt install python-psycopg2

プラグインをクローンする。

% cd /usr/local/share
% sudo git clone https://github.com/MatthiasLohr/munin-plugins-gitlab.git
% ls -d munin-plugins-gitlab
munin-plugins-gitlab

プラグインの設定ファイルを作成する。

% sudo touch /etc/munin/plugin-conf.d/gitlab
% sudo vi /etc/munin/plugin-conf.d/gitlab

/etc/munin/plugin-conf.d/gitlabの中見は以下の通り。

[gitlab_*]
user git
env.gitlab_dir /var/opt/gitlab    # optional, defaults to GitLab omnibus package
 setup directory
 
## using a PostgreSQL database
env.db_engine postgresql          # optional, defaults to postgres, valid values
: postgresql. mysql
env.db_dsn host=/var/opt/gitlab/postgresql user=gitlab dbname=gitlabhq_productio
n  # optional, defaults to GitLab omnibus database
env.db_pg_search_path gitlab     # optional, set search_path before executing an
y query. Useful if not using GitLab omnibus package
  
## using a MySQL database
#env.db_engine mysql
#env.db_dsn host=localhost user=gitlab db=gitlabhq_production
  
[gitlab_redis_*]
user gitlab-redis
env.redis_socket /var/opt/gitlab/redis/redis.socket  # optional, defaults to Git
Lab omnibus redis instance
  
[gitlab_total_registry_size]
user registry

自分に必要そうなプラグインを導入する。今回は以下を導入した。

% sudo ln -s /usr/local/share/munin-plugins-gitlab/gitlab_redis_used_memory /etc/munin/plugins/
% sudo  ln -s /usr/local/share/munin-plugins-gitlab/gitlab_total_repo_count /etc/munin/plugins/
% sudo  ln -s /usr/local/share/munin-plugins-gitlab/gitlab_total_repo_size /etc/munin/plugins/
% sudo  ln -s /usr/local/share/munin-plugins-gitlab/gitlab_users /etc/munin/plugins/
% sudo  ln -s /usr/local/share/munin-plugins-gitlab/gitlab_users_active /etc/munin/plugins/

Readmeにかかれているとおりにして、Gitlabで使用しているnginxを監視する。

% sudo mkdir -p /etc/nginx/conf.d/
% sudo touch /etc/nginx/conf.d/status.conf
% sudo vi  /etc/nginx/conf.d/status.conf

/etc/nginx/conf.d/status.confの中見は以下の通り。

server  {
    listen *:80;
    listen [::]:80;
    server_name localhost;
    location /nginx_status {
        stub_status on;
        access_log off;
        allow 127.0.0.1;
        allow ::1;
        deny all;
    }
}

/etc/gitlab/gitlab.rb の該当部分を修正する。

# nginx['custom_nginx_config'] = "include /etc/nginx/conf.d/example.conf;"
 nginx['custom_nginx_config'] = "include /etc/nginx/conf.d/status.conf;"

設定を再読込する。

% sudo gitlab-ctl reconfigure

プラグインを導入する。

% ln -s /usr/share/munin/plugins/nginx_request /etc/munin/plugins
% ln -s /usr/share/munin/plugins/nginx_status /etc/munin/plugins

munin-nodeを再起動する。

% sudo systemctl restart munin-node

余談:Apacheの監視

% ln -s /usr/share/munin/plugins/apache_accesses /etc/munin/plugins/apache_accesses
% ln -s /usr/share/munin/plugins/apache_processes /etc/munin/plugins/apache_processes
% ln -s /usr/share/munin/plugins/apache_volume /etc/munin/plugins/apache_volume

Debian 10上でGitLab

はじめに

これまでCentOS 6で稼働させていたGitLabをDebian 10上に移行する。なお、同一バージョンでないと移行はできないので注意。

Gitlab Omnibus packageのバージョン確認方法

% sudo gitlab-rake gitlab:env:info

System information
System:		Debian 10
Current User:	git
Using RVM:	no
Ruby Version:	2.6.3p62
Gem Version:	2.7.9
Bundler Version:1.17.3
Rake Version:	12.3.3
Redis Version:	3.2.12
Git Version:	2.22.0
Sidekiq Version:5.2.7
Go Version:	unknown

GitLab information
Version:	12.5.1
Revision:	79a183ea8de
Directory:	/opt/gitlab/embedded/service/gitlab-rails
DB Adapter:	PostgreSQL
DB Version:	10.9
URL:		http://192.168.11.2
HTTP Clone URL:	http://192.168.11.2/some-group/some-project.git
SSH Clone URL:	git@192.168.11.2:some-group/some-project.git
Using LDAP:	no
Using Omniauth:	yes
Omniauth Providers: 

GitLab Shell
Version:	10.2.0
Repository storage paths:
- default: 	/var/opt/gitlab/git-data/repositories
GitLab Shell path:		/opt/gitlab/embedded/service/gitlab-shell
Git:		/opt/gitlab/embedded/bin/git

GitLabのCommunity EditionとEnterprise Editionの違い

https://www.gitlab.jp/installation/ce-or-ee/

Debian 10上にGitLab Community Editionをインストール

https://www.gitlab.jp/installation/?version=ce#debianに従い、インストールする。

まず、必要なソフトウェアの準備をする。

% sudo apt install -y curl openssh-server ca-certificates
% sudo apt install postfix (サテライトシステム:メールは他のSMTPサーバ経由で送信)

gitlab-ceに必要なパッケージをインストールする。

% curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash

gitlab-ceをインストールする。「https://gitlab.example.com」の部分は自分のサーバのURLを指定する。

sudo EXTERNAL_URL="https://gitlab.example.com" apt-get install gitlab-ce

CentOS 6上でのgitlab-ceのバックアップ

https://docs.gitlab.com/ee/raketasks/backup_restore.htmlに従ってバックアップをとる。

以下はバックアップコマンドでバックアップできるとのこと。

  • Database
  • Attachments
  • Git repositories data
  • CI/CD job output logs
  • CI/CD job artifacts
  • LFS objects
  • Container Registry images
  • GitLab Pages content

バックアップコマンドを実行する。バックアップは /var/opt/gitlab/backups以下に生成される。

% sudo gitlab-backup create BACKUP=dump
% ls /var/opt/gitlab/backups
dump_gitlab_backup.tar

また、/etc/gitlabの設定ファイルは上記のバックアップに含まれないので別途バックアップをとる。

% sudo gitlab-ctl backup-etc
% ls /etc/gitlab/config_backup/
gitlab_config_1574853619_2019_11_27.tar
gitlab_config_1574861603_2019_11_27.tar

バックアップしたファイルをDebian 10へもっていく。

リストア

https://docs.gitlab.com/ee/raketasks/backup_restore.html#restore-for-omnibus-gitlab-installationsに従い、リストアする。

まず、念の為以下のコマンドを実行しておく。

% sudo gitlab-ctl reconfigure
% sudo gitlab-ctl start
% sudo gitlab-ctl stop unicorn
% sudo gitlab-ctl stop sidekiq

% sudo gitlab-ctl status

アプリケーションのバックアップを設置する。

% sudo cp dump_gitlab_backup.tar /var/opt/gitlab/backups/
% sudo chown git:git /var/opt/gitlab/backups/dump_gitlab_backup.tar

リストアする。なお、変数BACKUPの後ろの値は/var/opt/gitlab/backups/の中にあるバックアップファイルのhogehoge_gitlab_backup.tarのhogehogeの部分となる。今回はdump_gitlab_backup.tarなので、BACKUP=dumpとなる。

% sudo gitlab-backup restore BACKUP=dump

次にバックアップをとったgitlab-secrets.jsonとgitlab.rbをコピーする。

% tar xfv gitlab_config_1574861603_2019_11_27.tar
% cd etc/gitlab
% sudo cp gitlab-secrets.json /etc/gitlab/gitlab-secrets.json.old-server
% sudo cp gitlab.rb /etc/gitlab/gitlab.rb.old-server
% cd /etc/gitlab
% cp -p gitlab-secrets.json gitlab-secrets.json.org
% cp gitlab-secrets.json.old-server gitlab-secrets.json
% vi gitlab.rb  (適宜、編集する)

反映させる。

% sudo gitlab-ctl reconfigure
% sudo gitlab-ctl restart
% sudo gitlab-rake gitlab:check SANITIZE=true

辞書攻撃への対応

fail2banで行おうと思った所、GitLab自体にそのような機能があった。

/etc/gitlab/gitlab.rbの該当部分をコメントアウトする。

gitlab_rails['rack_attack_git_basic_auth'] = {
  'enabled' => true,
  'ip_whitelist' => ["127.0.0.1"],
  'maxretry' => 10, # Limit the number of Git HTTP authentication attempts per IP
  'findtime' => 60, # Reset the auth attempt counter per IP after 60 seconds
  'bantime' => 3600 # Ban an IP for one hour (3600s) after too many auth attempts
}

設定を読み込み直す。

% sudo gitlab-ctl reconfigure

cron によるバックアップ

毎日バックアップをとるとして、何世代分バックアップを残すのかを/etc/gitlab.rb で設定する。今回はデフォルトの7世代分とする。該当部分は以下のとおり。

gitlab_rails['backup_keep_time'] = 604800

cronで毎日バックアップをとる。

% sudo su
# crontab -e -u root
0 3 * * * /usr/bin/gitlab-backup create CRON=1
0 4 * * * /usr/bin/gitlab-ctl backup-etc CRON=1