Contents
Overview
GROWI は、MIT ライセンスで公開されているオープンソースのウィキソフトウェアです。日本の WESEEK という会社のエンジニアが開発しています。本稿では Podman を使用して GROWI を構築します。コンテナで GROWI を構築する場合、公式サイトや Git でも Docker Compose を使用していますので、その内容をPodmanに置き換えて手順化しています。
Pod
最初に Pod を作成します。今回は 10003 ポート Nginx (外部に公開するコンテナ) に割り当てます。Nginx は GROWI を TLS で公開するために使用します。
myadmin@ubuntu:~$ sudo podman pod create -n growi-pod -p 10003:10003 myadmin@ubuntu:~$ sudo podman pod ls
MongoDB
MongoDB コンテナを作成します。
myadmin@ubuntu:~$ sudo podman run -d --pod growi-pod --name growi-mongo \ -e 'TZ=Asia/Tokyo' \ -v growi-mongo-configdb:/data/configdb \ -v growi-mongo-db:/data/db \ docker.io/library/mongo myadmin@ubuntu:~$ sudo podman ps && sudo podman volume ls
Elasticsearch
Elasticsearch コンテナを作成します。
Build
Docker Compose では、公式の Elasticsearch に analysis-kuromoji と analysis-icu を追加して Build していますので、本稿もそれに倣います。また、同じくコンテナの実行時に elasticsearch.yml を書き換えていますが、Bind Mount を使いたくないため、Build のタイミングで書き換えています(理由は調べる必要がありますがこの設定がないと GROWI が正常に起動しません)。
myadmin@ubuntu:~$ sudo mkdir -p /opt/container/growi/elasticsearch/config myadmin@ubuntu:~$ sudo tee /opt/container/growi/elasticsearch/config/elasticsearch.yml <<"EOF" http.host: 0.0.0.0 http.cors.enabled: true http.cors.allow-origin: "*" xpack.security.enabled: false EOF myadmin@ubuntu:~$ sudo tee /opt/container/growi/elasticsearch/Containerfile <<"EOF" FROM docker.io/library/elasticsearch:8.7.0 RUN bin/elasticsearch-plugin install analysis-kuromoji RUN bin/elasticsearch-plugin install analysis-icu COPY config/elasticsearch.yml /usr/share/elasticsearch/config EOF myadmin@ubuntu:~$ cd /opt/container/growi/elasticsearch myadmin@ubuntu:~$ sudo podman build -t growi-elasticsearch . myadmin@ubuntu:~$ sudo podman images
コンテナの実行
Elasticsearch コンテナを実行します。
myadmin@ubuntu:~$ sudo podman run -d --pod growi-pod --name growi-elasticsearch \ -e 'TZ=Asia/Tokyo' \ -e 'bootstrap.memory_lock=true' \ -e 'ES_JAVA_OPTS=-Xms256m -Xmx256m' \ -e 'LOG4J_FORMAT_MSG_NO_LOOKUPS=true' \ -v growi-elasticsearch-data:/usr/share/elasticsearch/data \ --ulimit memlock=-1:-1 \ localhost/growi-elasticsearch myadmin@ubuntu:~$ sudo podman ps && sudo podman volume ls
GROWI
GROWI コンテナを作成します。Docker Compose では dockerize を組み込んで Build していますが、無くても問題ないようなので、あえてそのまま実行しています。
myadmin@ubuntu:~$ sudo podman run -d --pod growi-pod --name growi \ -e 'TZ=Asia/Tokyo' \ -e 'MONGO_URI=mongodb://127.0.0.1:27017/growi' \ -e 'ELASTICSEARCH_URI=http://127.0.0.1:9200/growi' \ -e 'PASSWORD_SEED=password' \ -v growi-data:/data \ docker.io/weseek/growi:6 myadmin@ubuntu:~$ sudo podman ps && sudo podman volume ls
Nginx
Nginx コンテナを作成します。
Volume
Nginx の設定ファイルと TLS 証明書を Nginx に読み込ませるため、コンテナからマウントする Volume を作成します。コンテナの生成時にも自動生成されるため、このタイミングでの作成は必須ではありません。
myadmin@ubuntu:~$ sudo podman volume create growi-nginx-conf.d myadmin@ubuntu:~$ sudo podman volume ls
設定ファイルと TLS 証明書の配置
TLS 証明書を配置( TLS 証明書の作成はこちらを参照)して、Nginx の設定ファイルを作成しています。本稿での Nginx はリバースプロキシとして使用します。http://127.0.0.1:3000 は GROWI コンテナのポート番号です。
myadmin@ubuntu:~$ sudo cp /home/myadmin/work/easy-rsa/pki/{issued/si1230.com.crt,private/si1230.com.key} /var/lib/containers/storage/volumes/growi-nginx-conf.d/_data myadmin@ubuntu:~$ sudo tee /var/lib/containers/storage/volumes/growi-nginx-conf.d/_data/proxy.conf <<"EOF" server { listen 10003 ssl; server_name growi.si1230.com; ssl_certificate /etc/nginx/conf.d/si1230.com.crt; ssl_certificate_key /etc/nginx/conf.d/si1230.com.key; location / { proxy_pass http://127.0.0.1:3000; } access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; } EOF
コンテナの実行
Nginx コンテナを実行します。
myadmin@ubuntu:~$ sudo podman run -d --pod growi-pod --name growi-nginx \ -e 'TZ=Asia/Tokyo' \ -v growi-nginx-conf.d:/etc/nginx/conf.d \ docker.io/library/nginx myadmin@ubuntu:~$ sudo podman ps
GROWI へのアクセス確認
以下で GROWI にアクセスできます。
https://growi.si1230.com:10003
systemd
systemd で GROWI を制御します。
systemd ユニットファイル
systemd ユニットファイルを作成します。
myadmin@ubuntu:~$ cd /etc/systemd/system && sudo podman generate systemd -f -n growi-pod
systemd ユニットファイルの有効化
systemd を再起動して、追加したユニットファイルを読み込みます。
myadmin@ubuntu:~$ sudo systemctl daemon-reload
起動設定
システムの起動時に自動的に起動させます。
myadmin@ubuntu:~$ sudo systemctl enable --now pod-growi-pod.service myadmin@ubuntu:~$ sudo systemctl status pod-growi-pod.service
環境初期化
必要に応じて、これまでに構築した内容を削除します。
myadmin@ubuntu:~$ sudo podman ps | grep 'growi' | awk '{print $1}' | xargs sudo podman rm -f && \
sudo podman volume ls | grep 'growi' | awk '{print $2}' | xargs sudo podman volume rm -f && \
sudo podman pod ps | grep 'growi' | awk '{print $1}' | xargs sudo podman pod rm -f && \
sudo rm -r /opt/container/growi