有馬総一郎のブログ

(彼氏の事情)

2025年08月21日 13:18:26 JST - 8 minute read - Linux

Pocketの代替wallabagをセルフホストで構築する

「後で読む」サービスとしてPocketを愛用したけど、オープンソースかつセルフホスト可能な代替として wallabag の存在を知り、早速自宅のUbuntu Serverに構築してみることにした。とはいえ、わざわざ自分で建てなくても一年で11ユーロで利用できるので、面倒なかたは wallabag.itを使うのもありかたと思う。

既に構築記事はいっぱいあるし、正直、2025-07-11に構築してから、時間が経ってしまって詳細を忘れてしまって記憶が怪しいが、一応記録しておく。

wallabag

インストール環境

  • OS: Ubuntu Server 22.04.5 LTS
  • Docker: Docker Compose
  • データベース: PostgreSQL

基本的には公式のDockerイメージを利用して構築を進めた。意外と、すんなりとはいかなかった。参考としたのは wallabag/docker: Official docker-composer for wallabag.など。

データベースはdocker。joplin、minifluxと共用している。

設定ファイル

docker-compose.yaml

  wallabag:
    image: wallabag/wallabag
    container_name: wallabag
    restart: unless-stopped
    environment:
      - POPULATE_DATABASE=false
      - POSTGRES_USER=postgresのsuperuser(root)名
      - POSTGRES_PASSWORD=postgresのsuperuser(root)のパスワード
      - SYMFONY__ENV__DATABASE_DRIVER=pdo_pgsql
      - SYMFONY__ENV__DATABASE_HOST=postgresql-server
      - SYMFONY__ENV__DATABASE_PORT=5432
      - SYMFONY__ENV__DATABASE_NAME=wallabag
      - SYMFONY__ENV__DATABASE_USER=wallabag
      - SYMFONY__ENV__DATABASE_NAME=wallabag
      - SYMFONY__ENV__DATABASE_PASSWORD=wallabagのユーザのパスワード
      - SYMFONY__ENV__DOMAIN_NAME=https://wallabag.自ドメイン
      - SYMFONY__ENV__SERVER_NAME="Your wallabag instance"
      - SYMFONY__ENV__REDIS_HOST=redis
      - SYMFONY__ENV__FOSUSER_REGISTRATION=false ## ユーザ作成前はtrue
      - SYMFONY__ENV__FOSUSER_CONFIRMATION=false
      - PHP_MEMORY_LIMIT=512M
    ports:
      - "127.0.0.1:8180:80"
    networks:
      - app-net
    volumes:
      - ./wallabag/images:/var/www/wallabag/web/assets/images
      - ./wallabag/data:/var/www/wallabag/data
    healthcheck:
      test: ["CMD", "wget" ,"--no-verbose", "--tries=1", "--spider", "http://localhost/api/info"]
      interval: 1m
      timeout: 3s
    depends_on:
      - db
      - redis

  redis:
    image: redis:alpine
    container_name: redis
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 20s
      timeout: 3s
    networks:
      - app-net

networks:
  app-net:
    driver: bridge

nginx.conf

server {
    listen 80;
    listen [::]:80;
    root /var/www;

    server_name wallabag.自ドメイン;
    include     /etc/nginx/conf.d/mime.types;

    ###
    # wallabag
    ###
    #
    location / {
        proxy_pass http://127.0.0.1:8180;
        proxy_set_header X-Forwarded-Host $server_name;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-For $remote_addr;
    }
}

画面キャプチャー

wallabag
wallabag

勿論、拡張機能もある。 wallabagger | Chrome-like / Firefox plugin for wallabag v2.、Firefox、Chrome両方に対応。

wallabag
wallabag

個人的にはpocketより使い易い。タグ付けのルールをdomainName matches "ubuntuhandbook.org"として作成すると、ドメインに合わせてタグを自動で付けてくれる。こういうのは便利だな、と。

以下、動かなかった時のまとめなので、読まなくて良し。

データベース接続エラー

docker compose upで起動したものの、wallabagコンテナがデータベースに接続できずに再起動を繰り返す問題が発生した。

Starting wallabag ...
Waiting for database ...
Waiting for database ...
Waiting for database

ログを確認すると、DB接続でエラー。

Can't connect to the database: An exception occurred in the driver: SQLSTATE[08006] [7] could not translate host name "db" to address: Name does not resolve

docker-compose.ymlでネットワークの設定漏れ。

    networks:
      - app-net

Run wallabagの読み解き

最初、問題なく起動できていたのだが、サブディレクトリ構成で動かそうとして、何度も起動を繰り返したからだろうか…起動しなくなった。最終的に起動はできるようなったのだが、サブディレクトリ構成は諦めた。

エラー解決として、Dockerの設定のドキュメントは、 Docker – wallabag documentationを見るのだけど、意味不明。

  1. Fork and clone the project
  2. Edit app/config/parameters.yml to replace database_* properties with commented ones (with values prefixed by env.)
  3. composer install the project dependencies
  4. php bin/console wallabag:install to create the schema
  5. docker compose up to run the containers (or docker-compose up for wallabag < 2.7)
  6. Finally, browse to http://localhost:8080/ to find your freshly installed wallabag.

多分、ドキュメントが古い気がする。

当初は wallabag/docker: Official docker-composer for wallabag.あたりをフォークして作っていたのだろうか?

docker/root/etc/wallabag/parameters.template.yml at master · wallabag/docker見ると

    database_driver: ${SYMFONY__ENV__DATABASE_DRIVER:-pdo_sqlite}
    database_host: ${SYMFONY__ENV__DATABASE_HOST:-127.0.0.1}
    database_port: ${SYMFONY__ENV__DATABASE_PORT:-~}
    database_name: ${SYMFONY__ENV__DATABASE_NAME:-symfony}
    database_user: ${SYMFONY__ENV__DATABASE_USER:-root}
    database_password: ${SYMFONY__ENV__DATABASE_PASSWORD:-~}
    database_path: "%kernel.project_dir%/data/db/wallabag.sqlite"
    database_table_prefix: ${SYMFONY__ENV__DATABASE_TABLE_PREFIX:-wallabag_}
    database_socket: null
    database_charset: ${SYMFONY__ENV__DATABASE_CHARSET:-utf8}

今は、コンテナ内に入ると、docker-compose.ymlに沿って /var/www/wallabag/app/config/parameters.yml が作成されている。

docker compose exec wallabag shで中に入ると、以下のように確認できる。

/var/www/wallabag # cat app/config/parameters.yml
# This file is auto-generated during the composer install
parameters:
    database_driver: pdo_pgsql
    database_host: postgresql-server
    database_port: 5432
    database_name: wallabag
    database_user: wallabag
    database_password: パスワード
    database_path: '%kernel.project_dir%/data/db/wallabag.sqlite'
    database_table_prefix: wallabag_
    database_socket: null
    database_charset: utf8
    domain_name: 'https://wallabag.自ドメイン'
    server_name: 'Your wallabag instance'
    mailer_dsn: 'smtp://127.0.0.1'
    locale: en
    secret: シークレット
    twofactor_sender: no-reply@wallabag.org
    fosuser_registration: false
    fosuser_confirmation: false
    fos_oauth_server_access_token_lifetime: 3600
    fos_oauth_server_refresh_token_lifetime: 1209600
    from_email: no-reply@wallabag.org
    rss_limit: 50
    rabbitmq_host: localhost
    rabbitmq_port: 5672
    rabbitmq_user: guest
    rabbitmq_password: guest
    rabbitmq_prefetch_count: 10
    redis_scheme: tcp
    redis_host: redis
    redis_port: 6379
    redis_path: null
    redis_password: null
    sentry_dsn: null

ClassNotFoundErrorなエラー

そのままコンテナ内で、php bin/console wallabag:installを実行すると

Symfony\Component\ErrorHandler\Error\ClassNotFoundError^ {#49
・・・中略・・・
2025-07-11T02:27:42+00:00 [critical] Uncaught Error: Class "Symfony\Bundle\DebugBundle\DebugBundle" not found

みたいなエラー。

なので、composer installを実行すると必要なパッケージがダウンロード、インストールされる。

Installing dependencies from lock file (including require-dev)
Verifying lock file contents can be installed on current platform.
Package operations: 34 installs, 0 updates, 0 removals
  - Downloading localheinz/diff (1.2.0)
  ・・・中略・・・
  - Installing localheinz/diff (1.2.0): Extracting archive

  ・・・中略・・・
  Generating autoload files
115 packages you are using are looking for funding.
  ・・・中略・・・
 Trying to install assets as relative symbolic links.

 --- ------------------------ ------------------
      Bundle                   Method / Error
 --- ------------------------ ------------------
  ✔   NelmioApiDocBundle       relative symlink
  ✔   CraueConfigBundle        relative symlink
  ✔   BabDevPagerfantaBundle   relative symlink
  ✔   FOSJsRoutingBundle       relative symlink
 --- ------------------------ ------------------


 [OK] All assets were successfully installed.

よし、これでphp bin/console wallabag:installできるようになった。

データベースリセットで失敗。

データベースの初期設定しなおそうと、設問、DBをリセットするで、はい、と答えると失敗。

Step 2 of 4: Setting up database.
---------------------------------

 It appears that your database already exists. Would you like to reset it? (yes/no) [no]:
 > yes

 Dropping database, creating database and schema...

In InstallCommand.php line 364:

  The command "doctrine:database:drop" generates some errors:

  Could not drop database /var/www/wallabag/data/db/wallabag.sqlite for connection named default
  An exception occurred while executing a query: SQLSTATE[42601]: Syntax error: 7 ERROR:  syntax error at or near "/"
  LINE 1: DROP DATABASE /var/www/wallabag/data/db/wallabag.sqlite

sqlite?PostgreSQL指定してるのになんで?と思ったが、docker-compose.ymlでPOPULATE_DATABASE=falseがないと駄目だった。

データベースマイグレーションエラー

以下のように、手動でデータベースを作成すると、インストールコマンドを実行すると、マイグレーションで権限エラーが発生した。

docker compose exec db /bin/bashでPostgreSQLコンテナに入る。

コンテナ内でpsqlを起動し、wallabag用のユーザーとデータベースを作成。

su postgres -c psql

-- psql内での操作
CREATE USER wallabag CREATEDB;
CREATE DATABASE wallabag OWNER wallabag TEMPLATE template0 ENCODING 'UTF8';
GRANT CREATE ON SCHEMA public TO wallabag;
ALTER USER wallabag WITH PASSWORD 'パスワード';

パスワードの部分は、docker-compose.ymlSYMFONY__ENV__DATABASE_PASSWORDと一致させる必要がある。そうしないと、Database connection ERROR! Can't connect to the database: An exception occurred in the driver: SQLSTATE[08006] [7] connection to server at "postgresql-server" (172.18.0.2), port 5432 failed: FATAL: password authentication failed for user "wallabag"といったエラーが吐かれる。

そして、php bin/console wallabag:installを実行すると…(リセットはしないで進行)

The command "doctrine:migrations:migrate" generates some errors:

An exception occurred while executing a query: SQLSTATE[42501]: Insufficient privilege: 7 ERROR:  permission denied for schema public
LINE 1: CREATE TABLE migration_versions (version VARCHAR(192) NOT NU...

再度PostgreSQLに接続し、ALTER DATABASE wallabag OWNER TO wallabag;wallabagデータベースの所有者をwallabagユーザーに変更することで解決した。

メモリ不足エラー

インストールコマンドで、PHPのメモリ不足エラーが発生。

 Creating schema...
 Clearing the cache...
PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 65536 bytes) in /var/www/wallabag/var/cache/de_/twig/ba/ba6f76f391a6836079dd32ff8bf4ac0c.php on line 832
PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 65536 bytes) in Unknown on line 0

docker-compose.ymlで、wallabagコンテナのPHPメモリ上限を上げる環境変数を追加した。

services:
  wallabag:
    image: wallabag/wallabag
    environment:
      # ... 他の設定 ...
      - PHP_MEMORY_LIMIT=512M # メモリ上限を512MBに増やす
    # ...

ファイルパーミッションの問題

インストールコマンドが成功して、以下のメッセージが表示されたが、

[OK] wallabag has been successfully installed.
[OK] You can now configure your web server, see https://doc.wallabag.org

しかし、ブラウザでアクセスすると「500 Internal Server Error」が表示されてしまう。

wallabag

コンテナ内のファイルの権限を確認したところ、/var/www/wallabag/dataディレクトリの所有者がrootになってしまっていた。

/var/www/wallabag # ls -l /var/www/wallabag/
total 1168
-rw-r--r--    1 nobody   nobody       98672 Jun  4 15:32 CHANGELOG.md
-rw-r--r--    1 nobody   nobody        3350 Jun  4 15:32 CODE_OF_CONDUCT.md
-rw-r--r--    1 nobody   nobody        1069 Jun  4 15:32 COPYING.md
-rw-r--r--    1 nobody   nobody         324 Jun  4 15:32 CREDITS.md
-rwxr-xr-x    1 nobody   nobody        1823 Jun  4 15:32 GNUmakefile
-rw-r--r--    1 nobody   nobody          20 Jun  4 15:32 Makefile
-rw-r--r--    1 nobody   nobody        2898 Jun  4 15:32 README.md
-rw-r--r--    1 nobody   nobody        1475 Jun  4 15:32 RELEASE_PROCESS.md
-rw-r--r--    1 nobody   nobody         103 Jun  4 15:32 SECURITY.md
drwxr-xr-x    1 nobody   nobody        4096 Jun  4 15:32 app
drwxr-xr-x    2 nobody   nobody        4096 Jun  4 15:32 bin
-rw-r--r--    1 nobody   nobody        8017 Jun  4 15:32 composer.json
-rw-r--r--    1 nobody   nobody      670445 Jun  4 15:32 composer.lock
drwxrwxr-x    2 root     root          4096 Jul 10 10:27 data

chown -R nobody:nobody /var/www/wallabagコマンドで、wallabagディレクトリ全体の所有者をnobody:nobody(wallabagコンテナの実行ユーザー)に変更した。

Pocketインポート

失敗しておいて、書き留めるのもあれだが、pocketからのエスクポートをまとめておく。

  1. Pocketログイン、CSVファイルをエスクポート

    wallabag
    wallabag

  2. エスクポート完了メールが届いたら、リンクに飛んでダウンロード

    wallabag
  3. ダウンロードしたZipファイルを解凍して、wallabagでpocket CSVでインポート

    wallabag
    wallabag
    wallabag

で上手くいくはずが、Unrecognized boolean literal `archive` となって駄目。CSVファイルで最後の列でunreadでなくarchiveとなっている箇所をunreadとしても同じエラーが出るのでインポートは諦めた。

wallabag

最後に

最初はなんで他のサイトではサクっと構築できてるのに失敗するんじゃぁ、と思った。大人しく金払ってセルフホスト止めようとか思ったけど、そんなにヘヴィーpocketユーザでもなかったので、頑張った。今思うとコンテナ削除して作りなおせば、もっと早かったんではないかな…まあいいや、dockerじゃなくて直でインストールする可能性もあるし。

これからwallabagを使って、快適な「後で読む」環境を構築していこうと思う。