Read in:
Русский

Self-hosted вики на SQLite (один бинарник)

Если нужна self-hosted вики без поднятия Postgres и Redis, trip2g работает как один бинарник Go на одном файле SQLite. Вы пишете в Obsidian, синхронизируете — и заметки отдаются как вики с полнотекстовым поиском, контролем доступа и встроенным MCP-эндпоинтом. Эта страница честно обозревает распространённые self-hosted вики, а затем показывает установку из одного бинарника.

Почему вес стека важен

Трение большинства self-hosted вики не в самой вики, а во всём, что она тянет за собой. Wiki.js хочет Postgres. Outline хочет Postgres, Redis и S3. Даже небольшая командная вики может превратиться в многоконтейнерное развёртывание со своей историей бэкапа и обновления на каждый сервис. На маленьком VPS это реальные накладные расходы, и каждый лишний сервис — ещё одна вещь, которая ломается в два часа ночи.

SQLite меняет расчёт. Вся база — один файл. Бэкап вики — это копирование этого файла (или его стриминг через Litestream). Нет отдельного демона базы, который нужно запускать, патчить и тюнить. Для личной или небольшой командной вики это обычно верное количество механики.

Варианты, честно

Вики Стек База данных Редактор Кому подходит
DokuWiki PHP плоские файлы, без БД вики-разметка крошечные установки, минимум зависимостей
BookStack PHP MySQL/MariaDB WYSIWYG командам, которым нужна структура книг/глав
Wiki.js Node Postgres (или др.) markdown/WYSIWYG функциональным командным вики
Outline Node Postgres + Redis + S3 блочный редактор документам в стиле Notion
trip2g один бинарник Go SQLite Obsidian авторам Obsidian, которым нужна живая запрашиваемая вики

Каждый из остальных заслуживает своего места. DokuWiki — самый лёгкий, если принять его разметку и устаревший вид. Иерархия полок/книг/страниц BookStack отлична для структурированных руководств. Wiki.js — самая функциональная командная вики. Outline ближе всех к ощущению Notion, если можете держать его стек. Выбирайте trip2g, когда источник истины — хранилище Obsidian и вы хотите, чтобы то же хранилище было вики, доступной для поиска людьми и агентами, на минимуме инфраструктуры.

Что даёт trip2g

  • Один бинарник, один файл. Бинарник trip2g встраивает все фронтенд-ассеты; единственные зависимости хоста — git и CA-сертификаты. Состояние живёт в одной базе SQLite.
  • Obsidian как редактор. Пишете в привычном редакторе; вики-ссылки и frontmatter переносятся. Никакой веб-формы.
  • Поиск встроен. Полнотекстовый (BM25 с морфологией) работает без настройки; семантический — опционально, если добавите ключ эмбеддингов.
  • Контроль доступа. Заметки закрыты по умолчанию; ставьте free: true, чтобы опубликовать, а остальное закройте подписчиками или командой. См. контроль доступа.
  • Запросы от агентов. Та же вики — это MCP-эндпоинт, так что AI-инструменты команды могут искать по ней.
  • HTTPS из коробки. Бинарник сам берёт Let's Encrypt, реверс-прокси для одного сайта не нужен.

Установка (один бинарник)

Полное руководство — в self-hosted развёртывании; вкратце:

  1. Получите бинарник. Скачайте с GitHub Releases или извлеките из Docker-образа:

    docker create --name tmp ghcr.io/trip2g/trip2g && \
      docker cp tmp:/trip2g /usr/local/bin/trip2g && \
      docker rm tmp
    sudo chmod +x /usr/local/bin/trip2g
    
  2. Поставьте две зависимости:

    apt-get update && apt-get install -y git ca-certificates
    
  3. Настройте /etc/trip2g.env: домен, путь к SQLite и сгенерированные секреты. Ключевые строки:

    ACME_DOMAIN=wiki.example.com
    PUBLIC_URL=https://wiki.example.com
    DB_FILE=/var/lib/trip2g/data.sqlite3
    STORAGE_BACKEND=local
    JWT_SECRET=<openssl rand -hex 32>
    DATA_ENCRYPTION_KEY=<openssl rand -hex 16>
    OWNER_EMAIL=you@example.com
    
  4. Запустите под systemd. Бинарник слушает 443 с TLS и редиректит 80. Полный unit-файл — в self-hosted.

  5. Проверьте:

    curl -I https://wiki.example.com/
    

    Ожидается HTTP/2 200 с валидным сертификатом Let's Encrypt. Затем войдите по OWNER_EMAIL и подключите Obsidian по началу работы.

История бэкапа

Поскольку база — один файл, бэкап прост, и эта простота и есть смысл:

  • Снапшоты. SIMPLE_BACKUP=true пишет периодические бэкапы SQLite в объектное хранилище.
  • Непрерывная репликация. Litestream стримит базу в любое S3-совместимое хранилище с интервалом в секунду; в каталоге infra/ есть готовый конфиг. См. self-hosted.

Никакого pg_dump, никакой синхронизации дампа базы с дампом файлового хранилища. Один файл и, по желанию, один стрим.

Честные компромиссы

  • SQLite — однопишущий. Для личной или небольшой командной вики это не проблема: чтения отдают заранее отрендеренный HTML за единицы миллисекунд независимо от размера хранилища (см. производительность). Под большую нагрузку у trip2g есть свой ответ на масштабирование — read-replica (LiteFS плюс проброс записи на лидера): реплика отдаёт чтения локально, а записи форвардит на лидера, вдобавок к непрерывной репликации Litestream. Клиент-серверная база всё же масштабируется дальше при экстремальной конкурентной записи, так что учтите это, если она ожидается.
  • Написание — markdown в Obsidian. Если контрибьюторам нужен браузерный WYSIWYG, BookStack или Wiki.js им подойдут лучше.
  • Это живой сервер. DokuWiki на плоских файлах или статический генератор требуют ещё меньше, если динамика вам вообще не нужна. trip2g оправдывает сервер тем, что даёт вход, пейвол и MCP-эндпоинт, которых у статики нет.

Выбирайте trip2g, когда вики начинается в Obsidian и вы хотите её живой, доступной поиску, с контролем доступа и запрашиваемой агентами — на одном бинарнике и одном файле.

Ещё по теме