タグ: Ubuntu Page 2 of 18

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 22.04(LinuxMint 21.2)でESM有効化。

こちらの記事の続きです。

Ubuntu Proの個人利用トークンは5台までのサーバまでにアタッチできるため、Ubuntu 22.04サーバに入れてみます。

今回試すのは、Ubuntuの派生形であるディストリビューションのLinuxMint21.2です。

24.04と同じ手順でアタッチできるか確認

sudo pro attach トークン

を実施してもエラーが返りました。

Ubuntu advantage toolsインストール

  • パッケージインストール
sudo aptitude update && sudo aptitude install ubuntu-advantage-tools
  • 念のため再起動
sudo reboot

ESMアタッチと確認

sudo pro attach トークン

今度はOKです。

sudo pro status --all
SERVICE          ENTITLED  STATUS       DESCRIPTION
anbox-cloud      yes       n/a          Scalable Android in the cloud
cc-eal           yes       n/a          Common Criteria EAL2 Provisioning Packages
cis              yes       n/a          Security compliance and audit tools
esm-apps         yes       n/a          Expanded Security Maintenance for Applications
esm-infra        yes       n/a          Expanded Security Maintenance for Infrastructure
fips             yes       n/a          NIST-certified FIPS crypto packages
fips-preview     yes       n/a          Preview of FIPS crypto packages undergoing certification with NIST
fips-updates     yes       n/a          FIPS compliant crypto packages with stable security updates
landscape        yes       n/a          Management and administration tool for Ubuntu
livepatch        yes       n/a          Canonical Livepatch service
realtime-kernel  yes       n/a          Ubuntu kernel with PREEMPT_RT patches integrated
ros              yes       n/a          Security Updates for the Robot Operating System
ros-updates      yes       n/a          All Updates for the Robot Operating System

のようになっていることを確認し、

https://ubuntu.com/pro/dashboard

で、Active machinesがカウントアップされていればアタッチはできています。

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の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

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

Web解析システムmatomoの自動アップグレード機能。

Jetpackの代わりとして運用しているWeb解析、Matomo。更新もあまり手間を必要とせず利用可能でした。

このように「新しいアップデート」ボタンが出てきますので

これを押した後に「自動アップデート」をクリック。

この成功の画面が出て、「Matomoを続ける」をクリック。

バージョンによってはDBのアップブレードを示唆されますので、

Matomoのアップグレードをクリック。

このDBのアップグレードも終われば完了。

Nextcloud、ユーザー作成時に作成されるファイルを編集。

概要

企業内やコミュニティでNextcloudを運用する際のアカウント作成は割と簡単ですが、

{{thumbnail(clipboard-202503081731-br3pd.png, size=640)}}

このようにデフォルトのファイルがアカウントを作成するたびに増えていきます。

1アカウントにつき33MB程ではありますが、不要なファイルではあるので

  • 「アカウント作成時にファイルを作らない」
  • 「または特定のファイルやディレクトリを作る」

ように修正します。

環境

以下の環境で動作を確認。

  • Ubuntu 22.04
  • php 8.2
  • Nextcloud 30.6
  • Apache 2.4
  • MySQL

さっくりとした手順

  1. サーバにコンソールログインします。
  2. Nextcloudのルートディレクトリに移動します。
  3. ディレクトリ情報を修正します。
  4. Nextcloud(Apache)を再起動します。

Nextcloudのルートディレクトリに移動

cd /path/to/nextcloud/root/directory/core/skeleton && pwd

筆者環境/home/www-data/nextcloud/core/skeleton

ディレクトリ・ファイル情報修正

ここに、アカウント作成時に自動的に追加されるファイルが含まれています。

  • 'Nextcloud intro.mp4'
  • Photos
  • 'Reasons to use Nextcloud.pdf'
  • 'Templates credits.md'

等を消していきます。

例)

sudo rm 'Reasons to use Nextcloud.pdf'

任意の方法でファイル(マニュアルなど)をこのディレクトリに入れることで、アカウント作成時にそのファイルが追加されます。その場合は

sudo chown www-data hoge

として、ファイルの所有者をapache(nextcloud)の実行者に変えます。

設定変更確認

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

0を確認します。

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

active(running)を確認します。

  • アカウント作成確認
  1. Nextcloudで管理者権限でログインします。
  2. 任意のアカウントを作成します。
  3. 作成したアカウントでログインします。
  4. 「ファイル」に進み、削除したファイルやディレクトリがないことと追加したファイルがあることを確認すれば設定できています。

Redmineからのメール送信エラー解決メモ(手動 OpenSSL 更新に伴う証明書ストアの修正)

概要

Redmineサーバからリマインダーのメールが送信されない事象を解決したときのメモ書きです。

環境

  • Ubuntu 24.04
  • OpenSSL 3.3.3
  • Redmine 5.1
  • Apache 2.4
  • MySQL 8.0.41

特記事項

サーバにはメール送信の機能を有しておらず、gmailのアプリ連携でメールを飛ばしています。

事象確認

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

筆者環境/home/www-data/redmine

  • リマインダメールを送信
sudo -u www-data bundle exec rake redmine:send_reminders days=7 RAILS_ENV=production

リマインダメール送信されず。

そこで、production.logを確認したところ、メール送信時に以下のエラーログが出力されました:

ERROR -- : [ActiveJob] [ActionMailer::MailDeliveryJob] Email delivery error: SSL_connect returned=1 errno=0 peeraddr=xxx.xxx.xxx.xxx:587 state=error: certificate verify failed (unable to get local issuer certificate)

どうやら、証明書回りのエラーのようです。

確認したこと(原因確認)

メール設定の再確認

まず、メール設定を再確認しました。RedmineでのSMTP設定は特に変更していないため、問題は設定に起因するものではないと判断しました。

OpenSSLの設定を再確認

そこで思い当たる節。

パッケージ管理システムからではなく、手動で OpenSSL を更新した影響で、証明書ストアのパスが /usr/bin/openssl から /usr/local/ssl に変更されていたことが原因だと分かりました。

/usr/local/ssl/bin/openssl version -d

OPENSSLDIR: "/usr/local/ssl" を確認。

対処

CA証明書のコピー

新しい証明書ストア /usr/local/ssl にシステムの CA 証明書をコピーしました:

sudo cp /etc/ssl/certs/ca-certificates.crt /usr/local/ssl/cert.pem

また、証明書ディレクトリを作成し、必要な証明書を全てコピーしました:

  • ディレクトリ作成
sudo mkdir -p /usr/local/ssl/certs
  • システム内の証明書ストア一式をコピー
sudo cp -r /etc/ssl/certs/* /usr/local/ssl/certs/
  • 証明書ストア一式を再暗号化
sudo /usr/local/ssl/bin/c_rehash /usr/local/ssl/certs/

環境変数の設定

/etc/environmentに以下の内容を追記しました。

SSL_CERT_FILE=/usr/local/ssl/cert.pem
SSL_CERT_DIR=/usr/local/ssl/certs
  • 設定後の反映
sudo source /etc/environment

Redmine(Apache)再起動

  • apache再起動
sudo systemctl restart apache2.service ; echo $?

0を確認

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

active(running)を確認

解決確認

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

筆者環境/home/www-data/redmine

  • リマインダメールを送信
sudo -u www-data bundle exec rake redmine:send_reminders days=7 RAILS_ENV=production

今度は正常に送信されることを確認しました。

まとめと教訓

Redmineからメールが送信できなかった問題は、手動で更新したOpenSSLの証明書ストアのパス設定が原因でした。

証明書ストアが適切に設定されていないと、SMTP 送信時に certificate verify failed エラーが発生。

証明書関連の問題が発生した場合、OPENSSLDIR を確認し、適切な CA 証明書が配置されているかチェックすることが重要。

また、証明書周りはシステム全体に影響を及ぼすため、確認が甘かったということも事実。これは、手動でOpenSSLをアップグレードする際にも、改めて手順を確認します。

Page 2 of 18

Powered by WordPress & Theme by Anders Norén