「AlmaLinux」+「Docker」で「Growi」を導入する

Web Service/
  1. home
  2. blog
  3. 「AlmaLinux」+「Docker」で「Growi」を導入する

現在、各種手順書等のとりまとめ先として色々検討しているのですが、Wikiシステムでは「Growi」の評判が良かったので、CentOS8の完全互換である「AlmaLinux 8.4」と「Docker」環境で導入をしてみました。

例によって、VMware ESXi 仮想環境で導入しています。

今回の導入目的・導入内容

今回は上述の通り、「Growi」の評価が主となります。
また、AlmaLinuxがどの程度、CentOS8の知識で活用できるかを確認する目的もあります。 ほぼ完全に同じ形で構築出来ました。

GrowiはDocker環境下での構築となります。

  • グループインストール (標準)で入るパッケージ
  • グループインストール (デベロッパー)で入るパッケージ
  • グループインストール (ネットワーク)で入るパッケージ
  • その他必要パッケージ (mailx、vmware tool、postfix)
  • Docker
  • Python 3.9
  • docker-compose

AlmaLinux初期導入

AlmaLinuxのイメージ取得

公式サイトのISOリストサイトにて取得をします。
今回は「日本リージョン」の任意のサーバーより、「AlmaLinux-8.4-x86_64-minimal.iso」を利用して構築しています。

OSのインストール

WEBコンソールを開き、「Install AlmaLinux 8.4」を選択します。

日本語」を選択して「続行」をクリックします。

インストール概要画面」に遷移しますので、「必要箇所を設定」します。
本画面は見切れていますので、ユーザーの設定等はマウススクロール等で表示させる必要があります。

インストール先」をクリックし、詳細設定画面に遷移します。
次に「インストール先のディスク(パーティション)を確保」し、「完了」ボタンをクリックします。

ネットワークとホスト名」をクリックし、詳細設定画面に遷移します。

左下の「ホスト名(H)」にホスト名を入力し、「適用」をクリックします。
右下の「現在のホスト名」が入力されたホスト名に更新される事を確認します。

IPv4の固定アドレス設定を行います。(必要な場合のみ)

  1. 設定」をクリックし、画面を遷移、「IPv4設定」をクリックします。
  2. メソッド:「手動」を選択します
  3. アドレス:「追加」をクリック後、IPアドレス、ネットマスク、ゲートウェイを入力します。
  4. DNSサーバー:複数ある場合はカンマ区切りで入力します。

必要な情報を入力後、「保存」をクリックし、前の画面に戻ります。

画面左上のスライダースイッチをクリックし、「有効(青色)」にします。
接続済みです」と表示され設定したIPアドレス等が表示されることを確認し、「完了」をクリックします。

日付と時刻」をクリックし、詳細設定画面に遷移します。
次に「表示された地図」から「日本 (東京)」をクリックし、「完了」をクリックします。

root パスワード」をクリック後、詳細設定画面に遷移します。
次に「rootパスワード」、「確認」を入力し、「完了」をクリックします。
本項目は見切れている場合が大半だと思いますので、その場合はマウスでホイールスクロールをすることにより表示されます。

ユーザーの作成」をクリックし、詳細設定画面に遷移します。
次に「フルネーム」、「ユーザー名」、「パスワード」、「パスワードの確認」を入力し、「完了」をクリックします。
本項目は見切れている場合が大半だと思いますので、その場合はマウスでホイールスクロールをすることにより表示されます。

初期設定が正常に完了すると「インストールの開始」ボタンが「青色」になります。
次に「インストールの開始」をクリックします。

インストールが開始」されます。
インストール完了」が表示されましたら、「システムの再起動」をクリックします。

再起動後、「作成したユーザー」及び「rootユーザー」でログインできることを確認します。

AlmaLinux環境構築

インストールが完了したら順に設定をしていきます。原則、ユーザーログイン後、管理者昇格状態で構築をしています。

login as: 作成したユーザー
exsample-user password: パスワードを入力
Last login: *** *** ** **:**:** **** from ***.***.***.***
[作成したユーザー@localhost ~]$ su -
パスワード: パスワードを入力
最終ログイン: ****/**/** (*) **:**:** JST日時 pts/0
[root@localhost ~]#

SELINUXの無効化

現在の状況を「getenforce」で確認します。「disabled」以外は本作業を実施します。

[root@localhost ~]# getenforce
Enforcing

設定ファイル」を「バックアップ」します。

cp -p /etc/selinux/config /etc/selinux/config.old

設定ファイル」を編集します。
次に「SELINUX=enforcing」を「SELINUX=disabled」に変更し、上書き保存終了します。

vi /etc/selinux/config
#     permissive - SELinux prints warnings instead of enforcing.$
#     disabled - No SELinux policy is loaded.$
SELINUX=disabled ←「enforcing」から「disabled」に変更します。

差分チェック」を実施し、変更内容に不備がないか確認します。

diff /etc/selinux/config /etc/selinux/config.old
7c7
< SELINUX=disabled
---
> SELINUX=enforcing

システムの再起動」を実施します。

shutdown -r now

再度「getenforce」を実行し、「Disabled」に変更されている事を確認します。

[root@localhost ~]# getenforce
Disabled

基本パッケージをまとめて導入

「groupinstall」を利用し、基本的なパッケージをまず導入してしまいます。

dnf -y groupinstall base
dnf -y groupinstall development
dnf -y groupinstall network-tools

導入されたパッケージを確認します。

LANG=C dnf group list

パッケージの更新確認

以下のコマンドを実行し、最新パッケージに更新します。

dnf -y update

Firewalld の設定と無効化

設定ファイル」を「バックアップ」します。

cp -p /etc/firewalld/firewalld.conf /etc/firewalld/firewalld.conf.old

設定ファイル」を編集します。
次に「AllowZoneDrifting=yes」を「AllowZoneDrifting=no」に書き換え後、上書き保存します。

vi /etc/firewalld/firewalld.conf
~ 最終行付近 ~
# based zones (including the default zone). Packets never drift from interface
# based zones to other interfaces based zones (including the default zone).
# Possible values; "yes", "no". Defaults to "yes".
AllowZoneDrifting=no ←「yes」から「no」に変更します。

差分チェック」を実施し、変更内容に不備がないか確認します。

diff /etc/firewalld/firewalld.conf /etc/firewalld/firewalld.conf.old
75c75
< AllowZoneDrifting=no
---
> AlloZoneDrifting=yes

firewalld サービス」を停止します。

systemctl disable firewalld.service

firewalld サービス」が停止されていることを確認します。

systemctl list-unit-files | grep firewall
firewalld.service                           disabled

不要サービスの停止

その他、今回利用しないサービスを停止します。

systemctl disable auditd.service
systemctl disable kdump
systemctl disable atd
systemctl disable mdmonitor

サードパーティリポジトリの導入

サードパーティリポジトリとして、「EPEL」と「REMI」を導入します。

dnf -y install epel-release

設定ファイル」の「バックアップ」を実施します。

cp -p /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.old

設定ファイル」の「編集」をします。
次に「epel項目」内の「enable=1」を「enable=0」に変更し、上書き保存終了します。

vi /etc/yum.repos.d/epel.repo
[epel]
name=Extra Packages for Enterprise Linux $releasever - $basearch
#baseurl=https://download.fedoraproject.org/pub/epel/$releasever/Everything/$basearch
metalink=https://mirrors.fedoraproject.org/metalink?repo=epel-$releasever&arch=$basearch&infra=$infra&content=$contentdir
enabled=0 ←「1」から「0」に変更します。
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-8

差分チェック」を実施し、変更内容に不備がないか確認します。

diff /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.old
5c5
< enable=0
---
> enable=1

続いて、「remiパッケージ」を導入します。

rpm -ivh http://rpms.remirepo.net/enterprise/remi-release-8.rpm
rpm --import http://rpms.remirepo.net/RPM-GPG-KEY-remi

「remiパッケージ」を有効化します。

dnf config-manager --set-enabled remi

その他パッケージの導入

以下のコマンドを実行し、今回必要なパッケージを導入します。

dnf -y install perl postfix mailx open-vm-tools
dnf --enablerepo=epel -y install dkms

検索用データベース」の「アップデート」を実施します。

updatedb

全体の更新確認を実施します。

dnf -y update

タイムサーバーの設定

設定ファイル」の「バックアップ」をとります。

cp -p /etc/chrony.conf /etc/chrony.conf.old

設定ファイル」を編集します。
次に「参照サーバー」を書き換え後、上書き保存します。

vi /etc/chrony.conf
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
# pool 2.centos.pool.ntp.org iburst ← コメントアウトします。
server ntp1.jst.mfeed.ad.jp iburst  ← 追加します。
server ntp2.jst.mfeed.ad.jp iburst  ← 追加します。
server ntp3.jst.mfeed.ad.jp iburst  ← 追加します。

差分チェック」を実施し、変更内容に不備がないか確認します。

diff /etc/chrony.conf /etc/chrony.conf.old
3,6c3
< # pool 2.centos.pool.ntp.org iburst
< server ntp1.jst.mfeed.ad.jp iburst
< server ntp2.jst.mfeed.ad.jp iburst
< server ntp3.jst.mfeed.ad.jp iburst
---
> pool 2.centos.pool.ntp.org iburst

サービスを再起動します。

systemctl restart chronyd

時刻同期」を開始します。
(*)がつかない場合は複数回実施してください。

chronyc sources
210 Number of sources = 3
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^+ ntp1.jst.mfeed.ad.jp          2   6    17    37   -393us[ -371us] +/-   72ms
^* ntp2.jst.mfeed.ad.jp          2   6    17    38   -161us[ -139us] +/-   66ms
^+ ntp3.jst.mfeed.ad.jp          2   6    17    38   +759us[ +781us] +/-   95ms

rootユーザーの直接ログイン禁止設定

設定ファイル」の「バックアップ」を実施します。

cp -p /etc/ssh/sshd_config /etc/ssh/sshd_config.old

設定ファイル」を編集します。
rootの直接ログインを禁止」に書き換え後、上書き保存をします。

vi /etc/ssh/sshd_config
#LoginGraceTime 2m
PermitRootLogin no ←「yes」を「no」に変更します。
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10

差分チェック」を実施し、変更内容に不備がないか確認します。

diff /etc/ssh/sshd_config /etc/ssh/sshd_config.old
43c43
< PermitRootLogin no
---
> PermitRootLogin yes

サービスの再起動」を実施します。

systemctl restart sshd

su出来るユーザーの制限設定

作成したユーザー」を「wheel」グループに追加します。

usermod -g wheel hogeuser

作成したユーザー」が「wheel」グループに参加しているか確認します。

id hogeuser
uid=1000(hogeuser) gid=10(wheel) groups=10(wheel)

設定ファイル」を「バックアップ」します。

cp -p /etc/pam.d/su /etc/pam.d/su.old

設定ファイル」を編集します。
下記内容の「コメントアウトを削除」し、上書き保存をします。

vi /etc/pam.d/su
#%PAM-1.0
auth required pam_env.so
auth sufficient pam_rootok.so
# Uncomment the following line to implicitly trust users in the "wheel" group.
#auth sufficient pam_wheel.so trust use_uid
# Uncomment the following line to require a user to be in the "wheel" group.
auth required pam_wheel.so use_uid ← コメントアウトを外す
auth substack system-auth

差分チェック」を実施し、変更内容に不備がないか確認します。

diff /etc/pam.d/su /etc/pam.d/su.old
7c7
< auth          required        pam_wheel.so use_uid
---
> #auth         required        pam_wheel.so use_uid

vim 拡張機能の追加

ユーザー毎の固有環境」を編集します。
次に下記内容を「最終行」に追記して、上書き保存します。

vi ~/.bashrc
alias vi='vim'

設定を反映させます。

source ~/.bashrc

全体設定ファイル」を「バックアップ」します。

cp -p /etc/vimrc /etc/vimrc.old

全体設定ファイル」を編集します。
次に以下の内容を「追記・変更」します。その後上書き保存します。

vi /etc/vimrc
01.先頭に追記
set encoding=utf-8 "文字コードを指定

02.変更
" set fileencodings=ucs-bom,utf-8,latin1 コメントアウト
set fileencodings=utf-8,iso-2022-jp,sjis,euc-jp  "ファイルエンコードを指定

03.有効になっているか確認 (コメントアウトされていた場合は有効化)
set nocompatible   "独自拡張機能を使用
set history=50  " 検索履歴を残す世代数
set hlsearch    " 検索語にマッチした単語をハイライト
set autoindent  " 自動インデントを有効にする
syntax on   " 構文ごとに色分け表示

04.追記 はじめの方、set~が並んでいる行の後に追記
set fileformats=unix,dos " 自動認識させる改行コードを指定
set ignorecase " 検索時に大文字小文字を区別しない
set incsearch " インクリメンタルサーチを使用
set number " 行番号を表示
set list " 改行 ( $ ) やタブ ( ^I ) を可視化
set showmatch " 括弧入力時に対応する括弧を強調
set binary noeol " ファイルの末尾に改行を入れない
set wrap " ウィンドウ幅で行を折り返す
set tabstop=4 "タブをスペース4つ分にする 初期値:8
set smartcase "大文字で検索した際、大文字小文字を区別する。(大文字のみサーチする。)

05.syntax on の後に追記
highlight Comment ctermfg=LightCyan "syntax onの場合のコメント文の色を変更

差分チェック」を実施し、変更内容に不備がないか確認します。

diff /etc/vimrc /etc/vimrc.old
1d0
< set encoding=utf-8 "文字コードを指定
3,4c2
<     " set fileencodings=ucs-bom,utf-8,latin1
<     set fileencodings=utf-8,iso-2022-jp,sjis,euc-jp  "ファイルエンコードを指定
---
>    set fileencodings=ucs-bom,utf-8,latin1
9c7
< set ai                        " always set autoindenting on
---
> "set ai                       " always set autoindenting on
15,25d12
< set fileformats=unix,dos " 自動認識させる改行コードを指定
< set ignorecase " 検索時に大文字小文字を区別しない
< set incsearch " インクリメンタルサーチを使用
< set number " 行番号を表示
< set list " 改行 ( $ ) やタブ ( ^I ) を可視化
< set showmatch " 括弧入力時に対応する括弧を強調
< set binary noeol " ファイルの末尾に改行を入れない
< set wrap " ウィンドウ幅で行を折り返す
< set tabstop=4 "タブをスペース4つ分にする 初期値:8
< set smartcase "大文字で検索した際、大文字小文字を区別する。(大文字のみサーチする。)
<
66,67d52
< highlight Comment ctermfg=LightCyan "syntax onの場合のコメント文の色を変更

ユーザー毎の設定ファイル」を「新規作成」します。
次に以下の内容を記述後、保存終了します。

vi ~/.vimrc
highlight Comment ctermfg=LightCyan

メール送信設定

サービスの起動及び自動起動を設定します。

systemctl enable --now postfix

which sendmail」を実施し、「usr/bin/sendmail」が返ってくることを確認します。

[root@localhost ~]# which sendmail
/usr/sbin/sendmail

root 宛メール」の「転送設定」をします。

sed -i '/^root:/d' /etc/aliases
sh -c "echo 'root: exsample@exsample.com' >> /etc/aliases"
newaliases

テストメールを送信」し、正常に受信が出来ることを確認します。

echo test | mail root

Growi導入の準備

Growi導入に必要なアプリケーションを導入します。

Python3.xの導入

Python3.x は AppStream から導入可能なため、今回はそちらから導入します。
まずは導入可能なPythonを確認します。

dnf module list python*

2021年10月21日現在、以下のようなリストが表示されます。

AlmaLinux 8 - AppStream
Name       Stream   Profiles           Summary
python27   2.7 [d]  common [d]         Python programming language, version 2.7
python36   3.6 [d]  build, common [d]  Python programming language, version 3.6
python38   3.8 [d]  build, common [d]  Python programming language, version 3.8
python39   3.9 [d]  build, common [d]  Python programming language, version 3.9

今回はせっかくですので、Python3.9を導入します。

dnf module -y install python39

導入したPythonのバージョンを確認します。

python3 -V

git の導入

上述のgroupinstallにてgitは既に導入されていると思いますので、導入可否及びバージョンを確認します。

git --version

万が一導入されていない場合は、以下のコマンドを実施します。

dnf -y install git

Dockerの導入

Dockerを導入します。以下のコマンドを実施します。

curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
sed -i -e "s/enabled=1/enabled=0/g" /etc/yum.repos.d/docker-ce.repo
dnf --enablerepo=docker-ce-stable -y install docker-ce
systemctl enable --now docker
rpm -q docker-ce

最後に導入したDockerのバージョンを確認します。

docker version

Docker Compose の導入

以下のコマンドにてDocker Composeを導入します。

curl -L https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
chmod 755 /usr/local/bin/docker-compose

導入バージョンを確認します。

docker-compose --version

Growiの導入

Docker環境上にて、Growiを導入します。
また一緒にSSL(自己証明書)化も行います。

初期導入 (クローン) の実施

まずGrowiの設計ファイルを任意の場所にダウンロードします。
今回は「/opt」配下にダウンロードしました。

cd /opt/
git clone https://github.com/weseek/growi-docker-compose.git growi
cd /opt/growi/

フォルダーを確認して、各種ファイルがダウンロードされていることを確認します。

ls -l /opt/growi/
合計 32
-rw-r--r-- 1 root root  412 10月 22 09:14 Dockerfile
-rw-r--r-- 1 root root  980 10月 22 09:14 Dockerfile.v42x
-rw-r--r-- 1 root root 1069 10月 22 09:14 LICENSE
-rw-r--r-- 1 root root 3612 10月 22 09:14 README.md
-rw-r--r-- 1 root root 1266 10月 22 09:14 docker-compose.dev.yml
-rw-r--r-- 1 root root 2217 10月 22 09:14 docker-compose.v42x.yml
-rw-r--r-- 1 root root 2305 10月 22 09:14 docker-compose.v43x-v446.yml
-rw-r--r-- 1 root root 2325 10月 22 09:14 docker-compose.yml
drwxr-xr-x 3 root root   38 10月 22 09:14 elasticsearch
drwxr-xr-x 7 root root  123 10月 22 09:14 examples
drwxr-xr-x 2 root root   71 10月 22 09:14 hackmd

docker-compose.yml ファイルの編集

このままでは、導入サーバー内でしか扱うことが出来ないため、設定ファイルを編集します。

まず、設定ファイルをバックアップします。

cp -p /opt/growi/docker-compose.yml /opt/growi/docker-compose.yml.old

続いて、設定ファイルを編集します。

vi docker-compose.yml

まず、サーバー外からのアクセスを許可します。

# - 127.0.0.1:3000:3000    # localhost only by default$
  - 3000:3000$

次にファイルのアップロード先をローカル(AlmaLinuxサーバー内)に変更します。

- FILE_UPLOAD=local     # activate this line if you use local storage of server rather than AWS$
# コメントアウトを外す

メモリを増やします。今回サーバーで8GB取っているので、半分の4GBを確保します。

# - "ES_JAVA_OPTS=-Xms256m -Xmx256m"  # increase amount if you have enough memory$
  - "ES_JAVA_OPTS=-Xms4g -Xmx4g"  # increase amount if you have enough memory$$

https-portal を利用し、SSL化 (自己証明書)します。
まず、「volumes:」の前に以下を追加します。

  https-portal:
    image: steveltn/https-portal:1
    ports:
      - 80:80
      - 443:443
    links:
      - app
    restart: always
    environment:
      DOMAINS: 'exsample.com -> http://app:3000'
      STAGE: local
    container_name: https-portal
    volumes:
      - ./ssl_certs:/var/lib/https-portal

「volumes:」 内に以下を追加します。

volumes:
	ssl_certs:

最終的に今回は以下の内容になりました。

version: '3'

services:
  app:
    build:
      context: .
      dockerfile: ./Dockerfile
    ports:
      - 3000:3000    # localhost only by default
    links:
      - mongo:mongo
      - elasticsearch:elasticsearch
    depends_on:
      - mongo
      - elasticsearch
    environment:
      - MONGO_URI=mongodb://mongo:27017/growi
      - ELASTICSEARCH_URI=http://elasticsearch:9200/growi
      - PASSWORD_SEED=changeme
      # - FILE_UPLOAD=mongodb   # activate this line if you use MongoDB Grid    FS rather than AWS
      - FILE_UPLOAD=local     # activate this line if you use local storage     of server rather than AWS
      # - MATHJAX=1             # activate this line if you want to use Math    Jax
      # - PLANTUML_URI=http://  # activate this line and specify if you use     your own PlantUML server rather than public plantuml.com
      # - HACKMD_URI=http://    # activate this line and specify HackMD serv    er URI which can be accessed from GROWI client browsers
      # - HACKMD_URI_FOR_SERVER=http://hackmd:3000  # activate this line and     specify HackMD server URI which can be accessed from this server container
      # - FORCE_WIKI_MODE='public'    # activate this line to force wiki pub    lic mode
      # - FORCE_WIKI_MODE='private'   # activate this line to force wiki pri    vate mode

    entrypoint: "dockerize
                  -wait tcp://mongo:27017
                  -wait tcp://elasticsearch:9200
                  -timeout 60s
                  /docker-entrypoint.sh"
    command: ["yarn migrate && node -r dotenv-flow/config --expose_gc dist/s    erver/app.js"]

    restart: unless-stopped
    volumes:
      - growi_data:/data

  mongo:
    image: mongo:4.4
    restart: unless-stopped
    volumes:
      - mongo_configdb:/data/configdb
      - mongo_db:/data/db

  elasticsearch:
    build:
      context: ./elasticsearch
      dockerfile: ./Dockerfile
    environment:
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms4g -Xmx4g"  # increase amount if you have enough m    emory
    ulimits:
      memlock:
        soft: -1
        hard: -1
    restart: unless-stopped
    volumes:
      - es_data:/usr/share/elasticsearch/data
      - ./elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/co    nfig/elasticsearch.yml

  https-portal:
    image: steveltn/https-portal:1
    ports:
      - 80:80
      - 443:443
    links:
      - app
    restart: always
    environment:
      DOMAINS: 'exsample.com -> http://app:3000'
      STAGE: local
    container_name: https-portal
    volumes:
      - ./ssl_certs:/var/lib/https-portal

volumes:
  growi_data:
  mongo_configdb:
  mongo_db:
  es_data:
  ssl_certs:

diff で変更点を確認します。

diff /opt/growi/docker-compose.yml /opt/growi/docker-compose.yml.old
TIPS

「 docker-compose.yml」を編集する際は、インデント(段落揃え)に注意してください。
 https-portalのインデントは他の記述を参考に揃えるいいと思います。

インデントが揃っていないとエラーが発生します。

Growiの実行及び起動確認

Growi コンテナを実行します。

docker-compose up -d

ダウンロードとインストールが開始されます。
正常に終了すると下記メッセージが表示されます。

Creating growi_elasticsearch_1 ... done
Creating https-portal          ... done
Creating growi_mongo_1         ... done
Creating growi_app_1           ... done

「https://ドメイン」に接続し、「Growi」が起動するか確認します。

正常にログインが出来れば、実行環境の構築は完了です。

参考サイト様