月: 2022年9月 Page 2 of 3

新規インストールしたLinux Mint 20.03にgrowiをインストール。-3-

growiとnginxを連携させ、ポート番号をブラウザに入力することなくアクセスできるよう設定します。

前提

この作業を行う場合は、サーバ名とIPアドレスが名前解決できることが必須となります。

mkcertのインストール

sudo su -

curl -s https://api.github.com/repos/FiloSottile/mkcert/releases/latest | grep browser_download_url | grep linux-amd64 | cut -d '"' -f 4 | wget -qi - \
    && mv mkcert-v*-linux-amd64 mkcert \
    && chmod a+x mkcert \
    && mv mkcert /usr/local/bin/

exit

mkcert 認証局作成

mkcert -install

mkcert -CAROOT
# 指定通りの場所にあるかを確認します
# このディレクトリにある「rootCA.pem」はブラウザにインポートすることによって「信頼された情報局」であると示すことができます

mkcertでローカル証明書を作成

cd ~

mkcert -key-file [証明書秘密鍵].key.YYYYMM -cert-file [証明書].crt.YYYYMM ドメイン 
mkcert -key-file corn.wall.key.202204 -cert-file corn.wall.crt.202204 corn.wall penzance.corn.wall "*.corn.wall" 
# ワイルドカード証明書も作成できます

openssl x509 -text -noout -in ./corn.wall.crt.202204 |grep DNS
# DNSの蘭に登録した証明書のローカルドメイン名があることを確認します

ローカル証明書を格納

sudo mkdir /etc/certs

sudo cp -pi ./*.crt* /etc/certs/

sudo mkdir /etc/private

sudo cp -pi ./*.key* /etc/private/

ローカル証明書のシンボリックリンク化

mkcertsはあくまでもローカル環境での証明書を作成するツールなので、更新サイクルが3ヶ月程度となっています。
そこで、後のメンテナンスがしやすいようにシンボリックリンクを張ります。

実行例

cd /etc/certs/

ln -s corn.wall.crt.202204  corn.wall.crt

cd /etc/private/

ln -s corn.wall.key.202204 corn.wall.key

nginxインストール

sudo aptitude install nginx

リバースプロキシー化事前設定

sudo mkdir /etc/old

sudo cp -pi /etc/hosts /etc/old/hosts.`date +%Y%m%d`

sudo sed -i 's/127.0.1.1/127.0.0.1/g' /etc/hosts
# Ubuntu系はhost名のローカルアドレスを127.0.1.1と記載するので書き換えます
sudo openssl dhparam -out /etc/nginx/dhparam.pem 2048
# 環境によっては5分以上かかります

sudo mkdir /var/log/nginx/growi

sudo chown www-data:www-data /var/log/nginx/growi

nginx設定ファイル作成

※ コマンド実行の前に[ ]でくくった箇所を自分の環境に置き換えてください。

以下の順番で行うとやりやすいです。

  1. 以下のコマンド全行(cat - ~ 最下行のEOFまで)をコピーする
  2. 任意のテキストエディタに貼り付ける
  3. [ ]でくくった箇所を置き換えて編集する(このとき、[ ] も外します)
  4. 置き換えて編集したコマンド全行をコピー
  5. ターミナルに貼り付けて実行する
cat <<- 'EOF' | sudo tee -a /etc/nginx/sites-available/growi.conf
upstream [growiを公開するサブドメイン(e.g. growi)] {
       server [growiサーバのIPアドレス]:3000;
}

server {
        listen 80;
        server_name [公開するWebドメイン(e.g. growi.example.test)];
        server_tokens off;
        return  301 https://$host$request_uri;
        access_log /var/log/nginx/growi/access.log;
        error_log /var/log/nginx/growi/error.log warn;
}

server {
        listen 443 ssl http2;
        server_name [公開するWebドメイン(e.g. growi.example.test)];
        server_tokens off;
        ssl_session_timeout 1d;
        ssl_session_cache shared:SSL:50m;
        ssl_session_tickets off;
        ssl_dhparam /etc/nginx/dhparam.pem;
        ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
        ssl_prefer_server_ciphers off;
        add_header Strict-Transport-Security 'max-age=63072000';

        ssl_certificate [証明書が格納されているディレクトリ/証明書ファイル];
        ssl_certificate_key [秘密鍵が格納されているディレクトリ/秘密鍵ファイル];

        ssl_stapling on;
        ssl_stapling_verify on;
        # mkcert以外のきちんとした証明書を用いる時に使うオプションです

        access_log /var/log/nginx/growi/ssl_access.log;
        error_log /var/log/nginx/growi/ssl_error.log warn;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_max_temp_file_size 10240m;
        client_max_body_size 10240m;
        proxy_redirect off;

       set $proxy_target  '[growiを公開するサブドメイン(upstreamの行で設定したもの)]';

       location / {
          proxy_pass http://$proxy_target;
       }

       location /socket.io/ {
          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection "Upgrade";
          proxy_cache_bypass $http_upgrade;
          proxy_pass http://$proxy_target/socket.io/;
       }
}
EOF

コンフィグファイルの有効化

cd /etc/nginx/sites-enabled
sudo unlink default
# nginxの基本設定を無効化します
sudo ln -s /etc/nginx/sites-available/growi.conf growi.conf
# 先ほど作成したコンフィグファイルを有効化します

起動確認

sudo nginx -t
# syntax is ok と test is successful を確認します

sudo systemctl restart nginx

sudo systemctl enable nginx

systemctl status nginx
# (runnning) と enabled を確認します

確認後、

http://[指定したドメイン名]

で、

  • Growiのログイン画面が見えること(:3000を付ける必要がないこと)
  • SSL通信(httpsにリダイレクトされること)を確認してください

新規インストールしたLinux Mint 20.03にgrowiをインストール。-2-

ここでは、インストールしたGrowiをサービス化して、サーバを再起動しても自動実行されるようにします。

起動スクリプト化

※ cat ~ EOFまで全行を実行します。

※ コマンド実行の前に[ ]でくくった箇所を自分の環境に置き換えてください。

以下の順番で行うとやりやすいです。

  1. 以下のコマンド全行(cat - ~ 最下行のEOFまで)をコピーする
  2. 任意のテキストエディタに貼り付ける
  3. [ ]でくくった箇所を置き換えて編集する(このとき、[ ] も外します)
  4. 置き換えて編集したコマンド全行をコピー
  5. ターミナルに貼り付けて実行する
cat <<- 'EOF' | sudo tee -a /var/growi/growi-start.sh
#!/bin/sh
cd /var/growi
NODE_ENV=production \
AUDIT_LOG_ENABLED=true \
FORCE_WIKI_MODE=private \
MONGO_URI=mongodb://localhost:27017/growi \
ELASTICSEARCH_URI=http://localhost:9200/growi \
REDIS_URI=redis://localhost:6379 \
PASSWORD_SEED=[ランダムな文字列を指定する] \
FILE_UPLOAD=local \
npm start
EOF

また、上記は筆者の環境に合わせています。不要な場合は削除ください。

  • AUDIT_LOG_ENABLED=true \
    • v5.1.10から実装された監査ログを有効化する機能
  • FORCE_WIKI_MODE=private \
    • 強制的に全てのページを非公開にする

起動スクリプトに実行権限を付与

sudo chmod +x /var/growi/growi-start.sh

ls -l /var/growi/growi-start.sh
# 実行権限がついていることを確認

サービスとして登録

cat <<- 'EOF' | sudo tee -a /etc/systemd/system/growi.service

[Unit]
Description = growi
After=network-online.target mongod.service
ConditionPathExists=/var/growi

[Service]
ExecStart=/var/growi/growi-start.sh
Restart=no
Type=simple

[Install]
WantedBy=multi-user.target

EOF

登録したサービスを有効化

sudo systemctl daemon-reload

sudo systemctl start growi.service

sudo systemctl enable growi.service

sudo systemctl status growi.service
# (running)とenabledを確認

起動確認

起動後(3分ぐらいかかります)、
http://[IPアドレス/dns登録名]:3000

にアクセスすることで、growiのログイン画面が出てきます。この段階で利用可能です。

次にご紹介するリバースプロキシー有効化などは、ローカル運用と割り切ってしまえば不要なオプション設定です。

新規インストールしたLinux Mint 20.03にgrowiをインストール。-1-

コンテナ環境だともっと楽なのでしょうけれど、きちっとオンプレで運用したいので、こういう方法をとりました。

前提

  • インストールするサーバはUbuntu 20系のLinux Mint 20.03を用います。(22系はMongoDBで詰まりました)
  • 他にWebサーバを稼働していないサーバにて実施しています。
  • ローカルNW内で運用するため、サーバのセキュリティ設定は低くなっています。
  • インストールするディレクトリは「/var/growi」とします。
  • ここではあくまでもインストールと起動確認を行うまでです。
  • エディタによる編集は極力使わず、コマンドのコピー&ペーストで完結するようにしています。
  • ここではインストールと動作確認にとどめます。

参考にしたURL

  • Ubuntu Server 20.04 LTSにGROWIをインストール

https://qiita.com/BigTree777/items/4a67d36c4111a1fb50e7

  • Ubuntu18.04にGrowiをインストール

https://qiita.com/hawk777/items/0916024c1bd7b24904ae

手順

別途、記載がない限りは

  • 1行空いているコマンドは、1行ずつ実行します。
  • 空白行がない一連のコマンドは全てをコピー&ペーストして実行します。

必要に応じて:aptitudeのインストール

sudo apt-get install aptitude
# 本項ではパッケージ管理にaptitudeを用いますので、導入されていない場合はインストール。
# ポリシーによりaptを用いる場合は読み替えてください。

事前準備 - nginx リポジトリの追加

sudo add-apt-repository ppa:ondrej/nginx
# これを先に実施しないと、mongodbのバージョン固定に失敗しました

Node.js/npm/yarnのインストール

cd ~

curl -sL https://deb.nodesource.com/setup_14.x -o nodesource_setup.sh

sudo bash nodesource_setup.sh

sudo aptitude install nodejs
Node.jsとnpmのインストール確認
node -v

npm -v
# インストールしたバージョンを確認

yarnのインストール

sudo npm install -g yarn

yarn -v
# インストールしたバージョンを確認

Elasticsearchのインストール

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg

sudo aptitude install apt-transport-https

echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-7.x.list

sudo aptitude update && sudo aptitude install elasticsearch

dpkg -l |grep elasticsearch
#インストールしたバージョンを確認
Elasticsearchに割り当てるメモリを調整
sudo mkdir /etc/elasticsearch/old
# 切り戻しができるように、設定ファイルのバックアップを格納するディレクトリを作ります

sudo cp -pi /etc/elasticsearch/jvm.options /etc/elasticsearch/old/jvm.options.`date +%Y%m%d`
# .`date +%Y%m%d`をつけることで、バックアップファイルは当日日付(YYYY/MM/DD形式)で記録されます

echo -e "-Xms256m\n-Xmx256m" | sudo tee -a /etc/elasticsearch/jvm.options
メモリ調整確認
sudo diff -u /etc/elasticsearch/old/jvm.options.`date +%Y%m%d` /etc/elasticsearch/jvm.options

diffの出力結果(差分)が以下であることを確認します。

+-Xms256m
+-Xmx256m
Elasticsearchの自動起動の有効化
sudo systemctl start elasticsearch

sudo systemctl enable elasticsearch

sudo systemctl status elasticsearch
# (running) と enabledを確認

Growiに必要なElasticsearchプラグインのインストール

sudo /usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-kuromoji

sudo /usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-icu

sudo systemctl restart elasticsearch

Redisのインストール

sudo add-apt-repository ppa:chris-lea/redis-server

sudo aptitude update && sudo aptitude install redis-server
インストール後の確認
redis-cli --version

redis-server --version
# インストールしたバージョンが表示されることを確認

sudo systemctl start redis-server

sudo systemctl enable redis-server

sudo systemctl status redis-server
# (running) と enabledを確認

MongoDBのインストール

wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -

echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list

sudo aptitude update && sudo aptitude install mongodb-org=4.4.13 mongodb-org-server=4.4.13 mongodb-org-shell=4.4.13 mongodb-org-mongos=4.4.13 mongodb-org-tools=4.4.13

MongoDBのバージョン固定

echo "mongodb-org hold" | sudo dpkg --set-selections

echo "mongodb-org-server hold" | sudo dpkg --set-selections

echo "mongodb-org-shell hold" | sudo dpkg --set-selections

echo "mongodb-org-mongos hold" | sudo dpkg --set-selections

echo "mongodb-org-tools hold" | sudo dpkg --set-selections
インストール後の確認
redis-cli --version

mongod --version
# インストールしたバージョンが表示されることを確認

sudo systemctl start mongod

sudo systemctl enable mongod

sudo systemctl status mongod
# (running) と enabledを確認

Growiのインストール

sudo aptitude install git build-essential

sudo git clone https://github.com/weseek/growi /var/growi

cd /var/growi

sudo git tag -l
# 2022/09/15での最新版は5.1.4

sudo git checkout -b v5.1.4 refs/tags/v5.1.4

sudo yarn

Growi起動確認

ここでは「PASSWORD_SEED」を「GOLDEN_SEED」と設定します。任意のランダム文字列を指定してください。

先頭のsudo から最終行のnpm startまで全てコピー&ペーストで実行します。

sudo \
NODE_ENV=production \
MONGO_URI=mongodb://localhost:27017/growi \
ELASTICSEARCH_URI=http://localhost:9200/growi \
REDIS_URI=redis://localhost:6379 \
PASSWORD_SEED=GOLDEN_SEED\
FILE_UPLOAD=local \
npm start

以下の表示が出たら起動は成功です。

> growi@(インストールしたバージョン) start /var/growi
> yarn app:server

ブラウザで

http://IPorホスト名:3000

に接続し、ログインページ表示を確認します。(ここではまだログインをしないでください)

ログインページ表示を確認後、[Ctrl]+[C]で抜けます。

これからの流れ

最終的に以下を行います。

  • mkcertによるSSL取得と常時SSL化
  • nginxによるリバースプロキシー
  • growiの起動スクリプト化

丸みと広がり。(キャップレンズ:フィッシュアイ撮影)

出歩く用事があったので、E-P7とレンズいくつかを携えて撮影です。

先だって購入したマクロレンズはスナップの距離でも扱えるのが高ポイント。

そんな中での収穫はタイトルにもあるようにフィッシュアイ。

性質上、画角が広くなるので建物の広さを十分に見せることができました。

Growiの管理者パスワードリセット。

あらまし

検証の繰り返しで再作成する羽目になったgrowi。幸いDBデータは残っていたのでデータそのものは無事だったのですが、管理者パスワードを忘れてしまいました。

そこで、以下の通りにパスワードをリセットさせました。

前提

  • Growiのバージョンは2022年9月時点で最新の5.1.4。
  • 登録の制限:公開(だれでも登録可能)

手順

参考:
https://blog.akky.me/blog/change-growi-password-manually/

上記URLにあるように、環境変数'PASSWORD_SEED'を確認しようとしましたが、再作成の際に変数を失念。

なので、搦め手を用いました。

ユーザー登録を行います。(Growi Web画面)

Growiのトップ画面「新規登録はこちら」から

  • ユーザーID
  • 名前
  • メールアドレス (管理者と同じメールアドレスは登録できないので注意してください)
  • パスワード

を設定して新規登録します。このとき、パスワードは「リセットを行いたい管理者パスワード(上書きを行いたいパスワード)」にします。

ログインできることを確認したので、ここからはターミナルでの操作になります。

mongodbに接続します。(Growiがインストールされたサーバ)

管理者権限で実施しました。

mongo growi

上記で新規登録をしたユーザのデータを確認します。(Growiがインストールされたサーバ)

db.users.find({email: "上記登録をしたメールアドレス"});

パスワードのハッシュ値を確認します。(Growiがインストールされたサーバ)

出力されたデータの以下の値を確認します。アカウント情報がずらっと出てくる中で、

"password" : "ハッシュ化されたパスワード値",

これを控えておきます。

管理者パスワードを上書きます。(Growiがインストールされたサーバ)

db.users.update({email: "管理者のメールアドレス"}, {$set: {password: "先程控えておいたパスワードのハッシュ値"}}); 
# WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) と表示されればOKです

上書きしたパスワードでログインします。(Growi Web画面)

この手順でなんとか管理者でログインできました。

後処理を行います。(Growi Web画面)

管理>ユーザー管理 へと進み、一時的に作成したユーザを停止したり管理者に昇格させたりしてください。

鉱物と小物。-百均グッズの撮影用小物(その21)-

昨日に引き続いての百均グッズの撮影小物。

「クリアオブジェクト」と銘打たれている水晶めいたもの。

ゲーム『ライザのアトリエ2』のシーンが再現できるのではと思い、早速の実践です。

1st take

思ったよりも悪くありません。そこで、ポーズや構図を変えてみます。

2nd take

よりダイナミックな感じにいけました。このクリスタルオブジェクト、透明感のある反射材として他にも応用がききそうです。

秋の装い。-百均グッズの撮影用小物(その20)-

百均でこちらを見つけました。そろそろ季節も移り変わるということで、新たな背景を用意することにします。

背景組み立て

  • 木製トレリス
  • 紅葉の造花
  • その他造花リング

まずは紅葉を囲むように取り付け。

造花を配置していき

最終的にこうなりました。

撮影

上下非対称にしているため、ひっくり返すだけで印象を変えられるようにしました。

百均グッズによるボードゲーム『リトルタウンビルダーズ』収納。

今年6月に遊んだボードゲーム『リトルタウンビルダーズ』。

実物を購入し、開封となりました。

厚めの箱なので収納は楽かと思っていたものの

  • 分厚いゲームボード×2
  • 大きくしっかりしたタイル
  • 種類が多く小さめの木駒

と結構厳しいものでした。

そこで、

  • 二段のアクセサリーケースの上下にタイルと資源/コイン
  • 分割ピルケースにワーカー類
  • カードケースに目標カードとラウンドマーカー

で、このような配置となります。多少の隙間はありますが、許容範囲内。

一度遊んで「これはワーカーレース面との入門としてピッタリ」思っていたゲームなので、きちんと整理できて満足です。

アルル、植林。(ボードゲーム『アルルの丘』ソロプレイ)

土曜日の夜、寝る前にボードゲーム『アルルの丘』をセットアップ。そして、朝の内にソロプレイです。

最終的な盤面はこちら。

序盤から積極的に植林し、木材をため込んでいく方針。

ただ、それが少し禍いして他の資材が間に合わないという状況に陥ります。

それでも順調に開拓を重ねて105点台とまずまずの点数です。

  • 「これでソロゲー?」な多量のコンポーネント
  • アクションスペースが最初からフルオープン
  • そのため毎回異なった開拓を楽しめ
  • 建物コンボと資源変換が小気味よい

自分の最推しの重ゲームだなぁと。

Configuration GeneratorによるSSL強度再設定。

AWS Lightsailで運用している「インターネット接続用redmine」。運用にあたり、SSLの強化を図るため

こちらにあるように強度チェッカーで検証しながら設定を行っていました。

ところが最近、このチェックが厳しくなったようで評価がAまで落ちます。

信頼度は高いと言えるものの余り気分がいいものではありません。そこで、再びA+となるように設定を行いました。

SSL Configuration Generator

https://ssl-config.mozilla.org/

mozillaが公式に提供しているこのサイト、

  • サーバプログラム
  • プログラムのバージョン
  • 強度

を設定するだけでサンプルコードを示してくれる優れもの。これを使い、こんな感じで設定しました。

設定ファイル

<VirtualHost _default_:80>
servername 公開するドメイン
 RewriteEngine On
        RewriteCond %{HTTPS} off
        RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
        # http通信をhttps通信にリダイレクト
</VirtualHost>
<VirtualHost _default_:443>
servername 公開するドメイン

CustomLog /var/log/redmine/access.log combined
ErrorLog /var/log/redmine/error.log
# redmineログ設定

SecRuleEngine On
## ModSecurity有効化
SecRequestBodyInMemoryLimit 524288000
SecRequestBodyLimit 524288000
## ファイルのアップロードをできるようにします。
SecRuleRemoveById 949110
SecRuleRemoveById 941310
SecRuleRemoveById 980130
SecRuleRemoveById 911100
SecRuleRemoveById 200002
SecRuleRemoveById 200003
SecRuleRemoveById 200004
SecRuleRemoveById 959100
## 上記を無効化しないとチケット更新時にエラーとなりました(偽陽性)ため、上記ルールを除外します。
    SecRule ARGS:modsecparam "@contains test" "id:4321,deny,status:403,msg:'ModSecurity test rule has triggered'"
## テスト用の検知パラメータを付け加えます。

## Negativelist
SecRule REMOTE_ADDR "@pmFromFile negativelist.txt" "phase:1,id:2,deny,msg:'Negativelisted IP address'"
## Mod_Securityが検知したIPアドレスをブロックします。

Alias /redmine /var/lib/redmine/public

<Location /redmine>
PassengerBaseURI /redmine
PassengerAppRoot /var/lib/redmine
Require all granted
<RequireAll>
    Require all granted
</RequireAll>
</Location>

## 上記はredmineの設定です

  SSLEngine on
    Protocols h2 http/1.1
    Header always set Strict-Transport-Security "max-age=63072000"
## SSLならびにHSTS有効化。

SSLCertificateFile /path/to/SSL/Certificate
SSLCertificateKeyFile /Path/to/SSL/Private/Key
## 証明書を格納します。

        RewriteEngine On
        RewriteCond %{HTTP_HOST} ^ドメイン名
        RewriteRule ^/$ https://ドメイン名/redmine/ [R]
        # ドメイン名でアクセスした際に/redmine/にリライトします。

</VirtualHost>

SSLProtocol             all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite          ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
SSLHonorCipherOrder     off
SSLSessionTickets       off

SSLUseStapling On
SSLStaplingCache "shmcb:logs/ssl_stapling(32768)"
## Configuration Generatorで追加した設定。<virtualhost>ディレクティブの外に出す必要がありました。

こちらを修正してサービス再起動。

再起動後の強度チェック

再びA+を取り戻しました。

Page 2 of 3

Powered by WordPress & Theme by Anders Norén