カテゴリー: PC Page 1 of 52

Nextcloudのアプリ、Memoriesの警告に対処。(ffmpegインストール)

Nextcloudのアルバムアプリ、Memoriesのエラーに対処します。

環境

  • Nextcloud 31.0.4
    • Memories 7.5.2
  • Ubuntu 22.04
  • Apache 2.4
  • php 8.2
  • MySQL 8

事象

Nextcloudの管理画面、Memoriesの項目で、

ffmpeg preview binary not found. Thumbnail generation may not work for videos.

と出たので、この警告メッセージに対処します。

意味としては

  • Nextcloudがサムネイルを作成する際にffmpegを利用するが見つからなかった。
  • 特に、動画のサムネイルがうまく表示されない。

対処

Nextcloudがインストールされているサーバのターミナル(SSH接続)で実施します。

  • ffmpegインストール

※筆者の好みでaptitudeを用いています。

sudo aptitude update
sudo aptitude install ffmpeg
  • インストール確認
which ffmpeg

→ 上記方法であれば、/usr/bin/ffmpegと表示されます。

対処後の確認

再度、Nextcloudの管理画面からMemoriesへと進み、上記の警告が消えていることを確認します。

そこで、その下にあるトグルを変更していきます。以下、オンにした方がいい項目です。

  • Images (JPEG, PNG, GIF, BMP):一般的なイメージ画像
  • HEIC (Imagick): Appleデバイスで利用するイメージ画像
  • Videos (ffmpeg): 動画(サーバ上にこれが無いために警告が出ていたため)

これらを設定後、Memoriesアプリでサムネイルが作成されているかを確認します。

手動でのサムネイル生成

※ファイル数によっては時間がかかり、サーバのリソースをそれなりに消費するため、負荷が少ない時間帯で行った方が望ましいです。

  • Nextcloudのルートディレクトリに移動
cd /path/to/nextcloud/root/directory && pwd

※筆者環境 /home/www-data/nextcloud

  • occによるサムネイル生成
sudo -u www-data php occ preview:generate-all

sudo -u www-dataの実行権限については自分の環境に合わせます。(RockyLinux等のRHEL系ディストリビューションはapachehttpdなどです)

NextcloudのWebからのアップデート失敗時の対処。(コマンドラインによるNextcloudのアップデート)

NextcloudはWebからアップデートが行えますが、

  • バックアップ
  • ダウンロード
  • 整合性チェック

等で失敗し、リトライをしてもまた同じところで詰まるというケースが非常に多いです。

(例ではDownloading)で失敗しています。

そこで、その回避策(というかより安定している手段)として、コマンドラインによるアップデートを実施します。

作業確認環境

筆者環境です。マイナーバージョンなどは実施環境に合わせます。

  • Ubuntu 22.04
  • Nextcloud 31.03 → 31.04へのアップグレード
  • Apache (ユーザwww-dataで実行)
  • MySQL
  • php 8.2.28

さっくりとした手順

  1. メンテナンスモードを有効化します。
  2. Nextcloud一式のバックアップを行います。
  3. Nextcloudで用いているDBのバックアップを取ります。
  4. コマンドラインでアップデートがあるかのチェックを行います。
  5. コマンドラインでNextcloudのアップグレードを行います。
  6. バージョンアップを確認します。

メンテナンスモードを有効化

  • Nextcloudのルートディレクトリ移動
cd /path/to/nextcloud/root/directory && pwd

自分の環境に合わせます。(筆者環境/home/www-data/nextcloud)

  • メンテナンスモード有効化
sudo -u www-data php occ maintenance:mode --on
  • メンテナンスモード確認

運用中のNextcloudのURLにアクセスし、メンテナンスモードであることを確認します。

Nextcloudのバックアップ

  • Nextcloudの一式バックアップ
sudo -u www-data cp -pir /home/www-data/nextcloud /path/to/backup/directory/nextcloud.$(date +%Y%m%d)
  • 退避前、退避先、バックアップ先のアクセス権限などはそれぞれ自分の環境に合わせます。
  • このバックアップ方法はあくまでも例です。
  • ※プログラムによっては非常に膨大なファイル数が予想されます。適切なバックアップ手段を考慮してください。
  • vpsなどで動かしている場合は、スナップショットを撮っておいて、後から復元した方が確実です。

  • バックアップ確認
ls -l /path/to/backup/directory/nextcloud.$(date +%Y%m%d)

退避先にディレクトリファイル一式があることを確認します。

mysqldumpでバックアップを取得する

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

任意のディレクトリを指定します。

  • DBバックアップ作成
mysqldump -h localhost -u nextcloud -p --no-tablespaces --single-transaction nextcloud > nextcloud_backup.$(date +%Y%m%d).sql

DB名やユーザーは自分の環境に合わせます。

  • DBバックアップ作成確認
ls -la nextcloud_backup.$(date +%Y%m%d).sql

ファイルがあることを確認します。

Nextcloudのアップグレードチェック

  • Nextcloudのルートディレクトリ移動
cd /path/to/nextcloud/root/directory && pwd

自分の環境に合わせます。(筆者環境/home/www-data/nextcloud)

  • occコマンドによるアップグレード確認
sudo -u www-data php occ update:check

表示例

Nextcloud 31.0.4 is available. Get more information on how to update at https://docs.nextcloud.com/server/31/admin_manual/maintenance/upgrade.html.
Update for side_menu to version 5.1.0 is available.
Update for spreed to version 21.0.4 is available.

と出たので、アップグレードはコマンドラインでも有効です。

コマンドラインによるアップグレード

sudo -u www-data php occ upgrade
  • 新しいバージョンのダウンロード
  • コードの展開
  • データベーススキーマの更新
  • アプリの更新

を一括で行ってくれるコマンドです。

Keep maintenance mode active? [y/N] 

nでメンテナンス画面から抜けます。

Webでのアップグレード確認

管理者権限でNextcloudにブラウザでアクセスし、

  1. 管理画面からアップグレードされていること
  2. 他の機能が使えること

を確認できれば成功です。


切り戻し

失敗したときの手順です。再度、バックアップ一式があることを確認してください。なお、失敗したことを前提にしているため、再度の切り戻しは一切考慮しません。

  • アップグレードに失敗したファイル一式の削除
sudo rm -rf /home/www-data/nextcloud 
  • バックアップからの切り戻し
sudo mv /path/to/backup/directory/nextcloud.$(date +%Y%m%d) /home/www-data/nextcloud
  • 管理者権限でMySQLにログインする
mysql -u root -p
  • 対象のDBを確認する
SHOW DATABASES;

nextcloudが動いているDBであることを再確認してください。

  • 本当に削除すべきDBかを確認する
SELECT COUNT(*) FROM nextcloud.oc_users;
  • 不具合が発生したDBを削除する

二回ほど深呼吸して、落ち着いて作業しましょう。

DROP DATABASE nextcloud;
  • DBを再作成する
CREATE DATABASE IF NOT EXISTS nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
  • MySQLから抜ける
EXIT
  • DB復元
mysql -h localhost -u nextcloud -p nextcloud < /hoge/nextcloud_backup.$(date +%Y%m%d).sql

この後、メンテナンスモードを解除して、以前と同じ状態か確認します。

sudo -u www-data php occ maintenance:mode --off

作業後:バックアップDBの削除

平文でSQLがサーバ上にあるのは危険な状態なので、以下の措置を執ります。

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

バックアップを行ったディレクトリを指定します。

  • DBバックアップ確認
ls -la nextcloud_backup.$(date +%Y%m%d).sql

ファイルがあることを確認します。

  • バックアップしたDBの削除
shred -u nextcloud_backup.$(date +%Y%m%d).sql
  • DBバックアップ削除確認
ls -la nextcloud_backup.$(date +%Y%m%d).sql

ファイルが無いことを確認します。

DBのデータ容量を確認するSQL文

概要

MySQLの運用時、「このDBはどのぐらいのディスク容量を消費しているのか?」は日々のメンテナンスのみならずバックアップや移行などにも気になるところ。

そんな確認方法についてのTIPSです。

環境

以下のサーバで動作を確認しました。

  • Ubuntu 22.04 / Ubuntu 24.04
  • MySQL 8.0.x

前提

  • MySQLターミナルで操作します。
  • そのDBへのSELECT権限を持っていなければ操作できません。

操作

  • MySQLログイン
mysql -u user -p

自分の環境に合わせます。

  • DB確認
SHOW DATABASES;

ここで、参照したいDB名を確認します。

  • SQL実行
SELECT
    table_schema AS 'データベース名',
    SUM(data_length + index_length) AS '合計サイズ(バイト)',
    SUM(data_length) AS 'データサイズ(バイト)',
    SUM(index_length) AS 'インデックスサイズ(バイト)',
    -- 人が読みやすいようにメガバイト(MB)やギガバイト(GB)でも表示
    ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS '合計サイズ(MB)',
    ROUND(SUM(data_length) / 1024 / 1024 / 1024, 2) AS '合計サイズ(GB)'
FROM
    information_schema.TABLES
WHERE
    table_schema = '調べたいデータベース名' -- ここにサイズを知りたいデータベース名を入力してください
GROUP BY
    table_schema;
  • 表示例
+-----------------------+----------------------------+-------------------------------+----------------------------------------+---------------------+---------------------+
| データベース名        | 合計サイズ(バイト)         | データサイズ(バイト)          | インデックスサイズ(バイト)             | 合計サイズ(MB)      | 合計サイズ(GB)      |
+-----------------------+----------------------------+-------------------------------+----------------------------------------+---------------------+---------------------+
| nextcloud             |                  432685056 |                     163741696 |                              268943360 |              412.64 |                0.15 |
+-----------------------+----------------------------+-------------------------------+----------------------------------------+---------------------+---------------------+
1 row in set (0.01 sec)

この例では、DB「nextcloud」に対して412MBのデータを消費していることが明らかになりました。

Ubuntu 24.04にNextcloudをインストール

Ubuntu 20.04もEOLを迎えたため、こちらのバージョンでのインストールを確認です。

前提

以下が稼働済みです。

  • OS: Ubuntu 24.04 LTS
  • データベース: MySQL 8.0 (Ubuntu 24.04 の標準リポジトリで利用可能)
  • Webサーバー: Apache 2.4 (Ubuntu 24.04 の標準リポジトリで利用可能)
  • ドメインと証明書: Nextcloud を設定するドメイン名と、それに対応する有効なSSL/TLSサーバー証明書(例: Let's Encrypt などで取得したもの)が準備されていること。

さっくりとした手順

※SSHログインし、ターミナルでの操作を行います。

  1. 必要なPHPパッケージ(PHP 8.3 と関連モジュール)をインストールします。
  2. PHPの設定(メモリ制限、OPcache、APCu)を行います。
  3. Nextcloud用のデータベースとユーザーを作成します。
  4. Nextcloudの最新版プログラムをダウンロードし、適切な場所に配置します。
  5. Nextcloudを動かすためのApache設定ファイルを設定します。
  6. Webブラウザで設定を行います。

必要パッケージをインストールします。

  • PHP・モジュールインストール
sudo aptitude install php8.3 php8.3-fpm php8.3-opcache php8.3-pdo php8.3-bcmath php8.3-calendar php8.3-ctype php8.3-fileinfo php8.3-ftp php8.3-gd php8.3-intl php8.3-json php8.3-mbstring php8.3-mysql php8.3-posix php8.3-readline php8.3-sockets php8.3-bz2 php8.3-tokenizer php8.3-zip php8.3-curl php8.3-iconv php8.3-xml php8.3-imagick php8.3-gmp php8.3-apcu libapache2-mod-php8.3
補足
  • php8.3-fpm: Apache で mod_php の代わりに PHP-FPM を使用する場合にインストールします。(今回は libapache2-mod-php8.3 を使っていますが、FPMの方がパフォーマンスや分離の点で推奨される場合もあります)。もしFPMを使う場合はApacheの設定も変わります。この手順ではlibapache2-mod-php8.3(mod_php)を前提とします。
  • php8.3-ldap: LDAP/AD連携を使用する場合にインストールしてください。
  • php8.3-dev: 通常の運用には不要ですが、PECLなどで拡張機能をコンパイルする場合に必要です。
  • Apache再起動
sudo systemctl restart apache2.service
  • PHPインストール確認
php -v

表示例:PHP 8.3.n

PHPの設定を行います。

Nextcloud のパフォーマンスと安定性のために、PHPの設定を調整します。

  • memcacheとAPCuの有効化
cd /etc/php/8.3/cli/conf.d

以下のファイルのように修正します。ない場合は、以下のように追記します。

cat <<- __EOF__ | sudo tee -a /etc/php/8.3/cli/conf.d/10-opcache.ini
opcache.enable=1
opcache.enable_cli=1
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000
opcache.memory_consumption=128
opcache.save_comments=1
opcache.revalidate_freq=1
__EOF__
cat <<- __EOF__ | sudo tee -a /etc/php/8.3/cli/conf.d/20-apcu.ini
[apcu]
apc.enabled=1
apc.shm_size=32M
apc.ttl=7200
apc.enable_cli=1
apc.serializer=php
__EOF__
  • php.iniバックアップ
sudo cp -pi /etc/php/8.3/apache2/php.ini /path/to/backup/php.ini.$(date +%Y%m%d)

任意のバックアップディレクトリを指定します。

  • バックアップ確認
diff -u /path/to/backup/php.ini.$(date +%Y%m%d) /etc/php/8.3/apache2/php.ini 

差分が存在しないことにより、バックアップが取れていることを確認します。

  • sedによるファイル書き換え
sudo sed -i 's/memory_limit = .*/memory_limit = 512M/g' /etc/php/8.3/apache2/php.ini

memory_limitを推奨値の512Mに置き換えます。

  • 書き換え後の差分確認
diff -u  /path/to/backup/php.ini.$(date +%Y%m%d) /etc/php/8.3/apache2/php.ini
  • 差分
-memory_limit = 128M
+memory_limit = 512M
  • apache 再起動
sudo systemctl restart apache2.service

NextcloudのDBを作成します。

  • MySQLにroot権限でログイン
mysql -u root -p
  • MySQLユーザ追加
CREATE DATABASE IF NOT EXISTS nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE USER 'nextcloud'@'localhost' IDENTIFIED WITH mysql_native_password BY 'YOUR_STRONG_PASSWORD';
GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextcloud'@'localhost';
FLUSH PRIVILEGES;
EXIT;

★重要: YOUR_STRONG_PASSWORD は必ず推測されにくい強固なパスワードに変更してください。

IDENTIFIED WITH mysql_native_password BY は MySQL 8.0 で推奨される認証方式の一つです。

  • 追加したNextcloud用ユーザでログイン
mysql -u nextcloud -p

設定したパスワードでログインできることを確認します

  • DB作成確認
SHOW DATABASES;

作成したデータベースnextcloudがあることを確認します

EXIT;

Nextcoludのプログラムを配置します。

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

任意の作業用ディレクトリを指定します。

  • ファイル取得
wget https://download.nextcloud.com/server/releases/latest.zip
unzip latest
  • Web公開用ディレクトリにファイル一式を移動
sudo mv nextcloud /home/www-data/

自分の環境に合わせます。(筆者はファイルサーバとして運用するので、/home領域に設置しました)

  • 所有者変更
sudo chown -R www-data:www-data /home/www-data/nextcloud

Apacheの設定ファイルを作成します。

  • ログディレクトリの作成
sudo mkdir /var/log/nextcloud

環境に合わせます。

  • ディレクトリの所有者変更
sudo chown www-data:www-data /var/log/nextcloud
  • nextcloud用の設定ファイル作成
  • 【】部分は自分の環境に合わせます。
cat <<- __EOF__ | sudo tee -a /etc/apache2/sites-available/nextcloud.conf
<VirtualHost *:80>
    servername 【hoge.example.com】
    # ドメイン名を指定します
    RewriteEngine On
        RewriteCond %{HTTPS} off
        RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# HTTPアクセスを強制的にHTTPSにリダイレクトします
</VirtualHost>

<VirtualHost *:443>
    ServerName 【hoge.example.com】
    # ドメイン名を指定します
    CustomLog /var/log/nextcloud/nextcloud_access.log combined
    ErrorLog /var/log/nextcloud/nextcloud_error.log
    DocumentRoot 【/home/www-data/nextcloud】
    # 上記手順で指定したディレクトリです
    <Directory 【/home/www-data/nextcloud】>
    # 上記手順で指定したディレクトリです
        Options -MultiViews
        AllowOverride All
        Require all granted
    </Directory>

#SSL設定
  SSLEngine on
    Protocols h2 http/1.1
  # SSLを有効化します

SSLCertificateFile 【/etc/certs/hoge.example.com.crt】
# SSL証明書を指定します
SSLCertificateKeyFile 【/etc/private/hoge.example.com.key】
# 秘密鍵を指定します

# SSLCACertificateFile 【/etc/certs/hoge.example.com.CA.crt】
# 中間証明書が発行元から別ファイルで提供されている場合は、この直上をコメントアウトして中間証明書を指定します

    # 推奨されるSSL/TLS設定 (Mozilla Intermediate Compatibility)
    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     on
    SSLCompression          off
    SSLSessionTickets       off # PFSを強化する場合

    # OCSP Stapling (パフォーマンス向上)
    SSLUseStapling On
    SSLStaplingCache "shmcb:logs/ssl_stapling(32768)"

    # セキュリティヘッダー
    Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains"
    Header always set Referrer-Policy "no-referrer"
    Header always set X-Content-Type-Options "nosniff"
    Header always set X-Frame-Options "SAMEORIGIN"
    Header always set X-Permitted-Cross-Domain-Policies "none"

</VirtualHost>
__EOF__
  • Apache設定ファイル反映
sudo a2ensite nextcloud.conf
  • 設定ファイルのコンフィグ確認
sudo apache2ctl configtest

Syntax OKを確認します

  • Apache再起動
sudo systemctl restart apache2.service

ブラウザ上でNextcloudのセットアップを行います。

  • ブラウザでアクセス

ブラウザで、

http://設定したドメイン

にアクセスし、以下を確認してください。

  • 以下のセットアップ画面が出ること。
  • httpがhttpsとなっていること。

以下を入力して「インストール」をクリックします。

  • ユーザ名:
  • 管理者のユーザ名
  • パスワード:
  • 管理者パスワード
  • データベースのユーザー名
  • 作成したユーザー名(nextcloud)
  • データベースのパスワード
  • 設定したデータベースのパスワード
  • データベース名
  • 作成したデータベース(nextcloud)
  • データベースのホスト名
  • localhost:3306
    • (MySQLのポート番号)

推奨アプリのインストールに関しては、好みでスキップかインストールを行ってください。

インストールが完了したら、以下のような画面が出ます。

『150日の亡霊』顛末記-Wasabiクラウドストレージの理解不足による重課金の罠-(長文)

概要

筆者は

  • AWS Lightsail → Web Arena Indigo
  • Wasabiクラウドストレージ

で、各種Webサービスを個人的に運用しています。これまで両者は安価で性能も満足いくものだったのですが
2024年11月~2025年3月に至るまで、Wasabiクラウドストレージの高額請求がありました。(解決は2025年4月)

今回、この失敗を記すことで自分と同じような状況に陥りそうな人への注意喚起並びに「こういう落とし穴もあるんだ」という参考にしていただければ幸いです。

時間がない人向けの要約

  1. Wasabiクラウドストレージの仕様を理解していなかったため通常の20倍以上の請求が届いた。
  2. 原因はクラウドストレージの超・超高頻度のファイル書き換え(削除&作成)が発生したため。
  3. この原因を作ったのはGrowi(MongoDB)とNextcloud
  4. これらサービスを停止したものの「最低保持期間ポリシー」の存在により、自動的に発生したファイル書き換えの分の課金が発生した。
  5. 完全解決に至るまでの合計請求額は5ヶ月で544.93$!(2025/04/16でのレート換算で77624.73円)
  6. 教訓
  • クラウドストレージの仕様(特に料金体系)は見ておくこと。
  • クラウドストレージはネットにあるSSDではない。
  • 相性のいい運用方法と相性最悪の運用方法がある。
  • 新しいWebサービスを稼働したらきちんと請求を見ること。
  • 「今まで大丈夫だったからと言って次も大丈夫」ではない。
  1. ビジネスでこれをやってたら請求額はこの数十倍も普通にあった。個人での失敗だからこそ「笑えない笑い話」で済んだ。

Ubuntu oneアカウントの紐付けとESM Apps(個人利用)の適用

概要

Ubuntuサーバにログインすると、以下のようなメッセージが出てきます。

11 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm

これはUbuntu Pro (以前のExtended Security Maintenance, ESM) に関連するメッセージです。

Ubuntu Proは、UbuntuのLTS (Long Term Support) リリースに対して、標準のサポート期間(通常5年)を超えて、さらに5年間のセキュリティアップデートを提供する有償サービスです。

ですが、個人利用であれば、最大5台までのマシンで Ubuntu Pro を無償で利用できます。

筆者が公開しているRedmineやBookStackは

  • 非商用利用
  • 広告無し

なので、上記、個人利用に適用。このESM Appsを有効化していきます。

前提

ESM AppsはLTSバージョンのUbuntuに適用されます。

cat /etc/lsb-release

として、

DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=24.04
DISTRIB_CODENAME=noble
DISTRIB_DESCRIPTION="Ubuntu 24.04.2 LTS"

が表示されることを確認します。

手順

  1. Ubuntu Oneアカウントの作成/ログイン
  2. Ubuntu Proのサイトでトークンを取得
  3. トークンをサーバに適用

Ubuntu Oneへのアクセス

https://login.ubuntu.com/ にアクセスします。

必要事項を入力して、アカウントを作成します。

トークンの取得

https://ubuntu.com/pro にアクセスします。

「Get Ubuntu Pro now」をクリックします。

「Myself」をクリック後、「Register」をクリックします。

確認後、「Yes, log me in」をクリックします。

上記の画面に切り替わるので、Tokenを控えておきます。

トークンをサーバに適用

  • ※推奨※インスタンスのバックアップ

VPSやAWSのインスタンスの場合は、スナップショットなどでシステム全体のバックアップを取っておきます。

対象のUbuntuサーバにログインし、以下のコマンドを実行します。

sudo pro attach [取得したトークン]
Enabling Ubuntu Pro: ESM Apps
Ubuntu Pro: ESM Apps enabled
Enabling Ubuntu Pro: ESM Infra
Ubuntu Pro: ESM Infra enabled
Enabling Livepatch
Failed to enable default services, check: sudo pro status

Live Patchは有効にはならないようですが、ESM appが有効なので今回はよしとします。

適用後のサーバアップデート

  • パッケージ全体の更新
sudo aptitude update && sudo aptitude upgrade
  • システム再起動

ESMを適用すると、カーネル全体もアップデートされるケースが多いので、システム全体の再起動を行います。

sudo reboot

ESM適用確認

ログイン後、以下のようなメッセージが出ることを確認します。

Expanded Security Maintenance for Applications is enabled.

再度、https://ubuntu.com/pro にアクセスし、Acvie Machinesが繰り上がっていることを確認します。

Apache、特定のユーザーエージェントからのアクセスを404で返す。

こちらの記事の応用編。

Bot・クローラーへとアクセストラフィックを「特定のユーザーエージェントを弾く」

方法は「403エラーを返すため、柄の悪いBOTが繰り返し狙い続ける」弱点がありました。

また、confファイルに禁止するエージェントやIPを指定するため、メンテナンスが悪い難点もありました。

そこで、以下のような措置を執ります。

  1. 排除するクローラー(Bot)ならびにIPを別のファイルで管理する。
  2. Rewriteルールで「403」ではなく「404」を返すようにする。

環境

  • Ubuntu 24.04
  • Apache 2.4
  • 要:Rewriteモジュール

リライトモジュールのインストール確認

sudo apache2ctl -M |grep rewrite

rewrite_module (shared)と有効化を確認します。

有効化されていない場合は

sudo a2enmod rewrite
sudo systemctl restart apache2.service

で有効化します。

特定のユーザーエージェントを弾くためのファイルを作成

/etc/apache2/site-enabled/spam-clawler.txt として、以下のようなファイルを作成。

RewriteCond %{HTTP_USER_AGENT} (facebookexternalhit/1\.1) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (SemrushBot/7~bl) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (AhrefsBot) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (MJ12bot) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (DotBot) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (Baiduspider) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (YandexBot) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (Sogou\ web\ spider) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (Exabot) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (MegaIndex\.ru) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (SeznamBot) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (BLEXBot) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (Bytespider) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (DataForSeoBot) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (serpstatbot) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (SeekportBot) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (index\.community\ crawler) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (PetalBot) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (BacklinksExtendedBot) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (GPTBot/1\.2) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (ICC-Crawler) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (ImagesiftBot) [NC]

正規表現などがある場合は注意してください。

特定のIPアドレスを弾くためのファイルを作成

/etc/apache2/site-enabled/spam-ips.txt として、以下のようなファイルを作成。

RewriteCond %{REMOTE_ADDR} ^190\.92\.
RewriteCond %{REMOTE_ADDR} ^159\.138\.
RewriteCond %{REMOTE_ADDR} ^166\.108\.
RewriteCond %{REMOTE_ADDR} ^124\.243\.
RewriteCond %{REMOTE_ADDR} ^114\.119\.
RewriteCond %{REMOTE_ADDR} ^119\.8\.
RewriteCond %{REMOTE_ADDR} ^110\.238\.
RewriteCond %{REMOTE_ADDR} ^217\.113\.194\.
RewriteCond %{REMOTE_ADDR} ^34\.123\.
RewriteCond %{REMOTE_ADDR} ^119\.13\.

confファイルの修正

  • バックアップ
sudo cp -pi /etc/apache2/sites-availables/sites.conf /path/to/backup/directory/sites.conf.$(date +%Y%m%d)

任意のバックアップファイル、利用しているサイトを用います。

  • バックアップ確認
diff -u /path/to/backup/directory/sites.conf.$(date +%Y%m%d) /etc/apache2/sites-availables/sites.conf

差分がないことを確認します。DocumentRoot等は修正します。

ファイル修正

  • /etc/apache2/sites-availables/sites.conf

以下のように修正していきます。

DocumentRoot /home/www-data/atelier/public
    <Directory /home/www-data/atelier/public>
        Options -MultiViews
        AllowOverride All
    <IfModule mod_rewrite.c>
    RewriteEngine On
    # 2025/03/21追加
    # 読み込まれたUser-Agentに基づき、Clawlerに対して404を返す
    Include /etc/apache2/sites-enabled/spam-clawler.txt
    RewriteRule .* - [R=404,L]

    # 2025/03/21追加
    # 読み込まれたIPアドレスに基づき、偽装エージェントのIPに対して404を返す
    Include /etc/apache2/sites-enabled/spam-ips.txt
    RewriteRule .* - [R=404,L]
   </IfModule>
     <RequireAll>
      Require all granted
     </RequireAll>
    </Directory>

この時、ディレクトリやパスファイルが合っていることを確認します。

整合性確認

sudo apache2ctl configtest

Syntax OKを確認します。

Webサービス再起動

sudo systemctl restart apache2.service && echo $?

0を確認

systemctl status apache2.service

tatus(running)を確認します。

設定後の確認

sudo tail -f /path/to/web/access_log 

等として、ログを流し続けて、
指定したBOTからのアクセスが404になっていることを確認できればOKです。

『ユミアのアトリエ』発売に向けての準備。

アトリエシリーズ(コンシューマー向け)最新作、『ユミアのアトリエ』発売日と言うことで準備を行いました。

公開用Redmineにプロジェクトを追加

https://atelier.reisalin.com/projects/yumia

新規プロジェクトの作成。

ライザのアトリエ3ほどの熱量があるかは不明ですが、記録には遺そうと思っています。

プレイ中の水分と糖分補給の準備

『ライザのアトリエ3』立て続けにプレイした際、脳のエネルギー源が著しく消費した反省から、今回は過剰と言えるものにしています。

アウトレットでキャラメルポップコーンがあったのはある種の救いでした。

こちらを携えつつ、集中してプレイに臨めればと思っています。

Redmineの404エラーを差し替え。

自分のメモとして残している公開用Redmine『クーケン島観光ガイド』の404.htmlファイルを差し替えた時のメモです。

環境

  • Ubuntu 24.04
  • Apache 2.4
  • ruby 3.2.3
  • MySQL
  • Redmine 5.1

htmlファイル作成

これに関しては自分の好みに合わせました。

  • Redmineの概要や特徴を
  • 英国のタブロイド紙『The Sun』のような文体で
  • 和訳付きで書いて欲しい
  • その際、フォントはRedmineのテーマ『こどもれっどまいん』のものをそのまま使う

を条件にGoogle AI「Gemini」に作成いただきました。

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>404 Not Found</title>
  <style>
    /* 通常のフォント */
    @font-face {
      font-family: 'kiloji';
      src: url('/themes/redmine_theme_kodomo/font/kiloji/kiloji.woff') format('woff'),
           url('/themes/redmine_theme_kodomo/font/kiloji/kiloji.ttf') format('truetype');
      font-weight: normal;
      font-style: normal;
    }

    /* 太字のフォント */
    @font-face {
      font-family: 'kiloji';
      src: url('/themes/redmine_theme_kodomo/font/kiloji/kiloji_b.woff') format('woff'),
           url('/themes/redmine_theme_kodomo/font/kiloji/kiloji_b.ttf') format('truetype');
      font-weight: bold;
      font-style: normal;
    }

    body {
      font-family: 'kiloji', sans-serif;
      text-align: center;
      background-color: #f8f8f8; /* 背景色を少し明るく */
      color: #333; /* 文字色を濃いグレーに */
      padding: 20px;
    }

    h1, h2, h3, h4, h5, h6 {
      font-weight: bold; /* 見出しを太字に */
      color: #c00; /* 見出しの色を赤に */
      margin-bottom: 0.5em;
    }

    h2 {
      font-size: 1.8em;
      margin-top: 2em;
      border-bottom: 2px solid #c00; /* 下線を追加 */
      padding-bottom: 0.2em;
    }

    h3{
      font-size: 1.4em;
      margin-top: 1.5em;
    }

    p {
      font-size: 1.1em;
      line-height: 1.6;
      margin-bottom: 1em;
    }
    /* 箇条書き */
    ul{
        list-style: none;
    }

    .bold {
      font-weight: bold;
    }

    .container {
        max-width: 800px;
        margin: 0 auto;
        background-color: white;
        padding: 40px;
        box-shadow: 0px 5px 15px rgba(0, 0, 0, 0.1);
        border-radius: 12px;
    }
    /* リンク */
    a{
      text-decoration: none;
      color: blue;
    }
  </style>
</head>
<body>
    <div class="container">
        <h1>RED-HOT REDMINE: THE PROJECT PANACEA! (AND IT WON'T COST YOU A PENNY!)</h1>
        <p>(和訳: 見出し:プロジェクト管理を激アツに!Redmineは万能薬だ!しかも、一銭もかからない!)</p>

        <h2>PAGE 3: WHAT IN THE BLAZES IS REDMINE? (AND WHY IS IT FREE AS A BIRD?)</h2>

        <p>Cor blimey, you've been living under a rock, ain't ya? Redmine's the <span class="bold">FREE</span>, open-source gaffer that sorts out all your project headaches. Think of it like a Swiss Army Knife for your work – it's got the lot! Tracking bugs, sorting deadlines, sharing files... it's like having a super-organised PA who never nicks your biscuits. And the best bit? It's <span class="bold">FREE as a bird!</span> No dodgy subscriptions, no hidden costs, no sneaky charges that'll leave you skint. It's open-source, meaning a bunch of clever clogs got together and built it for the good of humanity (and probably because they were bored). Bob's your uncle!</p>

        <p>(Page 3: Redmineって一体何者!? (しかも、なんでタダなの!?))</p>
        <p>おいおい、今までどこに隠れてたんだ?Redmineは、<span class="bold">無料</span>でオープンソースの、プロジェクトの悩みを全部解決してくれる頼れるヤツだ。仕事用のスイスアーミーナイフみたいなもんだと思えばいい – 何でもござれ!バグの追跡、締め切りの管理、ファイルの共有… まるで、あなたのビスケットを盗まない超有能な秘書がいるみたいだろ? しかも最高なは、<span class="bold">鳥のように自由(無料)</span>ってこと!怪しいサブスクも、隠れた費用も、一文無しになるようなコソコソした請求も一切なし。オープンソースだから、賢い連中が集まって、人類のために作ったんだ(多分、暇だったんだろうけど)。超簡単だろ!</p>

        <h2>PAGE 5: GET YOUR MITTS ON IT! (HOW TO USE IT AND MAKE IT YOUR OWN)</h2>

        <p>Right, listen up, 'cause this is important. First, you gotta get it installed. It's a bit techy, like setting up your Sky box, but there's loads of guides online. Once it's up and running, you create "projects". Then you chuck in your "issues". Assign 'em to your team, set deadlines, and watch the magic happen!</p>

        <p>But here's the <em>really</em> clever bit: Redmine's like a lump of Play-Doh. You can mould it into whatever shape you want! <span class="bold">That's the beauty of open-source – you can tinker with it 'til your heart's content!</span> Fancy a new feature? Get stuck in and code it yourself (or find a friendly geek to do it for you). Want to change the colours to match your favourite football team? Go for it! It's all yours to play with!</p>

        <p>(和訳: 5ページ目:Redmineをゲットせよ!(使い方と自分だけのものにする方法))</p>
        <p>よーく聞けよ、こっからが重要だ。まず、インストールしなきゃいけない。Skyのセットトップボックスを設定するみたいに、ちょっと技術的なんだが、ネット上にガイドは山ほどある。インストールが終わったら、「プロジェクト」を作る。そしたら、「課題」をぶち込む。チームに割り当てて、締め切りを設定して、あとは魔法が起こるのを待つだけ!</p>
        <p>でも、<span class="bold">本当に</span>すごいのはここからだ。Redmineは、まるでPlay-Doh(粘土)の塊みたいなんだ。好きな形に作り変えられる!<span class="bold">これがオープンソースの素晴らしいところ – 心ゆくまでいじくり回せるんだ!</span> 新しい機能が欲しい?自分でコードを書いて追加しちゃえ(または、親切なギークに頼むんだ)。好きなサッカーチームに合わせて色を変えたい? やっちゃえ! 全部、あなたの自由だ!</p>

        <h2>PAGE 7: FEATURES FIT FOR A KING (OR QUEEN!) (AND YOU CAN ADD YOUR OWN!)</h2>

        <p>This ain't no Mickey Mouse software, mate. Redmine's packed with features that'll make your jaw drop:</p>
        <ul>
            <li><span class="bold">Issue Tracking:</span> Like a bloodhound on the scent, it finds and squashes bugs faster than you can say "Coronation Chicken".</li>
            <li><span class="bold">Gantt Charts:</span> See your project timeline laid out like a football pitch. Know exactly when you're gonna score that winning goal (or finish the project!).</li>
            <li><span class="bold">Wiki:</span> A shared brain for your team. Stick all your important info in there, from meeting notes to the recipe for Aunt Mildred's famous flapjacks.</li>
            <li><span class="bold">Forums:</span> Chat with your team, discuss ideas, and generally have a good old natter.</li>
            <li><span class="bold">Time Tracking:</span> See where your precious hours are going. No more slacking off!</li>
            <li><span class="bold">Custom Fields:</span> Make Redmine your own! Add whatever info you need, like "Biscuit Preference" or "Favourite Spice Girl". <span class="bold">And if that's not enough, you can add <em>even more</em> custom fields 'til the cows come home!</span></li>
            <li><span class="bold">Multiple Project Support:</span> Juggling loads of projects? No dramas! Redmine can handle it all. It's like having ten pairs of hands!</li>
        </ul>

        <p>(和訳: 7ページ目:王室御用達レベルの機能!(しかも自分で追加できる!))</p>
        <p>これは、ちゃちなソフトじゃないぜ、相棒。Redmineには、アゴが外れるほどすごい機能が満載だ:</p>
        <ul>
            <li><span class="bold">課題追跡:</span> まるで獲物を追うブラッドハウンドのように、バグを見つけて潰すのが、「コロネーションチキン」って言うより早い。</li>
            <li><span class="bold">ガントチャート:</span> プロジェクトのタイムラインが、サッカー場みたいに表示される。いつ決勝ゴールを決めるか(つまり、プロジェクトを終わらせるか!)が正確に分かる!</li>
            <li><span class="bold">Wiki:</span> チーム共有の頭脳。会議のメモから、ミルドレッドおばさんの有名なフラップジャックのレシピまで、重要な情報を全部ここにぶち込んでおけ。</li>
            <li><span class="bold">フォーラム:</span> チームとチャットしたり、アイデアを議論したり、とにかく楽しくおしゃべりできる。</li>
            <li><span class="bold">時間管理:</span> 貴重な時間がどこに使われているかを確認できる。もうサボれないぞ!</li>
            <li><span class="bold">カスタムフィールド:</span> Redmineを自分好みにカスタマイズ!「好きなビスケット」とか「好きなスパイスガール」とか、必要な情報を何でも追加できる。<span class="bold">それでも足りなきゃ、牛が帰ってくるまで、もっともっとカスタムフィールドを追加できるぞ!</span></li>
            <li><span class="bold">複数プロジェクト対応:</span> たくさんのプロジェクトを抱えてる? 問題ない!Redmineなら全部管理できる。まるで10個の手があるみたいだ!</li>
        </ul>

        <h2>PAGE 9: IT'S A KNOCKOUT! (CONCLUSION)</h2>

        <p>So there you have it. Redmine: it's free, it's powerful, and it'll make your projects run smoother than a pint of Guinness. Get on it, and you'll be laughing all the way to the bank (or at least to the pub for a celebratory pint!). You'd be a right numpty not to!</p>

        <p>(和訳: 9ページ目:こいつはすごい!(結論))</p>
        <p>これで全部だ。Redmine:無料、パワフル、そしてプロジェクトをギネスビールよりもスムーズに進めてくれる。早速使ってみて、笑いが止まらなくなるはずだ(少なくとも、お祝いのビールを飲みにパブに行くまでは!)。使わないなんて、大バカ者だぜ!</p>
        <br>
        <a href="/">トップページへ戻る</a>
    </div>
</body>
</html>

英国英語の俗語モリモリ、参考元がタブロイド紙ということもあり、読者への煽りも満載の露悪的なものにしています。こうして得た404ページを404.htmlとしてサーバ上に作成します。

サイトへの配置

  • Redmineの404.html格納ディレクトリへの移動
cd /path/to/redmine/root/directory/public

自分の環境に合わせます。/var/lib/html/redmine/public

  • 既存404.htmlの退避
sudo mv 404.html /hoge/404.html.$(date +%Y%m%d)

任意の退避先を指定します。

  • ファイル差し替え

上記の404.htmlを任意の方法でこのディレクトリに配置します。

sudo chown www-data:www-data 404.html

として、アクセス権をapache2実行ユーザ(デフォルトではwww-data)に変えておきます。

必要に応じてWebサービス再起動、動作確認

動的な部分を一切いじらないため、Webサービスの再起動は不要ですが、念のため

sudo systemctl restart apache2.service && echo $?

0を確認

として、Webサービスの再起動を行います。

設定後、サイトURLに存在しない文字列を適当に入れて、上記の404エラーが出れば設定完了です。

より明確化したいのであれば、アクセスログやエラーログを確認して404がでていることを確認しましょう。

Ubuntu 24.04環境で、BookStackを24.10→v25.02にアップグレード。

Ubuntu24.04環境でBookStackをアップグレードしたときの手順メモです。

環境

  • BookStack v24.10
    • 25.02にアップグレード
  • Ubuntu 24.04
  • Apache 2.4系
  • PHP 8.3
  • MySQL 8系

さっくりとした手順

https://manualmaton.com/2023/12/15

以前に実施した、こちらの記事の通りに行いました。

  1. DBのバックアップを行います。
  • 推奨:システム全体のバックアップ
  1. git pullとアップグレードを行います。
  2. キャッシュをクリアします。
  3. Webサービス再起動を行います。
  4. アップグレード確認と動作確認を行います。

手順

システム全体のバックアップ(推奨)

万一に備え、システム全体のバックアップを取ることを推奨します。AWSや仮想サーバ等の場合は、インスタンスをまるごとバックアップしておくと良いでしょう。

mysqldumpによるDBバックアップ

  • 保存ディレクトリに移動
cd /hoge

任意のバックアップディレクトリを指定します。

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

DB名やDBユーザは自分の環境に合わせます。

  • バックアップ確認
less bookstack_backup.$(date +%Y%m%d).sql

平文で読めることを確認します。

git pullとアップグレード

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

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

  • git pull
sudo -u www-data git pull origin release

実行例(一部抜粋)

remote: Enumerating objects: 6028, done.
remote: Counting objects: 100% (1295/1295), done.
remote: Compressing objects: 100% (47/47), done.
remote: Total 6028 (delta 1263), reused 1248 (delta 1248), pack-reused 4733 (from 3)
Receiving objects: 100% (6028/6028), 5.75 MiB | 18.75 MiB/s, done.
Resolving deltas: 100% (3708/3708), completed with 405 local objects.
From https://github.com/BookStackApp/BookStack
 * branch                release    -> FETCH_HEAD
   b0dda6e6a..268e35343  release    -> origin/release
Updating b0dda6e6a..268e35343
Fast-forward
 .env.example.complete                                                                     |    5 +
 .github/translators.txt                                                                   |   40 +-
 .github/workflows/analyse-php.yml                                                         |    4 +-
 .github/workflows/lint-js.yml                                                             |    4 +-
 .github/workflows/lint-php.yml                                                            |    6 +-
 .github/workflows/test-js.yml                                                             |   29 +
 .github/workflows/test-migrations.yml                                                     |    6 +-
 .github/workflows/test-php.yml                                                            |    6 +-
 .gitignore                                                                                |    1 +
 LICENSE                                                                                   |    2 +-
 app/Access/ExternalBaseUserProvider.php                                                   |   49 +-
 app/Access/Ldap.php                                                                       |    8 +-

composer install

sudo -u www-data composer install --no-dev
  • 実行例(一部抜粋)
> @php -r "!file_exists('bootstrap/cache/services.php') || @unlink('bootstrap/cache/services.php');"
Installing dependencies from lock file
Verifying lock file contents can be installed on current platform.
Package operations: 5 installs, 70 updates, 8 removals
  - Downloading bacon/bacon-qr-code (v3.0.1)
  - Downloading dompdf/php-svg-lib (1.0.0)
  - Downloading dompdf/php-font-lib (1.0.1)
  - Downloading dompdf/dompdf (v3.1.0)
  - Downloading symfony/deprecation-contracts (v3.5.1)
  - Downloading symfony/http-foundation (v7.2.3)
  - Downloading guzzlehttp/uri-template (v1.0.4)
  - Downloading intervention/gif (4.2.1)
  - Downloading intervention/image (3.11.1)
  - Downloading symfony/process (v7.2.0)
  - Downloading knplabs/knp-snappy (v1.5.1)
  - Downloading symfony/string (v7.2.0)
  - Downloading symfony/service-contracts (v3.5.1)
  - Downloading symfony/console (v7.2.1)
  - Downloading laravel/prompts (v0.3.5)
  - Downloading laravel/serializable-closure (v2.0.3)
  - Downloading paragonie/constant_time_encoding (v3.0.0)
  - Downloading phpseclib/phpseclib (3.0.43)
  - Downloading league/oauth1-client (v1.11.0)
  - Downloading voku/portable-ascii (2.0.3)
  - Downloading symfony/css-selector (v7.2.0)
  - Downloading tijsverkoyen/css-to-inline-styles (v2.3.0)
  - Downloading symfony/var-dumper (v7.2.3)
  - Downloading symfony/uid (v7.2.0)
  - Downloading symfony/routing (v7.2.3)
  - Downloading symfony/mime (v7.2.3)
  - Downloading symfony/event-dispatcher-contracts (v3.5.1)
  - Downloading symfony/event-dispatcher (v7.2.0)
  • DBマイグレート
sudo -u www-data php artisan migrate

※この時、Are you sure you want to run this command?というプロンプトには「Yes」が見えるようにカーソルを移動してEnterします。そのままEnterするとキャンセルされ、全体のアップグレードが行われません。

アップグレード後のキャッシュクリアを行います。

  • キャッシュクリア
sudo -u www-data php artisan cache:clear
sudo -u www-data php artisan config:clear
sudo -u www-data php artisan view:clear

上記、それぞれ、successfully.で終わることを確認します。

Webサービス(apache)再起動

  • apache再起動前確認
systemctl status apache2.service

active(running)を確認します

  • apache再開
sudo systemctl restart apache2.service && echo $?

0を確認します。

  • apache再起動後確認
systemctl status apache2.service

active(runnning)を確認します

バージョンアップ確認

  1. BookStackがインストールされているURLにアクセスします。
  2. 管理者権限でログインします。
  3. 設定に進みシステムバージョンが作業時の最新版になっていることを確認します。
  4. ページの作成や編集が正常に行えることを確認します。

バージョンアップ後の作業(dumpファイル削除)

※SQLファイルが平文で読めるのは非常に危険な状態なので、作業を確認次第、早急に実施します※

  • 保存ディレクトリに移動
cd /hoge

DBバックアップを行ったディレクトリに移動します。

  • ファイル削除
shred -u bookstack_backup.$(date +%Y%m%d).sql
  • ファイル削除確認
ls -l bookstack_backup.$(date +%Y%m%d).sql

ファイルがないことを確認します。

Page 1 of 52

Powered by WordPress & Theme by Anders Norén