Отложенное чтение. Wallabag
2024-12-05
·
5 мин. для прочтения
Отложенное чтение. Wallabag.
Содержание
1 Общая информация
- Позволяет сохранять веб-страницы для последующего чтения.
- Лицензия: MIT license
- Сайт с платной подпиской: https://www.wallabag.it/.
- Сайт: wallabag.org.
- Репозиторий: https://github.com/wallabag/wallabag
- Приложение для Android:
- Репозиторий: https://github.com/wallabag/android-app
- Магазин приложений:
- Приложение для iOS:
- Репозиторий: wallabag/ios-app
- Расширение браузера:
- Приложения для Linux:
- Read It Later: https://gitlab.gnome.org/World/read-it-later
- Ссылки по экосистеме: https://github.com/wallabag/wallabag/wiki/wallabag-ecosystem
- Emacs:
- wallabag.el:
- wombag:
- Репозиторий: https://github.com/karthink/wombag
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 Установка
- Документация: https://doc.wallabag.org/en/admin/installation/installation.html
- При первом логине используются следующие параметры:
- login: wallabag
- password: wallabag
5 Контейнер
5.1 Общая информация
- Репозиторий: https://github.com/wallabag/docker
- Dockerhub: https://hub.docker.com/r/wallabag/wallabag/
- Учётные данные по умолчанию:
wallabag:wallabag
. - При первом запуске необходимо будет сконфигурить приложение.
- Пусть доменное имя установки будет
wallabag.example.com
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"