Отложенное чтение. Wallabag

2024-12-05 · 5 мин. для прочтения

Отложенное чтение. Wallabag.

Содержание

1 Общая информация

2 Особенности

  • Клиенты wallabag скачивают всю базу.
  • При разрастании базы происходит деградация производительности.
  • И в конце концов клиент просто перестаёт работать.
  • Рекомендуется удалять прочитанные статьи с сервера.

3 Утилиты

3.1 cleanABag

  • Репозиторий: https://git.sr.ht/~bacardi55/cleanABag
  • cli-инструмент для удаления статей старше указанной даты из wallabag.
  • Омтавляет поменные и непрочтённые сообщения по умолчанию.
  • Пример запуска:
    # Удалите архивные статьи старше 2021-12-31 (дата в формате YYYY-MM-DD), не затрагивая непрочтённые и отмеченные
    # Протестировать
    cleanABag prune -c /path/to/credentials.json -d "2021-12-31"
    # Удалить
    cleanABag prune -c /path/to/credentials.json -d "2021-12-31" --delete
    

4 Установка

5 Контейнер

5.1 Общая информация

5.2 Podman

5.2.1 Общая информация

5.2.2 Загрузка

  • Скачайте контейнер:
    podman pull wallabag/wallabag
    

5.3 Nginx

  • Настройте nginx:
    server {
           listen 443 ssl http2;
           listen [::]:443 ssl http2;
    
           server_name wallabag.example.com;
    
           ssl_certificate /etc/letsencrypt/live/wallabag.example.com/fullchain.pem;
           ssl_certificate_key /etc/letsencrypt/live/wallabag.example.com/privkey.pem;
    
            charset utf-8;
            gzip on;
            gzip_types text/css application/javascript text/javascript application/x-javascript image/svg+xml text/plain text/xsd text/xsl text/xml image/x-icon;
    
            location / {
                    proxy_pass http://localhost:40401;
                    proxy_set_header X-Forwarded-Host $server_name;
                    proxy_set_header X-Forwarded-Proto https;
                    proxy_set_header X-Forwarded-For $remote_addr;
            }
    
    }
    
    server {
           listen         80;
           listen         [::]:80;
           server_name    wallabag.example.com;
           return         301 https://$server_name$request_uri;
    }
    

5.4 Обновление

  • Обновление контейнера:
    podman pull wallabag/wallabag
    podman stop wallabag
    podman compose --file wallabag-sqlite.yaml up --detach
    

5.5 Система на базе SQLite

5.5.1 Запуск вручную

  • Создайте каталоги для постоянных данных:
    mkdir -p /opt/wallabag/{data,images}
    chown -R nobody:nobody /opt/wallabag
    
  • Необходимо указать том для контейнера (для постоянного хранения):
    podman run --name wallabag -v /opt/wallabag/data:/var/www/wallabag/data -v /opt/wallabag/images:/var/www/wallabag/web/assets/images -p 40401:80 -e "SYMFONY__ENV__DOMAIN_NAME=https://wallabag.example.com" wallabag/wallabag
    
  • Сервер будет доступен по http://localhost:40401.

5.5.2 docker-compose

  • Создадим файл docker-compose wallabag-sqlite.yaml:
    version: '3'
    
    networks:
        proxy-network:
            external: true
    
    services:
      wallabag:
        image: wallabag/wallabag:latest
        container_name: wallabag
        restart: unless-stopped
        environment:
    ​      - TZ=Etc/UTC
    ​      - SYMFONY__ENV__MAILER_DSN=smtp://127.0.0.1
    ​      - SYMFONY__ENV__MAILER_HOST=mail.example.com
    ​      - SYMFONY__ENV__FROM_EMAIL="wallabag@example.com"
    ​      - SYMFONY__ENV__SERVER_NAME="wallabag.example.com"
    ​      - SYMFONY__ENV__DOMAIN_NAME=https://wallabag.example.com
    ​      - PHP_MEMORY_LIMIT=512M
    ​      - SYMFONY__ENV__MAILER_USER=""
    ​      - SYMFONY__ENV__MAILER_PASSWORD=""
    ​      - SYMFONY__ENV__FOSUSER_REGISTRATION=false
    ​      - SYMFONY__ENV__FOSUSER_CONFIRMATION=false
    ​      - SYMFONY__ENV__TWOFACTOR_AUTH=false
        ports:
    ​      - 40401:80
        volumes:
    ​      - /opt/wallabag/images:/var/www/wallabag/web/assets/images
    ​      - /opt/wallabag/data:/var/www/wallabag/data
        networks:
    ​      - proxy-network
        healthcheck:
          test: ["CMD", "wget" ,"--no-verbose", "--tries=1", "--spider", "http://localhost/api/info"]
          interval: 1m
          timeout: 3s
    
  • Запуск будет выполняться следующим образом:
    podman compose --file wallabag-sqlite.yaml up --detach
    

5.5.3 Скрипт systemd

  • Создаём файл сервиса /etc/containers/systemd/wallabag.container:
    [Unit]
    Description=A templated wallabag container
    
    [Container]
    Image=wallabag
    ContainerName=wallabag
    PublishPort=40401:80
    
    [Service]
    # Restart service when sleep finishes
    Restart=always
    
    [Install]
    WantedBy=default.target
    
  • Запустим генератор и сообщим systemd о запуске новой службы:
    systemctl daemon-reload
    
  • Запустим службу:
    systemctl start wallabag.service
    

5.6 Система на базе PostgreSQL

5.6.1 docker-compose

  • Создадим файл docker-compose wallabag-pgsql.yaml:
    version: '3'
    services:
      wallabag:
        image: wallabag/wallabag:latest
        container_name: wallabag-pgsql
        restart: unless-stopped
        environment:
    ​      - TZ=Etc/UTC
    ​      - SYMFONY__ENV__MAILER_DSN=smtp://127.0.0.1
    ​      - SYMFONY__ENV__FROM_EMAIL=wallabag@example.com
    ​      - SYMFONY__ENV__DOMAIN_NAME=https://wallabag.example.com
    ​      - SYMFONY__ENV__SERVER_NAME=wallabag.example.com
    ​      - PHP_MEMORY_LIMIT=1024M
    ​      - PHP_MAX_EXECUTION_TIME=600
    ​      - PHP_MAX_INPUT_TIME=600
    ​      - POSTGRES_PASSWORD=<password1>
    ​      - POSTGRES_USER=postgres
    ​      - SYMFONY__ENV__DATABASE_DRIVER=pdo_pgsql
    ​      - SYMFONY__ENV__DATABASE_HOST=wallabag-db-pgsql
    ​      - SYMFONY__ENV__DATABASE_PORT=5432
    ​      - SYMFONY__ENV__DATABASE_NAME=wallabag
    ​      - SYMFONY__ENV__DATABASE_USER=wallabag
    ​      - SYMFONY__ENV__DATABASE_PASSWORD=<password2>
        ports:
    ​      - "40401:80"
        depends_on:
    ​      - wallabag-db-pgsql
      wallabag-db-pgsql:
        image: postgres:14
        container_name: wallabag-db-pgsql
        restart: unless-stopped
        environment:
    ​      - POSTGRES_PASSWORD=<password1>
    ​      - POSTGRES_USER=postgres
    
  • Используем postgres-14, посколку в версии 15 были сделаны исправления безопасности (https://www.cybertec-postgresql.com/en/error-permission-denied-schema-public/).
  • Но docker-образ для wallabag не поддерживает этого.
  • Запуск будет выполняться следующим образом:
    podman compose --file wallabag-pgsql.yaml up --detach
    

6 Импорт и экспорт

6.1 Импорт Omnivore

  • Экспортировал записи с Omnivore.
  • Скачал архив с большим количеством файлов json (более 600).
  • Загружать каждый файл через web-интерфейс не представлялось возможным.
  • Скопировал архив на сервер.
  • Поскольку каталог /opt/wallabag/images уже подмонтирован к контейнеру в каталог /var/www/wallabag/web/assets/images, сделал в нём каталог omnivore и распаковал туда архив.
  • Запустил скрипт:
    #!/bin/bash
    
    cd /opt/wallabag/images/omnivore
    for i in metadata*
    do
        podman exec -it <container-id> sh -c "cd /var/www/wallabag/web/assets/images/omnivore; /var/www/wallabag/bin/console --env=prod wallabag:import -v --importer=omnivore --markAsRead=true -- <username> ${i} "
    done
    

6.2 Импорт Instapaper

  • Скопировал файл на сервер.
  • Поскольку каталог /opt/wallabag/images уже подмонтирован к контейнеру в каталог /var/www/wallabag/web/assets/images, сделал в нём каталог instapaper и поместил туда файл.
  • Структура файла:
    URL,Title,Selection,Folder,Timestamp,Tags
    
  • Запустил скрипт:
    #!/bin/bash
    
    cd /opt/wallabag/images/instapaper
    for i in *.csv
    do
        podman exec -it <container-id> sh -c "cd /var/www/wallabag/web/assets/images/instapaper; /var/www/wallabag/bin/console --env=prod wallabag:import -v --importer=instapaper --markAsRead=true -- <username> ${i} "
    done
    

6.3 Импорт Pocket

  • Отложенное чтение. Pocket
  • Сохранить архив можно на странице: https://getpocket.com/export.
  • Скопировал архив на сервер.
  • Поскольку каталог /opt/wallabag/images уже подмонтирован к контейнеру в каталог /var/www/wallabag/web/assets/images, сделал в нём каталог pocket и поместил туда архив.
  • Распаковал архив.
  • Там файлы .csv, структура файлов:
    title,url,time_added,tags,status
    
  • Нет отметки, что файл в избранном.
  • Импортер --importer=pocket их не читает.
  • Переделал из под формат Instapaper.
  • Установил csvkit (см. Формат CSV. csvkit):
    pipx install csvkit
    
  • Распаковал файл pocket.zip в каталог /opt/wallabag/images/pocket/in:
    mkdir -p /opt/wallabag/images/pocket/in
    cp pocket.zip /opt/wallabag/images/pocket/in
    cd /opt/wallabag/images/pocket/in
    unzip pocket.zip
    
  • Преобразовал формат:
    cd /opt/wallabag/images/pocket/in
    for i in *.csv; do echo "," | csvjoin "${i}" - | csvcut -c 2,1,6,5,3,4 > ../${i}; done
    cd ../
    
  • Запустил скрипт:
    #!/bin/bash
    
    cd /opt/wallabag/images/instapaper
    for i in *.csv
    do
    podman exec -it <container-id> sh -c "cd /var/www/wallabag/web/assets/images/pocket; /var/www/wallabag/bin/console --env=prod wallabag:import -v --importer=instapaper --markAsRead=true -- <username> ${i} "
    done
    

6.4 Экспорт всех записей

6.4.1 Экспорт

  • Перейдите в директорию установки wallabag.

  • Выполните команду:

    bin/console wallabag:export --env=prod <имя_пользователя> [<путь_к_файлу>]
    
    • <имя_пользователя> - имя пользователя, чьи записи нужно экспортировать;
    • <путь_к_файлу> - опциональный параметр, указывающий путь к файлу экспорта.
  • Пример использования:

    bin/console wallabag:export --env=prod john.doe /var/www/wallabag/exports/export.json
    
  • После выполнения команды все записи указанного пользователя будут экспортированы в выбранный файл в формате JSON.

6.4.2 Импорт

  • Для импорта используем следующую команду:
    bin/console wallabag:import --env=prod username export.json
    

6.4.3 Экспорта из контейнера

  • Получите идентификатор контейнера:
    podman container list
    
  • Поскольку каталог /opt/wallabag/images уже подмонтирован к контейнеру в каталог /var/www/wallabag/web/assets/images, будем экспортировать в его.
  • Подключитесь к контейнеру и выполните экспорт:
    podman exec -it <container-id> sh -c "bin/console wallabag:export --env=prod john.doe /var/www/wallabag/web/assets/images/$(date -I).json"
    
Дмитрий Сергеевич Кулябов
Authors
Профессор кафедры теории вероятностей и кибербезопасности
Мои научные интересы включают физику, администрирование Unix и сетей.