↓ Перейти к основному содержимому
  1. Posts/
  2. Self-Hosting/

Обзор Linkwarden: Современный self-hosted менеджер закладок

··729 слов·4 минут· loading · loading · ·
Stilicho2011
Автор
Stilicho2011
Пишу о homelab, self-hosting, автоматизации и open-source решениях
Оглавление
Self-Hosting - This article is part of a series.
Part : This Article

Что такое Linkwarden и зачем он мне понадобился
#

У меня накопилась привычка сохранять “почитать позже” во вкладки браузера, а потом эти вкладки жить у меня месяцами, пока браузер не начинает от них подвисать. Классические закладки не спасают - страница через полгода может просто исчезнуть с сайта, и остается только название ссылки и обида. Linkwarden решает это буквально: он не просто запоминает адрес, а сохраняет копию самой страницы - текст, картинки, верстку - так что даже если оригинал пропадет, у вас все равно останется рабочая копия.

Позиционируется как self-hosted альтернатива Pocket, Raindrop.io и Pinboard, только с открытым кодом и без вопроса “а что будет с моими закладками, если сервис завтра закроется”.

Если статья или видео оказались полезны - поддержать канал можно на бусти, ссылка в контактах.

Что внутри
#

  • Архивация страниц - сохраняет HTML, PDF и скриншот на выбор, не только ссылку.
  • Режим чтения - без рекламы, с подсветкой текста и заметками поверх статьи.
  • Коллекции и теги - иерархические коллекции плюс теги, обычная для таких сервисов организация, но сделана удобно.
  • Полнотекстовый поиск - через Meilisearch, находит материал даже если вы забыли и ссылку, и название.
  • Совместная работа - можно делиться коллекциями и раздавать права участникам, полезно, если пользуетесь семьей или небольшой командой.
  • Импорт/экспорт - из браузера, в CSV/HTML - переехать с чего-то другого не проблема.
  • SSO/API - Authentik из коробки, плюс REST API для своих скриптов.
  • Клиенты - расширение для Chrome, PWA, приложения под Android и iOS.
  • AI-теги - пытается сам понять, о чем страница, и предлагает тег. Работает не идеально, но как черновой вариант сортировки - неплохо.
  • Wayback Machine - можно одной кнопкой отправить ссылку на archive.org, для действительно важных страниц лишняя копия не помешает.

Аутентификация - email/пароль, Google, GitHub, плюс OAuth2-провайдеры вроде Authentik, если у вас уже есть свой SSO.

Установка “в один клик” (для знакомства)
#

Проект поставляется с готовым compose-файлом, если просто хочется потыкать:

Проект поставляется с готовыми Docker-контейнерами. Развертывание занимает всего пару минут:

git clone https://github.com/linkwarden/linkwarden
cd linkwarden
cp .env.example .env
docker compose up -d

Файлы, которые использовались в ролике
#

Docker compose файл

services:
  postgres:
    container_name: postgres_linkwarden
    image: postgres:16-alpine
    env_file: .env
    restart: always
    volumes:
      - /home/stilicho/docker/linkwarden/pgdata:/var/lib/postgresql/data
    networks:
      - linkwarden #not necessary if you don't use another postgres instance
      #- proxy
  linkwarden:
    container_name: linkwarden
    env_file: .env
    environment:
      - DATABASE_URL=postgresql://postgres:${POSTGRES_PASSWORD}@postgres:5432/postgres
    restart: always
    # build: . # uncomment this line to build from source
    image: ghcr.io/linkwarden/linkwarden:latest # comment this line to build from source
    #ports:
    #  - 3000:3000
    volumes:
      - /home/stilicho/docker/linkwarden/data:/data/data
    depends_on:
      - postgres
    networks:
      - proxy
      - linkwarden #not necessary if you don't use another postgres instance
    labels:
      - "traefik.enable=true"
      - "traefik.docker.network=proxy"
      - "traefik.http.routers.linkwarden.entrypoints=http"
      - "traefik.http.routers.linkwarden.rule=Host(`linkwarden.stilicho.ru`)"
      - "traefik.http.middlewares.linkwarden-https-redirect.redirectscheme.scheme=https"
      - "traefik.http.routers.linkwarden.middlewares=linkwarden-https-redirect"
      - "traefik.http.routers.linkwarden-secure.entrypoints=https"
      - "traefik.http.routers.linkwarden-secure.rule=Host(`linkwarden.stilicho.ru`)"
      - "traefik.http.routers.linkwarden-secure.tls=true"
      - "traefik.http.routers.linkwarden-secure.tls.certresolver=cloudflare"
      - "traefik.http.routers.linkwarden-secure.service=linkwarden"
      - "traefik.http.services.linkwarden.loadbalancer.server.port=3000"

networks:
  proxy:
    external: true
  linkwarden:
    external: true

Файл .env рядом:

NEXTAUTH_URL=https://linkwarden.stilicho.ru/api/v1/auth
# NEXTAUTH_URL=http://localhost:3000/api/v1/auth # раскомментируйте, если работаете без своего OIDC-провайдера
NEXTAUTH_SECRET=замените_на_случайную_строку
POSTGRES_PASSWORD=замените_на_свой_пароль

# SMTP Settings
#NEXT_PUBLIC_EMAIL_PROVIDER=
#EMAIL_FROM=
#EMAIL_SERVER=
#BASE_URL=

#################
# SSO Providers #
#################

#AUTHENTIK_CUSTOM_NAME=Authentik
#NEXTAUTH_URL=https://linkwarden.stilicho.ru/api/v1/auth
#NEXT_PUBLIC_AUTHENTIK_ENABLED=true
#AUTHENTIK_CUSTOM_NAME=authentik
#AUTHENTIK_ISSUER=https://auth.stilicho.ru/application/o/linkwarden
#AUTHENTIK_CLIENT_ID=ID
#AUTHENTIK_CLIENT_SECRET=SECRET

Пара моментов:

  • NEXTAUTH_SECRET - в оригинальном примере от разработчиков там буквально стоит значение linkwarden. Не оставляйте так - это секрет, которым подписываются сессии, и его знают все, кто читал README проекта. Сгенерируйте что-то случайное, например openssl rand -hex 32.
  • сеть linkwarden - тоже external: true, то есть Compose сам ее не создаст. Если раньше не заводили: docker network create linkwarden перед первым запуском.
  • Комментарий про “loadbalancer должен быть последней строкой” из оригинального примера - можно не бояться нарушить: Traefik разбирает лейблы контейнера целиком, порядок строк в списке labels: ни на что не влияет.

Как он смотрится на фоне соседей
#

ХарактеристикаLinkwardenPocketRaindrop.ioWallabag
Self-hosted✅❌❌✅
Архивация страниц✅❌✅ (Pro)✅
Полнотекстовый поиск✅✅✅✅
Мультипользовательский✅❌✅✅
Открытый исходный код✅❌❌✅

Ближайший конкурент по духу здесь - Wallabag: тоже open source, тоже self-hosted, тоже архивирует страницы. У меня в итоге победил Linkwarden - в первую очередь из-за интерфейса, который выглядит современнее, и из-за AI-тегов, которые хоть и не идеальны, но реально экономят время на сортировке накопившихся ссылок.

Вывод
#

Ставится легко, за Traefik заводится без сюрпризов (кроме того самого секрета по умолчанию, который обязательно смените), а привычка “сохранить, чтобы почитать позже” наконец перестает заканчиваться мертвыми ссылками через полгода. Если у вас то же самое болото из вкладок браузера, что было у меня - разворачивать стоит, тем более что при своем SSO (Authentik/Authelia) настройка занимает буквально пару минут.

Self-Hosting - This article is part of a series.
Part : This Article

Related

Diun: уведомления об обновлениях Docker-образов

··931 слово·5 минут· loading · loading
Подробная инструкция по установке и настройке Diun для отслеживания обновлений Docker-образов. Рассмотрены шаги по развертыванию, интеграции с уведомлениями и автоматизации мониторинга, чтобы своевременно обновлять контейнеры и повышать безопасность системы.

Vaultwarden: установка на сервере, альтернатива Bitwarden

··3179 слов·15 минут· loading · loading
Пошаговая инструкция по установке Vaultwarden -легкой self-hosted версии Bitwarden. От базового docker-compose до продвинутой конфигурации с SSO и push-уведомлениями.