Amazonのアソシエイトとして、ラズパイダ(raspida.com)は適格販売により収入を得ています。詳しくは当サイトの プライバシーポリシーをご覧ください。

溜まった写真の管理に、Win/Macの画像管理アプリを使ってきました。ローカル保存だと容量が大きくなるため、Raspberry Piで構築したファイルサーバに格納しています。

ファイルサーバにOpenMediaVault(OMV6)で構築しているので、プラグインにDockerを入れて一石二鳥でもできます。

しかし、これが設定が面倒でしてね。Dockerのことも深く理解していないこともあり、インストールまでは問題なくできても、Piwigoで設定したDB(mariadb)に接続できないトラブルにハマりました。

一旦、全部削除して、別のRaspberry Pi 4で構築してみました。

OMVでもDocker関係のインストール以外は参考になるかと思いまとめてみました。

Piwigoは使いやすいですね。

原因はデータベースとユーザーの新規作成だった

原因を模索して得た結論は、単純にコンテナ内のデータベース(mysql/mariadb)でデータベースと新規ユーザーを作成していなかったというオチでした。

Rグリーン Rグリーン
ちゃんと読まないとダメですね。

You must create a user and database for piwigo to use in a mysql/mariadb server.

https://hub.docker.com/r/linuxserver/piwigo/

これにはdocker-compose.ymlの作成の他に、docker内でコマンドを実行する必要があります。

手順の流れはこんな感じ。

  1. .ymlを書いて、docker compose up -d
  2. mariadbに入ってデータベースとユーザーを新規作成する
  3. piwigoインストールWeb画面のホスト名はdockerならmariadbデータベースのサービス名でいい。

トラブルの内容

piwigoのインストール設定画面で、ホスト名に何を入れたらいいのかが分かりませんでした。

500系のエラーがあったり、色んな情報を鵜呑みにしてハマりましたね。

記事執筆時点でPiwigoはバージョンが14.1.0です。検索で探せた内容だと、このバージョンが古くて今では必要無い情報も多かったです。

ロカールインストールとも異なるので、コレというのがなかなか見つかりません。IPアドレス:ポート番号と思っていたら違った。ホストの設定以外はスムーズなんですけどね。

お陰で色んな情報を知ることができました。

docker-compose.ymlの中身

Raspberry Pi 4にRaspberry Pi OS lite(bookworm)64bitを書き込み、SSH接続して設定していきます。

Raspberry Pi OSにDockerをインストールするのは終えている状態です。ラズパイダでもご紹介しています。今回もこの通りで実行しました。

ユーザールートにpiwigoというディレクトを作り、その直下にdocker-compose.ymlを作成し、コンテナのバインドマウントさせたappdataもここにします。

~/piwigo
├── appdata
│   ├── config
│   ├── gallery
│   ├── mariadb
│   └── nginx
└── docker-compose.yml

ymlの中身は最低限これで動作しました。

services:
  piwigo:
    image: lscr.io/linuxserver/piwigo:latest
    container_name: piwigo
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Asia/Tokyo
    volumes:
      - ./appdata/config:/config
      - ./appdata/gallery:/gallery
    ports:
      - 8080:80
    restart: unless-stopped

  nginx:
    image: linuxserver/nginx
    container_name: nginx
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Asia/Tokyo
    volumes:
      - ./appdata/nginx:/config
    ports:
      - 81:80
      - 444:443
    restart: unless-stopped

  mariadb:
    image: linuxserver/mariadb
    container_name: piwigo_db
    environment:
      - PUID=1000
      - PGID=1000
      - MYSQL_ROOT_PASSWORD=rootpass
      - MARIADB_DATABASE=piwigo_db
      - MARIADB_USER=piwigo
      - MARIADB_PASSWORD=piwigopass
      - TZ=Asia/Tokyo
    volumes:
      - ./appdata/mariadb:/config
    ports:
      - 3307:3306
    restart: unless-stopped

3つのサービスのポートは、それぞれ8080、81、3307としました。特に被らないのであれば、そのまま同じように、80:80とか、3306:3306で構いません。

ユーザーのPUIDとPGIDは、id ユーザー名コマンドで調べてください。

uid=1000(raspida) gid=1000(raspida) groups=1000(raspida),4(adm),20(dialout),24(cdrom),27(sudo),29(audio),44(video),46(plugdev),60(games),100(users),102(input),105(render),106(netdev),995(spi),994(i2c),993(gpio),992(docker)

id raspida

container_name:は、自分が分かりやすいように設定しただけで、piwigoで必須ではありません。付けた方がいいとは思っています。

■Pi 5は8GBモデルがオススメ

コンテナ内のmysqlに入り新規作成(データベースとユーザー)

失敗したのは、この手順が抜けていたからなんです。Dockerなのでコンテナ内に入って実行しないとならない点が一手間多くなります。

コンテナ内に入り、mysqlコマンドをrootでログインします。

docker exec -it db-container /bin/bash

rootのパスは、ymlで書いたrootpassです。

mysql -u root -p

show databases;で既にあれば良いのですけど、無いなら作成します。

create database piwigo_db;

確認するとこんな感じ。

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| piwigo_db          |
| sys                |
+--------------------+

続けて、ユーザーを作成します。

CREATE USER 'piwigo'@'%' IDENTIFIED BY 'piwigopass';
GRANT ALL ON piwigo_db.* TO 'piwigo'@'%' IDENTIFIED BY 'piwigopass' WITH GRANT OPTION;
FLUSH PRIVILEGES;

キモは、'piwigo'@'%'で%がアスタリスクの代わりになっていること。Dockerだとローカルホストじゃないからエラーになって困った。

合わせて、GRANT ALL ON piwigo_db.* がymlで設定したデータベース名になっていることに気を付けます。間違えたらyml側を変更しないとなりませんね。

FLUSH PRIVILEGES;で適用すればOKです。

確認するとこんな感じ。

MariaDB [(none)]> select user, host from mysql.user;
+-------------+-----------+
| User        | Host      |
+-------------+-----------+
| piwigo      | %         |
| root        | %         |
| mariadb.sys | localhost |
+-------------+-----------+

exit;後、exitで抜けます。

インストールのWEBGUI画面

これで問題無くDBにも接続できるようになりました。

ymlで設定したポート番号を付けてRaspberry Pi 4のIPアドレスでWEBGUIで入力していきます。http://IPアドレス:8080

データベース設定のホストは、mariadbでOKです。

管理設定の部分は、新たに設定するので、テキトーにadminやら自分の名前やらで決めてください。これは後でPiwigoの管理画面でリンクで表示されます。パスワードも新規に作ります。

なお、メールアドレスは必須のようです。実在しなくてもいいです。Dcokerなのでオプションは外した方が無難です。sendmailコンテナなどあれば別ですけど。

おまけの設定

今回はここに書かれている最低限で動作できました。Raspberry Pi 4単体のDockerなら、これ以上の設定は無くても動作はします。

もしも権限の問題があるなら、webサーバが使えるように、wwwディレクトリのグループに入れた方がいいかも知れません。

sudo chown -R raspida:www-data ~/piwigo/appdata/nginx/www

同じように、ファイルやフォルダのパーミションは、644や755が良いみたいなので、エラーがあった場合は付与してあげましょう。

まとめて設定する方法を探しました。

これも今回知りました。type fがファイル、dがディレクトリ、|(パイプ)の後にxargsで続けてコマンド。chmod a+rは644より最適みたい。

appdata以降だとちょっと量が多いので、nginxディレクトリ以下とかケースバイケースで指定してください。

find ~/piwigo/appdata -type f -print | xargs sudo chmod a+r
find ~/piwigo/appdata -type d -print | xargs sudo chmod 755

他にもあると思います。でも、一先ずはこれで使っていけます。

次はOMVのDockerでも試して、ファイルサーバ内で完結させたいです。OMVだと共通フォルダの設定がややこしいというか勘違いしてしまうことが多く面倒でしたね。

以上がハマりポイントの解消でした。終わってみればなんてことないけど、気が付かないもんだ。