カテゴリー: BookStack Page 1 of 2

AWS Lightsail → WebARENAへの移行完了。

はじめに

個人的に用いているVPSのコンテンツを、AWS LightsailからWebARENAへと移行完了。

今までUbuntu 20.04で動いていたサーバがUbuntu 24.04へと変わったことにより、Ubuntu 20.04のEOL対応を済ませたという形。

それぞれが、URLもそのままに、バージョンが上がった状態で表示されているという形です。

移行のきっかけ

Ubuntu 20.04のEOLが近づいてきた

これが一番の理由。Lightsailを最初に使い始めた頃は2022年5月だったので、まだ余裕があったのですが、そこから2年も経つとさすがに対応するしかないという形。

Lightsailにそのままインスタンスを移行させても良かったのですが

円安によるLightsail利用料高騰

という立ちはだかる壁があり、

  • 4GB Memory
  • 80 GB SSD

をもう一つ作り維持して行くには結構辛いものがありました。その上、

IPv4アドレスに追加料金

という更に手痛い値上げも発表されます。

迫るEOLに維持費の高騰、それをどうにかするために選んだのがWebARENAです。

WebARENAに切り替えた理由

利用費の安さ

https://web.arena.ne.jp/indigo

2024/10/12現在、

  • 4vCPU
  • 4GB Memory
  • 80GB SSD

で月額1630円。(筆者がサインアップしたときは1年間有効のクーポン付きでした)

Lightsailの24USD/月より安価なのは魅力的でした。

キャリア運営による回線の安定。

今回はNextcloudを使うと決めているだけに、回線が安定しているキャリア(docomo)のvpsを利用しました。

移行が思ったよりスムーズだった理由

元からデータをクラウドストレージに保存していた

これが一番大きかったです。クラウドストレージWasabiをs3でマウントしていたために、他のサーバに画像を転送する必要すらありませんでした。

また、mysqldumpの転送も、同じようにs3経由で引っ張るだけです。

サービス構築のメモを最初に残していた

冒頭の外部サイトやこのブログに

  • うまくいった手順
  • ハマったこと
  • 失敗した理由

など書いていたのが助かりました。手順を基本的にコピペで済むように済ませていたのも自賛する点です。

事前検証

この検証のように、別サーバに移行することをやっていたのもまた助かりました。

今後

最小限構成でのLightsailの転用

とはいえ、「LightsailのDNS機能」が有用であるため、一番安いインスタンスを残しつつ他の用途に使っていきます。

BookStackのサーバ移行でハマったこと。

LAMP環境で動くアプリケーションを移行する際、だいたいは

  1. 移行先でWebアプリを作成する
  2. 移行元から移行先へとデータ(画像や添付ファイル)をコピーする
  3. DBをエクスポート→インポートする

の流れで別サーバへと移行が可能です。BookStackも同じような理屈で移行が行えるかを確かめたところ、罠がいくつかありました。

環境

共通環境

  • Apache 2.4
  • MySQL8系

移行元

  • Ubuntu 20.04
  • PHP 8.1

移行先

  • Ubuntu 24.04
  • PHP 8.3

さっくりといかない手順

  1. 【移行先】BookStackを構築します。
  2. オプション【移行元】アカウントのセキュリティ設定を一度解除します。
  3. 【移行元】→【移行先】画像や添付データ一式を転送します。
  4. 【移行元】→【移行先】MySQLのダンプを行い、DBを転送します。
  5. 【移行先】DBをインポートします。
  6. 【移行先】DBマイグレーションを行います。
  7. オプション【移行先】URLの変更処理を行います。
  8. 【移行先】設定の反映を行います。
  9. 【移行先】移行先で確認を行います。

【移行先】BookStackを構築します。

自サイトで恐縮ですが、手順はこちらをそのまま用いています

オプション【移行元】管理アカウントの二要素認証を解除。

これが一番ハマったポイントでした。

マイアカウント > アクセス&セキュリティ > 多要素認証

で、二要素認証をオンにしていると、移行先でログインができませんでした。

なので、移行時の一時的な措置として解除を行います。

【移行元】→【移行先】データの転送

BookStackのルートディレクトリ配下の

/public/uploads/を一式、移行先へと転送して、同じディレクトリ構造に上書きします。SCPやtarで固める塔、任意の方法で転送します。

このとき、アクセス権をWebサービス実行ユーザにしてください。(Ubuntuのデフォルトはwww-data)

【移行元】→【移行先】DBのデータ移行

mysqldump -h localhost -u bookstackuser -p --no-tablespaces --single-transaction bookstack > bookstack_backup.$(date +%Y%m%d).sql

-h DBサーバ名、-u bookstackのDBにアクセスできるユーザー DB名という形です。DBユーザに設定されているパスワードを入力してダンプを取ります。

こうしてできたDBは、任意の(安全で確実な)方法で移行先に転送します。

【移行先】DBのリストア

  • ディレクトリ移動
cd /hoge && pwd

ダンプしたDBファイルが転送されているディレクトリに移動します。

  • DBインポート
mysql -h localhost -u bookstackuser -p bookstack < bookstack_backup.$(date +%Y%m%d).sql

【移行先】DBのマイグレーション

これもハマったポイントでした。

  • BookStackルートディレクトリに移動
/path/to/BookStack/root/directory && pwd

/var/www/html/BookStackなど、移行先の、BookStackがインストールされているディレクトリに移動します。

  • DBマイグレーション
sudo -u www-data php artisan migrate --force

このマイグレーションを行わないと、リストアしたDBを参照してくれませんでした。

オプション【移行先】URL変更処理

サーバのURLを変える場合はここにも罠があります。BookStackの設定ファイル、.env

# Application URL
# This must be the root URL that you want to host BookStack on.
# All URLs in BookStack will be generated using this value
# to ensure URLs generated are consistent and secure.
# If you change this in the future you may need to run a command
# to update stored URLs in the database. Command example:
# php artisan bookstack:update-url https://old.example.com https://new.example.com

という但し書きがありますので、この処理を行います。

  • BookStackルートディレクトリに移動
/path/to/BookStack/root/directory && pwd
  • URLアップデート
sudo -u www-data php artisan bookstack:update-url https://old.example.com https://new.example.com

二回ほど確認されますので、両方とも「yes」で答えます。

DB上書き反映

  • BookStackルートディレクトリに移動
/path/to/BookStack/root/directory && pwd
  • キャッシュクリア
sudo -u www-data php artisan cache:clear
  • Webサービス(apache)再起動
sudo systemctl restart apache2.service
  • Webサービス(apache)再起動確認
systemctl status apache2.service

active(running)を確認します。

サーバ移行確認

  1. ブラウザで移行先のURLにアクセスします。
  2. ログインできることを確認します。
  3. 前のデータ(画像や添付含む)が閲覧できることを確認します。
  4. 記事の作成等が行えることを確認します。
  5. 多要素認証をしている場合は、再設定します。

BookStack マークダウンエディタのチートシート(ショートカット)。

BookStackで記事を編集中、適当にキーボードを操作していたら、見出しが自動的に入ったので調べてみました。

https://www.bookstackapp.com/docs/user/markdown-editor

ショートカット一覧

ショートカット説明備考
Ctrl + S下書きを保存投稿して公開は下の機能を使います
Ctrl + Enterページを保存して公開
Ctrl + 1見出し(h2)## が入ります
Ctrl + 2見出し(h3)### が入ります
Ctrl + 3見出し(h4)#### が入ります
Ctrl + 4見出し(h5)##### が入ります
Ctrl + 5段落いわゆる\<p>です
Ctrl + 6段落いわゆる\<p>です
Ctrl + 7コードブロック```~```が入ります
Ctrl + Eコードブロック```~```が入ります
Ctrl + 8インラインコード`~`が入ります
Ctrl +O番号付きのリスト1. が入ります
Ctrl + P箇条書きリスト- が入ります
Ctrl + Kリンク挿入[]()が入ります
Ctrl + Shift + KBookStack内のリンク挿入ページ一覧がモーダル表示されます
Ctrl + Shift + IURL経由での画像挿入![](http://)が入ります

※Macを利用する方はCtrlをCommandに読み替えてください。

これらのショートカット、非常に便利。特に見出しとコードをシームレスに入力できるのは大きなアドバンテージでした。

やりなおし、書き直し。

起こったこと

結論から言うと、別に管理しているBookStackサイトを一から作り直す羽目になりました。

https://barrel.reisalin.com

事象としては

  • ページを作れなくなった。
  • 状況を確認しようとさらに試したらログインすらできなくなった。
  • (エラーが発生しています)のみ表示される。

原因

おそらく

の時に、バージョン24を試したこと。

その際にartisan migrateが走りませんでした。

こちら、起き抜けにてなりで作業していたために、諸々の記録が残っていなかったのが悔やまれます。

コンテンツの書き直し

とはいえ、下書きはある程度あるので、ドキュメントの再作成がやりやすかったのは幸いです。

本棚も、自分が読みやすいように整理しています。

これから

  • コンテンツの拡充
  • 可能な限りの再現性の確認

などをおこなっていきます。

BookStackにGoogleフォントを設定。

こちらでBookStackに任意のフォントを設定する方法を説明しましたが、

Webで公開されているGoogleフォントに置き換えます。

設定

管理者権限でログイン後、
設定>カスタマイズ>カスタムheadタグに進みます。

以下のコードを入れます。

<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@100..900&display=swap" rel="stylesheet">
<style>
body, h1, h2, h3, h4, h5, h6 {
font-family: 'Noto Sans JP', sans-serif;
}
</style>

ここでは Noto Sans JPを入れています。適宜合わせてください。

設定後、

のように、Googleフォントに変わっていれば設定完了です。

BookStackをnginxで動かす場合の設定。

デスクトップPCとしてのLinux利用(Kubuntu 22.04インストール後にやったこと) – Manualmaton's Laboratory

こちら、ローカルサーバとして運用することにしています。

公開しているサイトと異なりnginxで動かしているので、その場合のメモです。

環境

  • Ubuntu 22.04
  • 適切に名前解決できる
  • ドメイン名に沿った証明書がある
    • 筆者はmkcertでローカル証明書を作っています

インストールして最初の設定が終わっている状態です。

nginxインストール

sudo aptitude install nginx

mysqlインストール

sudo aptitude install mysql-server mysql-client libmysqlclient-dev

sql設定変更

sudo cp -pi /etc/mysql/mysql.conf.d/mysqld.cnf /path/to/backup/mysqld.cnf.$(date +%Y%m%d)
# 任意のバックアップディレクトリを指定します。
# .$(date +%Y%m%d)をつけることで、バックアップファイルは当日日付(YYYYMMDD形式)で記録されます

diff -u /etc/mysql/mysql.conf.d/mysqld.cnf /path/to/backup/mysqld.cnf.$(date +%Y%m%d)
# バックアップが取れていることを「差分が存在しないこと」で確認します

echo -e "default_authentication_plugin=mysql_native_password" | sudo tee -a /etc/mysql/mysql.conf.d/mysqld.cnf
# mysqld.cnfに追記をします

MySQL再起動

sudo systemctl restart mysql.service

MySQLのrootパスワード変更

sudo mysql
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
flush privileges;
exit

運用に合わせて適切なパスワードを設定します。

mysql-secure-installation

sudo mysql_secure_installation

詳しい設定は以下に記しています。

https://atelier.reisalin.com/projects/zettel/questions/5-mysql_secure_installation

phpのインストール

https://barrel.reisalin.com/books/nextcloud/page/1-1-nextcloud

自サイトを参考にしていますが、一部異なります。

PHPレポジトリを追加して必要パッケージをインストールします。

  • レポジトリ追加
sudo add-apt-repository ppa:ondrej/php

Ubuntu20.04系ではこれを行わないとPHP7.4系しかインストールされません。

  • パッケージアップデート
sudo aptitude update
  • php インストール
sudo aptitude install php8.1
sudo aptitude install php8.1-{opcache,pdo,bcmath,calendar,ctype,fileinfo,ftp,gd,intl,json,ldap,mbstring,mysql,posix,readline,sockets,bz2,tokenizer,zip,curl,iconv,phar,xml,dev,fpm}
#fpmを入れる必要あり

nginx環境でも動かすため、php(バージョン)-.fpmを入れます。

  • apache無効化
sudo disable apache2.service

依存関係でapache2も一緒にインストールされるので、ここで停止させます。

Composerインストール

https://barrel.reisalin.com/books/bookstack/page/bookstackubuntu2004

同じくこちらにメモを残しています。

  • インストール
  • ディレクトリ移動
cd /hoge

任意の作業ディレクトリに移動します

  • インストーラーのダウンロード
sudo php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
  • インストール
sudo php composer-setup.php
  • インストーラーのリンク解除
sudo php -r "unlink('composer-setup.php');"
  • コマンドのパスを移動
sudo mv composer.phar /usr/local/bin/composer
  • composerに実行権を付与
sudo chmod +x /usr/local/bin/composer
  • バージョン確認
composer --version

バージョンが表示されることを確認します。

DBを作成します。

  • mysqlログイン
mysql -u root -p
CREATE DATABASE bookstack character set utf8mb4;
CREATE USER 'bookstackuser'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON bookstack.* TO 'bookstackuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;

DB名/パスワードはポリシーに応じて適切なものを指定します。

BookStackの配置

  • プログラム配置
cd /home/www-data
# パーティションの都合上、/home/www-dataに置いています。
# 環境に合わせて適切なWebサービス公開ディレクトリを指定してください。

sudo git clone https://github.com/BookStackApp/BookStack.git --branch release --single-branch 
sudo chown -R www-data:www-data BookStack
cd BookStack
  • 設定ファイル編集
sudo cp -pi .env.example .env

教義・信仰に沿ったエディタで以下を編集します。

APP_URL=https://hoge.example.com
# 公開用URLを指定します

# Database details
DB_HOST=localhost
DB_DATABASE=bookstack
DB_USERNAME=bookstackuser
DB_PASSWORD=password
# DB名、パスワードなどは先ほど作成したものです。
  • マイグレート
sudo -u www-data composer install --no-dev --optimize-autoloader
sudo -u www-data php artisan key:generate
sudo -u www-data php artisan db:seed --force
sudo -u www-data php artisan migrate --force

Nginx設定

  • 設定ファイル作成
    • /etc/nginx/site-available/bookstack.conf
  • ファイル内容
server {
    listen       443 ssl http2;
    listen       [::]:443 ssl http2;
    # サーバ名を指定します。
    server_name  hoge.example.com;
        server_tokens off;
        ssl_session_timeout 1d;
        ssl_session_cache shared:SSL:50m;
        ssl_session_tickets off;
        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';

    # 任意のログディレクトリを指定します。
    access_log  /var/log/nginx/bookstack/access.log;
    error_log   /var/log/nginx/bookstack/error.log;
    # SSL証明書を指定します。
    ssl_certificate      /path/to/ssl_certificate/hoge.crt;
    # SSL秘密鍵を指定します。
    ssl_certificate_key  /path/to/ssl_key/hoge.key;

    # BookStackが置かれているディレクトリです。/publicは必ず指定します。
    root /home/www-data/BookStack/public;
    index index.php index.html;

    location / {
      try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
      fastcgi_split_path_info ^(.+\.php)(/.+)$;
      include fastcgi_params;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      fastcgi_param PATH_INFO $fastcgi_path_info;
      fastcgi_pass unix:/run/php/php8.1-fpm.sock;
    }
}

# 強制的にhttps通信
server {
    listen       80;
    listen       [::]:80;
    server_name  veritas.lumos;
    return 301   https://$host$request_uri;
}

nginx設定を有効化します。

  • ディレクトリ移動
cd /etc/nginx/sites-enabled
  • 初期設定ファイルを無効
sudo unlink default
  • 設定有効化
sudo ln -sf /etc/nginx/site-available/bookstack.conf bookstack.conf
  • 構文チェック
sudo nginx -t

エラーがないことを確認します。

  • nginx再起動
sudo systemctl restart nginx.service

インストール確認

設定したドメインにブラウザでアクセスし、ログイン画面が出てくれば成功です。

Linuxを入れたLet’s noteにWebアプリを導入。

週末はこちらの設定をずっと行っていました。

Growiのインストール

これは絶対に行いたいものでした。「個人のWiki/メモサイト」という性質上、宅内NWにしか置けなかったものです。

しかし、階層ごとに文書を管理したり、各種Markdownの入力補助が豊富なこのシステムは一丁目一番地として導入したいと考えていました。

https://atelier.reisalin.com/projects/zettel/knowledgebase/articles/77

のサイトを参考に、ローカルホストでのみ動くGrowiがようやく完成です。

BookStack

これもこれで入れておきたいシステム。Growiが日付ごとの記録を行ってくれるなら、こっちは分野ごとの整理にちょうどいいのです。

https://barrel.reisalin.com/books/bookstack/chapter/1bookstack

こちらの自サイトを参考にインストールしていったものの、Growiのリバースプロキシにnginxを利用したため、導入は少し勝手が違いました。

その当たりのルールは改めて記述するとして

無事、動いたことが確認できて良かったです。

BookStack内のリンクを新しいタブで開く。

とても簡単で、あっさりできるTIPSです。

参照

手順

  1. BookStackに管理者権限でログインします。
  2. 設定>カスタマイズに移動します。
  3. カスタムheadタグに以下を入力し、保存します。
<script type="module">
    const links = document.querySelectorAll('.page-content a');
    for (const link of links) {
        link.target = '_blank';
    }
</script>

動作確認

BookStackでリンクを含む記事をクリックし、新しいタブで開くことができれば完了です。

2023年の主な出来事-サーバ編-

概要

2023年もじきに終わるということで、今年のまとめ。趣味のサーバ運用という点では大きなものがいくつかありました。

新たにインターネット上に構築したサイト

公開用Redmine作成

これが一番大きいです。

推しの名前でドメインが取得できたことにより、「これでWebを公開しよう」と思い立ち、正月休みから行動スタート。

ゲーム『ライザのアトリエ3』リリースに間に合わせ、様々な攻略情報を載せることができました。

Redmine自身の各種情報も掲載できたのも満足です。

アクセス解析システム:matomo作成

  • 非公開

公開用サイトのアクセス状況を知りたくて、このシステムをインストール。

Redmineとの連携はView_Customize_Pluginでなんとかなりましたし、その際、本邦のRedmineメンテナ様自身直々のアドバイスをいただけたことが印象に残っています。

フォトアルバムサイト:piwigo作成

フォトアルバムもついでに作成。

写真の拡充を図っていくのが来年度の目標になりそうです。

ドキュメント保存システム:BookStack作成

Redmineのプラグイン「knowlegebase」に代わるシステムを探していたら見つけました。

  • 本棚や本という概念
  • Markdownフレンドリー
  • 見出しに合わせたスクロール

など、おおよその欲しかった機能が備わっていて、今後のメインウェポンとなる予感です。

ローカルに構築したサイト

Nextcloud

2022年から継続利用。

Growi

2022年から利用しているマークダウンエディタ、growi。

2023年はmermaid.jsにようやく対応したので、デジタルでのメモ残しに大きく貢献しました。

firefly-iii

つい先日ではありますが、この財務管理システムを知ったおかげで「お金関係のロギング」を始められるようになりました。

来年度の目標

Ubuntu 20.04リプレース。

LTSのEOL2025年に備えます。そのためのボトルネックとなっている

  • Redmineのメジャーバージョンアップ
  • およびknoledgebaseの代替システム(現状候補はBookStack)

と検証を進めます。

サーバのスペックアップ

これに関しては予算と相談しながら。

BookStackのバージョンアップ手順。(BookStack v23.08.3 → BookStack v23.10.4)

概要

運用しているBookStackのバージョンアップを行います。

環境

  • Ubuntu 20.04
  • Apache 2.4系
  • PHP 8.1
  • MySQL 8系

手順

https://www.bookstackapp.com/docs/admin/updates/

ほぼ、こちらの公式記事の通りに行いました。

BookStackのディレクトリに移動

  • ディレクトリ移動
cd /var/lib/BookStack/ && pwd

インストールされているディレクトリを指定します

アップグレード

  • git pull
sudo -u www-data git pull origin release
  • 実行例(一部抜粋)
 tests/LanguageTest.php                                                              |   19 +-
 tests/Permissions/RolePermissionsTest.php                                           |   16 +-
 tests/PublicActionTest.php                                                          |    4 +-
 tests/PwaManifestTest.php                                                           |   72 ++
 tests/SecurityHeaderTest.php                                                        |   11 +-
 tests/Settings/TestEmailTest.php                                                    |    6 +-
 tests/TestCase.php                                                                  |   38 +-
 tests/ThemeTest.php                                                                 |   44 +-
 tests/Uploads/AvatarTest.php                                                        |   62 +-
 tests/Uploads/ImageTest.php                                                         |   28 +-
 tests/User/UserApiTokenTest.php                                                     |   86 +-
 tests/User/UserManagementTest.php                                                   |    6 +-
 tests/User/UserMyAccountTest.php                                                    |  339 ++++++++
 tests/User/UserPreferencesTest.php                                                  |  164 +---
 tests/User/UserSearchTest.php                                                       |    3 +-
 version                                                                             |    2 +-
 557 files changed, 14110 insertions(+), 5348 deletions(-)
 rename app/{Notifications/ConfirmEmail.php => Access/Notifications/ConfirmEmailNotification.php} (82%)
  • アップグレード
sudo composer install --no-dev
  • 実行例(一部抜粋)
  - Upgrading psy/psysh (v0.11.20 => v0.11.22): Extracting archive
  - Upgrading laravel/tinker (v2.8.1 => v2.8.2): Extracting archive
  - Upgrading mtdowling/jmespath.php (2.6.1 => 2.7.0): Extracting archive
  - Upgrading aws/aws-sdk-php (3.279.2 => 3.283.8): Extracting archive
  - Upgrading league/flysystem-aws-s3-v3 (3.15.0 => 3.16.0): Extracting archive
  - Upgrading phpseclib/phpseclib (3.0.21 => 3.0.23): Extracting archive
  - Upgrading predis/predis (v2.2.1 => v2.2.2): Extracting archive
  - Upgrading socialiteproviders/manager (v4.3.0 => v4.4.0): Extracting archive
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi

   INFO  Discovering packages.  

  barryvdh/laravel-dompdf ................................................................................................... DONE
  barryvdh/laravel-snappy ................................................................................................... DONE
  intervention/image ........................................................................................................ DONE
  laravel/socialite ......................................................................................................... DONE
  laravel/tinker ............................................................................................................ DONE
  nesbot/carbon ............................................................................................................. DONE
  nunomaduro/termwind ....................................................................................................... DONE
  socialiteproviders/manager ................................................................................................ DONE

62 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
> @php artisan cache:clear

   INFO  Application cache cleared successfully.  

> @php artisan view:clear

   INFO  Compiled views cleared successfully.  

自分の環境ですとキャッシュのクリアなどは自動的に行うため、上記URLの追加手順は不要でした。

バージョンアップ確認

  1. BookStackがインストールされているURLにアクセスします。
  2. 管理者権限でログインします。
  3. 設定のシステムバージョンが以下、作業時の最新版になっていれば成功です。

Page 1 of 2

Powered by WordPress & Theme by Anders Norén