Когда документы лежат в десятках PDF, поиск по папке быстро перестаёт помогать. Название файла можно вспомнить, а вот где описаны условия обслуживания, ограничения оборудования или нужный порядок действий — уже сложнее. Хочется задать вопрос всей подборке и получить ответ со ссылкой на источник.
Open Notebook позволяет организовать такую работу на своём сервере. Вы загружаете документы, объединяете их в блокноты, задаёте вопросы, сохраняете заметки и ищете нужные фрагменты. Приложение работает через браузер, а для генерации ответов можно подключить внешний AI-сервис или собственную модель.
Ниже разберём установку на VPS, настройку моделей, обработку обычных и сканированных PDF, а также ошибки, с которыми сталкиваются пользователи: от недоступного API до зависшей индексации и нехватки памяти.
Версия в примерах: Open Notebook 1.14.0, Ubuntu 24.04 LTS, Docker Compose. Для более новых выпусков перед обновлением проверяйте список изменений: названия разделов интерфейса и параметры могут отличаться.
- Какой VPS нужен и потребуется ли видеокарта
- Куда попадают документы
- Установка с доменом и HTTPS
- Настройка AI-моделей
- Первый PDF, сканы и таблицы
- Работа без внешнего AI API через Ollama
- Ошибки и способы их исправить
- Резервные копии и обновление
Что умеет Open Notebook и насколько он заменяет NotebookLM
Open Notebook подходит для работы с инструкциями, учебными материалами, исследованиями, внутренней документацией и другими текстовыми источниками. В него можно добавлять PDF, документы Word, текст, Markdown и веб-страницы. Для аудио, распознавания речи и создания подкастов предусмотрены отдельные возможности и настройки.
По задачам это альтернатива NotebookLM, но интерфейс, качество ответов и работа со ссылками на источники будут зависеть от самого Open Notebook, выбранной модели и качества извлечённого текста. Автоматического переноса всех возможностей Google один в один здесь нет.
Главная причина выбрать Open Notebook — возможность управлять размещением базы документов и подключёнными моделями. За это придётся взять на себя обслуживание приложения: обновления, контроль свободного места, доступ к серверу и резервные копии.
Если нужно изредка разобрать один документ, отдельный VPS может оказаться лишним. Своя установка полезнее, когда подборка постоянно пополняется, к ней нужно возвращаться с разных устройств или есть требования к месту хранения материалов.
Какой VPS нужен для Open Notebook
Сначала определитесь, где будут выполняться AI-запросы. От этого зависит конфигурация сервера.
| Сценарий | С чего начать | Что учитывать |
|---|---|---|
| Текстовые PDF и внешний AI API | 2 vCPU, 4 ГБ RAM, от 40 ГБ SSD/NVMe | На VPS работают приложение, база и обработка файлов. Ответы генерирует внешний провайдер. |
| Регулярная обработка сканов и сложных документов | 4 vCPU, 8 ГБ RAM, от 60 ГБ SSD/NVMe | OCR и разбор структуры документа требуют дополнительной памяти, места и процессорного времени. |
| Open Notebook и небольшая локальная модель на одном VPS | Для первоначальной оценки: 4–8 vCPU, 16 ГБ RAM, от 80 ГБ SSD/NVMe | Дальнейший подбор зависит от модели, её квантования, длины контекста и допустимого времени ответа. |
Это ориентиры для выбора стартовой конфигурации, а не результаты нагрузочного теста. В документации Open Notebook указаны минимум 4 ГБ RAM и рекомендуемые 8 ГБ и больше. Локальные модели и тяжёлая обработка документов добавляют собственные требования.
Видеокарта для самого Open Notebook не обязательна. При работе через внешний API обычного CPU VPS достаточно. Ollama тоже может выполнять запросы на процессоре, но обработка длинных документов будет заметно медленнее. Для регулярной работы с крупной моделью сервер нужно подбирать уже под её требования к RAM или видеопамяти.
На странице VPS HSTQ можно подобрать сервер под выбранную схему. Для начала работы через внешний API смотрите прежде всего на объём памяти, дисковое пространство и возможность запуска Docker. Если планируете Ollama, сначала выберите модель и оцените её требования: покупка дополнительных ядер сама по себе не решает нехватку памяти.
Останутся ли документы только на вашем VPS
Собственный сервер даёт контроль над хранением базы, но маршрут обработки зависит от подключённых сервисов.
- Облачная языковая модель получает текст, который Open Notebook передаёт для ответа, пересказа или другой операции.
- Облачная embedding-модель получает фрагменты документов при создании поискового индекса. Передача может происходить ещё до первого вопроса в чате.
- Внешние сервисы распознавания, озвучивания и извлечения веб-страниц обрабатывают соответствующие материалы по своим правилам.
- Локальные модели и локальная обработка позволяют выполнять эти операции в своей инфраструктуре, если все используемые компоненты действительно настроены на локальные адреса.
Embedding-модель превращает текст в числовое представление для поиска по смыслу. Это отдельная задача: настройка локального чата не делает локальной индексацию, если для embeddings оставлен внешний провайдер.
Исключение документа из контекста конкретного чата также не отменяет его предыдущую обработку через API. Для закрытых материалов заранее проверьте настройки всех этапов: извлечение текста, embeddings, пересказ, чат и аудио.
Ключ OPEN_NOTEBOOK_ENCRYPTION_KEY защищает сохранённые учётные данные AI-провайдеров. Он не шифрует автоматически весь архив PDF, переписку и резервные копии.
Установка Open Notebook на VPS с HTTPS
Используем три контейнера: Open Notebook, базу SurrealDB и Caddy для HTTPS. База будет доступна внутри Docker-сети, а наружу выйдут только веб-порты Caddy. Порт приложения привяжем к localhost для диагностики.
Инструкция рассчитана на отдельный VPS с чистой Ubuntu 24.04 LTS и доступом root или sudo. Если на сервере уже работают сайты, Nginx, Apache или панель управления, сначала согласуйте использование портов 80 и 443: второй веб-сервер не сможет занять их одновременно.
1. Подготовьте домен
Создайте A-запись, например notebook.example.com, указывающую на IPv4 VPS. Если добавлена AAAA-запись, IPv6 тоже должен вести на этот сервер и принимать соединения. Ошибочная AAAA-запись может мешать открытию сайта и выпуску сертификата.
Разрешите входящие TCP-соединения на порты 80 и 443 в используемом сетевом фильтре. SSH оставьте доступным на своём рабочем порту. Для первоначальной настройки через Cloudflare проще использовать режим DNS only, чтобы проверить прямое соединение с VPS.
Во всех следующих примерах замените notebook.example.com на свой домен.
2. Установите Docker Engine и Compose
Подключитесь к VPS по SSH. Если вход выполнен обычным пользователем с sudo, перейдите в административную оболочку:
sudo -i
Следующие команды предназначены именно для Ubuntu 24.04:
apt update
apt install -y ca-certificates curl openssl nano
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
cat > /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: noble
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF
apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
systemctl enable --now docker
docker compose version
Последняя команда должна показать версию Docker Compose. Если Docker уже установлен и работает, повторная установка не нужна. Для другой ОС используйте инструкцию Docker для своего дистрибутива: строка Suites: noble относится к Ubuntu 24.04.
3. Создайте каталог и секреты
mkdir -p /opt/open-notebook
cd /opt/open-notebook
umask 077
mkdir -p notebook_data surreal_data caddy_data caddy_config
cat > .env <<EOF
API_URL=https://notebook.example.com
OPEN_NOTEBOOK_PASSWORD=$(openssl rand -hex 24)
OPEN_NOTEBOOK_ENCRYPTION_KEY=$(openssl rand -hex 32)
SURREAL_PASSWORD=$(openssl rand -hex 32)
EOF
chmod 600 .env
Команда создаёт разные случайные значения для входа в приложение, шифрования API-ключей и доступа к базе. Откройте файл командой nano .env, проверьте домен и сохраните значения в защищённом хранилище паролей.
Этот блок выполняют один раз при новой установке. Повторное выполнение перезапишет секреты. При потере или замене ключа шифрования приложение не сможет прочитать ранее сохранённые API-ключи.
4. Создайте compose.yaml
В каталоге /opt/open-notebook выполните nano compose.yaml и вставьте:
services:
surrealdb:
image: surrealdb/surrealdb:v2
user: root
command: ["start", "--log", "info", "--user", "root", "--pass", "${SURREAL_PASSWORD:?Set SURREAL_PASSWORD}", "rocksdb:/mydata/mydatabase.db"]
volumes:
- ./surreal_data:/mydata
restart: unless-stopped
open_notebook:
image: lfnovo/open_notebook:1.14.0
ports:
- "127.0.0.1:8502:8502"
environment:
API_URL: ${API_URL:?Set API_URL}
CORS_ORIGINS: ${API_URL:?Set API_URL}
OPEN_NOTEBOOK_PASSWORD: ${OPEN_NOTEBOOK_PASSWORD:?Set password}
OPEN_NOTEBOOK_ENCRYPTION_KEY: ${OPEN_NOTEBOOK_ENCRYPTION_KEY:?Set encryption key}
SURREAL_URL: ws://surrealdb:8000/rpc
SURREAL_USER: root
SURREAL_PASSWORD: ${SURREAL_PASSWORD:?Set SURREAL_PASSWORD}
SURREAL_NAMESPACE: open_notebook
SURREAL_DATABASE: open_notebook
OPEN_NOTEBOOK_WORKER_MAX_TASKS: "1"
OPEN_NOTEBOOK_EMBEDDING_BATCH_SIZE: "8"
OPEN_NOTEBOOK_ENABLE_DOCLING: "false"
volumes:
- ./notebook_data:/app/data
depends_on:
- surrealdb
restart: unless-stopped
caddy:
image: caddy:2
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- ./caddy_data:/data
- ./caddy_config:/config
depends_on:
- open_notebook
restart: unless-stopped
Здесь выбран конкретный образ lfnovo/open_notebook:1.14.0. У номера Docker-тега нет буквы v. Для SurrealDB используется ветка v2, как в конфигурации проекта; самостоятельно заменять её на новую основную версию базы не нужно.
Обработка фоновых задач ограничена одной задачей одновременно, а пакет embeddings уменьшен до восьми фрагментов. Это консервативные настройки для первого запуска: они снижают пиковую нагрузку. После проверки своей подборки документов их можно пересмотреть.
Порты SurrealDB и API отдельно не публикуются. Современная схема Open Notebook позволяет направлять веб-запросы на порт 8502: приложение само передаёт запросы API внутреннему сервису.
5. Настройте Caddy
Создайте файл /opt/open-notebook/Caddyfile:
notebook.example.com {
request_body {
max_size 100MB
}
reverse_proxy open_notebook:8502 {
transport http {
read_timeout 600s
write_timeout 600s
}
}
}
Caddy автоматически получает и продлевает HTTPS-сертификат, когда домен правильно настроен и сервер доступен для проверки. В API_URL и Caddyfile должен быть один и тот же домен. В конец API_URL не добавляйте /api.
6. Запустите приложение и проверьте соединение
cd /opt/open-notebook
docker compose config -q
docker compose pull
docker compose up -d
docker compose ps
docker compose logs --tail=100 open_notebook
Если docker compose config -q завершился без сообщения об ошибке, синтаксис конфигурации принят. Это ещё не проверка работоспособности приложения.
Проверьте API из контейнера:
docker compose exec -T open_notebook curl -fsS http://127.0.0.1:5055/health
Ожидаемый ответ:
{"status":"healthy"}
Он означает, что процесс API отвечает. Подключение AI-моделей, обработку PDF и поиск проверим отдельно.
Откройте https://notebook.example.com и введите значение OPEN_NOTEBOOK_PASSWORD из файла .env. Затем проверьте страницу в приватном окне браузера: приложение должно снова запросить пароль.
Если меняете переменные в .env или Compose, применяйте изменения командой:
docker compose up -d
Обычный docker compose restart не подхватывает изменённое окружение контейнера.
Настройка моделей: почему одного API-ключа недостаточно
У работающего приложения ещё нет модели, которая будет отвечать на вопросы. Для полноценного поиска по документам нужно настроить две роли:
- Языковая модель, или Chat Model: отвечает на вопросы, сравнивает материалы, делает пересказ.
- Embedding Model: создаёт индекс для поиска по смыслу.
Эти модели могут принадлежать разным провайдерам. Не каждый сервис, который умеет генерировать текст, предоставляет embeddings.
В версии 1.14.0 откройте Settings → API Keys. В более новых интерфейсах настройки могут быть объединены в разделе Models.
- Добавьте учётные данные через Add Credential или форму добавления конфигурации выбранного провайдера.
- Укажите API-ключ либо адрес локального сервиса и выполните Test Connection.
- Получите список через Discover Models и зарегистрируйте нужные модели.
- В назначениях по умолчанию выберите модель чата и embedding-модель.
Для текстовых документов распознавание речи и озвучивание настраивать не нужно. Дополнительные языковые назначения можно оставить с предусмотренным приложением переходом к модели чата.
Успешная проверка соединения подтверждает доступ к провайдеру, но не заменяет реальный запрос выбранной модели. Проверьте короткий вопрос в чате, а затем загрузку и поиск по маленькому документу.
Если используете внешний API, заранее убедитесь, что у ключа есть доступ к нужной модели, доступен баланс или квота, а запросы разрешены с адреса и из региона вашего VPS.
Как загрузить PDF и убедиться, что приложение действительно его прочитало
Первый тест лучше провести на небольшом текстовом PDF, содержание которого вы знаете. Подойдёт инструкция на несколько страниц. Большой архив оставьте до завершения проверки.
- Создайте блокнот и добавьте файл через Add Source.
- Включите создание embeddings для поиска, если приложение предлагает этот выбор.
- Дождитесь обработки и откройте содержимое источника.
- Проверьте, что извлечённый текст содержит нужные разделы, числа и русские символы.
- Убедитесь, что источник получил embeddings. Обработка текста и построение индекса могут завершаться в разное время.
- Найдите известный фрагмент через поиск, затем задайте вопрос по нему.
Например:
Какой срок хранения резервных копий указан в документе? Приведи подтверждающую цитату. Если срок не указан, напиши об этом прямо.
После ответа откройте источник и сравните формулировку с оригиналом. Дополнительно спросите о факте, которого в документе нет. Так проще заметить, когда модель начинает дополнять материал своими предположениями.
Для рабочих файлов используйте понятные названия: тема, версия и дата. Две противоречащие друг другу редакции инструкции без обозначений будут мешать и человеку, и поиску.
Что делать со сканами
Попробуйте выделить и скопировать текст из исходного PDF. Если страница содержит только изображение, потребуется OCR — распознавание текста.
В стандартном образе тяжёлый движок Docling включается отдельно. В compose.yaml измените:
OPEN_NOTEBOOK_ENABLE_DOCLING: "true"
Примените настройку и посмотрите журнал:
docker compose up -d open_notebook
docker compose logs -f open_notebook
При первом запуске будут скачиваться дополнительные зависимости. Это может занять несколько минут и потребовать заметного объёма диска. Если установка зависимостей не завершилась, приложение может открываться, но Docling останется недоступным.
После установки откройте Settings → Content Processing, выберите обработку документов через docling и включите OCR. Затем заново добавьте проблемный файл: изменение движка не переписывает автоматически текст уже обработанных источников.
Проверьте небольшой фрагмент скана. Если русские буквы распознаются плохо, поможет более качественный исходник или предварительное OCR с поддержкой русского языка. Загружать нужно уже результат с корректным текстовым слоем.
Таблицы, формулы и документы в несколько колонок
Обычное извлечение текста может перепутать порядок строк и колонок. Docling предназначен в том числе для разбора сложной структуры, но результат всё равно нужно проверить на одном характерном примере.
Если в таблице переставились значения, более мощная языковая модель не восстановит надёжно исходные связи. Сначала исправьте извлечение: попробуйте другой движок, подготовьте текстовую версию таблицы или выделите нужный раздел в отдельный файл.
Для точных расчётов по большим таблицам используйте инструменты обработки данных. Ответ в чате удобен для объяснения, но не заменяет проверяемый расчёт.
Когда использовать Chat, а когда Ask
В Open Notebook эти режимы работают по-разному. Это влияет и на качество ответа, и на расход токенов.
Chat получает выбранный контекст. Для источника можно передать полный текст, только созданные по нему материалы Insights или исключить его из чата. Если включить десятки больших документов целиком, запрос может превысить контекст модели.
Ask использует поиск по базе и собирает ответ из найденных фрагментов. Такой режим удобнее, когда документов много и вы пока не знаете, где искать нужное место. Поиск может пропустить важный фрагмент, поэтому полноту ответа тоже нужно проверять.
Практический порядок работы: сначала найдите нужные материалы через поиск или Ask, затем откройте небольшой набор источников в Chat для подробного разбора. Если важна конкретная формулировка, передавайте полный текст соответствующего документа.
Запрос «расскажи о документе» обычно даёт менее полезный результат, чем конкретная задача:
Сравни требования к резервному копированию в этих двух инструкциях. Для каждого различия укажи документ и подтверждающую цитату. Отдельно перечисли требования, которые есть только в одной инструкции.
Ссылка на источник помогает проверить ответ, но сама по себе не гарантирует его правильность. Особенно внимательно сверяйте числа, единицы измерения, условия и исключения.
Как подключить Ollama и работать без внешнего AI API
Для локальной схемы добавьте Ollama в тот же Compose-проект. Следующий блок нужно вставить внутрь services, на одном уровне с surrealdb, open_notebook и caddy:
ollama:
image: ollama/ollama:latest
volumes:
- ./ollama_data:/root/.ollama
restart: unless-stopped
Порт Ollama наружу не публикуется: Open Notebook будет обращаться к нему по внутренней Docker-сети.
Запустите сервис и скачайте модели. Пример пары для первоначальной проверки — небольшая языковая модель Qwen3 и многоязычная embedding-модель BGE-M3:
docker compose up -d ollama
docker compose exec ollama ollama pull qwen3:4b
docker compose exec ollama ollama pull bge-m3
docker compose exec ollama ollama list
В настройках Open Notebook добавьте провайдера Ollama и укажите Base URL:
http://ollama:11434
Выполните проверку соединения, обнаружение и регистрацию моделей. Qwen3 назначьте для чата, BGE-M3 — для embeddings. При ручном вводе используйте точное имя из ollama list, включая тег после двоеточия.
Адрес localhost внутри контейнера указывает на этот контейнер. Поэтому http://localhost:11434 не подходит, когда Ollama запущена отдельным сервисом.
Если Ollama уже работает непосредственно на Linux-хосте, потребуется доступ из Docker к хосту: сопоставление host.docker.internal:host-gateway и адрес прослушивания Ollama, доступный контейнерам. Для новой установки проще оставить оба приложения в одной Docker-сети.
В старых руководствах встречается OLLAMA_BASE_URL. Open Notebook эту переменную не читает. При настройке через окружение используется OLLAMA_API_BASE, но в описанной установке адрес удобнее сохранить через интерфейс.
Приведённая конфигурация Ollama использует CPU. Для NVIDIA GPU потребуется отдельная настройка драйвера, NVIDIA Container Toolkit и доступа контейнера к видеокарте. Наличие GPU у физического сервера не означает, что он автоматически доступен вашему VPS.
Ошибки установки и обработки документов
Перед изменениями посмотрите состояние контейнеров и последние сообщения:
cd /opt/open-notebook
docker compose ps -a
docker compose logs --tail=150 open_notebook surrealdb caddy
docker stats --no-stream
free -h
df -h
Эти проверки помогают разделить разные ситуации: приложение не запустилось, закончилась память, переполнен диск, недоступна база или отказал AI-провайдер. При передаче журнала в поддержку удаляйте API-ключи, пароли и фрагменты закрытых документов.
Страница открывается, но появляется «Unable to connect to server»
Проверьте адрес, который фронтенд выдаёт браузеру:
curl -fsS https://notebook.example.com/config
Для нашей схемы ожидается:
{"apiUrl":"https://notebook.example.com"}
Если там localhost, внутреннее имя контейнера, HTTP вместо HTTPS или ненужный порт 5055, исправьте API_URL в .env, выполните docker compose up -d и обновите страницу.
При сообщении Mixed Content браузер пытается обратиться из HTTPS-страницы к HTTP API. Исправление — согласовать адреса и протокол, а не отключать защиту браузера.
502 Bad Gateway или приложение постоянно перезапускается
Сначала проверьте локальный веб-порт:
curl -I http://127.0.0.1:8502
Если он отвечает, а домен показывает 502, проверьте журнал Caddy и адрес open_notebook:8502 в Caddyfile. Если локальный порт не отвечает, причина находится в приложении или его запуске.
При ошибке подключения к базе проверьте контейнер SurrealDB. В нашей конфигурации адрес базы — ws://surrealdb:8000/rpc. Значение localhost здесь указывало бы на неправильный контейнер.
Ошибку аутентификации базы нужно отличать от ошибки записи на диск. В первом случае проверяйте учётные данные и исходный .env, особенно после восстановления. Во втором — владельца и права каталога surreal_data. Не исправляйте обе ситуации выдачей прав 777: это не устраняет неверный пароль или путь.
HTTPS не выпускается или домен не открывается
Проверьте A- и AAAA-записи, доступность портов 80/443 и журнал:
docker compose logs --tail=100 caddy
Если порт уже занят, найдите процесс:
ss -ltnp
При существующем Nginx или панели управления подключайте приложение к уже работающему обратному прокси либо используйте отдельный VPS. Если используется Cloudflare, сначала проверьте работу с DNS only; настройки внешнего прокси разбирайте после успешного прямого подключения.
PDF загрузился, но текст пустой или нечитаемый
Откройте извлечённый текст источника. Если нужной информации нет уже там, проблема возникла до обращения к языковой модели.
Для скана включите Docling и OCR. Для PDF с паролем подготовьте разрешённую к обработке копию без пароля. Если цифровой PDF копируется в виде бессмысленных символов, попробуйте повторный экспорт из исходной программы или OCR.
После исправления заново обработайте документ и ещё раз проверьте текст. Менять модель чата на этом этапе обычно бесполезно.
Документ остаётся в Processing или Pending
Извлечение текста, индексация и другие длительные операции выполняются фоновым worker-процессом. Сам факт открытия сайта не подтверждает, что worker работает.
docker compose top open_notebook
docker compose logs --tail=200 open_notebook
В списке процессов должен присутствовать surreal-commands-worker. В журнале ищите сообщения об обработке задания и конкретную причину повторных попыток: недоступность модели, лимит запросов, нехватку памяти или слишком длинный входной текст.
Если worker завершился, сначала устраните причину, затем перезапустите приложение. Для источника с ошибкой используйте Retry processing, когда такая кнопка доступна. Не загружайте один и тот же файл многократно, пока первоначальное задание ещё выполняется.
Ошибка 413: файл слишком большой
У этой ошибки есть два разных сценария.
Загрузка обрывается до появления источника. Проверьте ограничения на всём пути: внешний прокси или CDN, Caddy, внутренний прокси Next.js и API приложения. В приведённой схеме ориентир — около 100 МБ на запрос; файл вплотную к лимиту может не пройти из-за служебных данных загрузки.
Для первого решения разделите документ по главам или уменьшите размер изображений. Изменение только OPEN_NOTEBOOK_MAX_UPLOAD_SIZE_MB не убирает остальные ограничения. В версии 1.14.0 у внутреннего прокси Next.js также задан предел 100 МБ.
Файл загрузился, но 413 появляется при создании embeddings. Тогда слишком большой запрос мог отклонить AI-провайдер. Увеличение лимита Caddy не поможет. Уменьшите OPEN_NOTEBOOK_EMBEDDING_BATCH_SIZE, например до 4, примените Compose и повторите индексацию. В примере статьи уже используется уменьшенный пакет из восьми фрагментов.
«Failed to send message» или «Model is not a LanguageModel»
Проверьте назначение модели чата. Зарегистрированная embedding-модель не может выполнять её роль.
Если модель ранее удалили, переименовали или заменили у провайдера, заново обнаружьте доступные модели и обновите назначение по умолчанию. Для Ollama сравните имя с ollama list: qwen3 и qwen3:4b нельзя считать взаимозаменяемыми обозначениями.
Проверьте короткий вопрос без документов. Если он работает, а вопрос с PDF — нет, переходите к проверке размера контекста и извлечённого текста.
Поиск по смыслу ничего не находит
Сначала проверьте, что назначена embedding-модель и у источника включена индексация. Если источник отмечен как Not Embedded, запустите создание embeddings и дождитесь результата.
Затем сравните текстовый и векторный поиск. Если нужная фраза находится по словам, но не по смыслу, проверьте ошибки индексации и пригодность embedding-модели для языка документов.
После смены embedding-модели старый индекс нужно перестроить через Advanced → Rebuild Embeddings. Векторы разных моделей нельзя смешивать даже при одинаковом количестве измерений. Проверьте, какие источники, заметки и Insights включены в перестроение, и учитывайте возможную повторную оплату API-запросов.
«Context length exceeded» или «Input too long»
Размер PDF в мегабайтах не равен объёму текста, который должна принять модель. Небольшой файл может содержать сотни страниц текста.
Если ошибка появляется в Chat, оставьте в полном контексте только нужные документы, сократите историю разговора или начните новый чат. Для большого архива сначала используйте поиск или Ask.
Если ошибка возникает именно у embedding-модели, уменьшите размер отдельного фрагмента. Для проверки можно добавить в environment сервиса Open Notebook:
OPEN_NOTEBOOK_CHUNK_SIZE: "256"
OPEN_NOTEBOOK_CHUNK_OVERLAP: "32"
В этой версии значения задаются в токенах. После применения настроек повторите создание embeddings. Уменьшение размера пакета помогает при слишком большом запросе целиком, но не исправляет отдельный фрагмент, который превышает контекст embedding-модели.
401, 403 или 429 от AI-провайдера
- 401: проверьте ключ, его актуальность и правильность выбранного провайдера.
- 403: прочитайте текст ответа сервиса. Возможны ограничения доступа к модели, аккаунту, адресу или региону.
- 429: проверьте лимит запросов и доступную квоту. Снизьте параллельность и повторите запрос после предусмотренной провайдером паузы.
Отдельно различайте 401 самого Open Notebook и 401 внешнего сервиса. Например, обращение к защищённому API приложения без входа может законно вернуть Missing authorization header; это не означает, что повреждён AI-ключ.
LM Studio проходит проверку, но чат выдаёт ошибку шаблона
Сообщение вроде Only user and assistant roles are supported указывает на несовместимость формата сообщений с chat template модели. Такое поведение обсуждали пользователи Open Notebook: проверка соединения проходила, а полноценный запрос завершался ошибкой.
Проверьте выбранный в LM Studio шаблон диалога и его соответствие конкретной модели. Попробуйте штатный шаблон этой модели или другую совместимую instruct/chat-модель. Переустановка базы и изменение портов такую ошибку не исправляют.
Ответы слишком медленные, запрос обрывается или контейнер завершился с кодом 137
На CPU локальная модель может долго обрабатывать даже первый запрос. Сначала посмотрите загрузку процессора, память и журнал Ollama:
docker stats --no-stream
docker compose logs --tail=100 ollama
Код 137 сам по себе ещё не доказывает нехватку памяти. Для контейнера Open Notebook проверьте признак OOM:
docker inspect "$(docker compose ps -aq open_notebook)" --format '{{.State.OOMKilled}}'
Если получено true, уменьшите модель, длину контекста или количество одновременно выполняемых операций. При постоянной нехватке памяти увеличьте RAM. Swap может смягчить отдельный пик, но активная работа модели через swap будет медленной.
Если процесс продолжает работать, а запрос обрывается примерно через одинаковый интервал, проверяйте тайм-ауты каждого звена. В нашей конфигурации Caddy ждёт до 600 секунд. Для медленной языковой модели можно увеличить ESPERANTO_LLM_TIMEOUT, например до 300 секунд. Увеличение ожидания имеет смысл после проверки, что модель действительно выполняет запрос.
После переноса перестали работать сохранённые API-ключи
Проверьте OPEN_NOTEBOOK_ENCRYPTION_KEY. Он должен совпадать с ключом исходной установки. Генерация нового значения не расшифрует старые данные.
Если исходный ключ утрачен, учётные данные провайдеров придётся сохранить заново и проверить связанные модели. Документы и база при этом требуют отдельной проверки: ошибка расшифровки API-ключа не означает автоматическую потерю всех материалов.
Как делать резервные копии и обновляться
В описанной установке данные находятся в нескольких каталогах. surreal_data содержит базу, а notebook_data — файловые данные приложения. Рядом сохраняются настройки Compose и Caddy. Исходные документы полезно хранить отдельно: рабочую базу AI не стоит делать единственным архивом.
Для небольшой личной установки простой вариант — согласованная копия с короткой остановкой сервисов. Выполняйте её, когда нет активной обработки:
cd /opt/open-notebook
umask 077
mkdir -p /opt/open-notebook-backups
docker compose stop
tar -czf /opt/open-notebook-backups/notebook-$(date +%F-%H%M%S).tar.gz \
notebook_data surreal_data caddy_data caddy_config compose.yaml Caddyfile
docker compose start
Проверьте, что tar завершился без ошибок. Перенесите архив в защищённое хранилище вне этого VPS. Копия на том же диске не поможет при потере сервера.
Файл .env в этот архив не включён намеренно. Сохраните его отдельно в зашифрованном хранилище: для восстановления нужны прежние ключ шифрования, пароль приложения и пароль базы.
На новом сервере установите Docker, восстановите каталоги в /opt/open-notebook, верните исходный .env с правами 600 и запустите ту же конфигурацию. При необходимости измените домен одновременно в API_URL и Caddyfile.
После восстановления откройте старый блокнот, проверьте документ, выполните поиск и задайте вопрос. Само наличие архива ещё не подтверждает, что из него можно восстановить рабочую систему.
Перед обновлением:
- Прочитайте примечания к выбранному выпуску и сделайте резервную копию.
- Зафиксируйте используемые версии образов; для точного повторения окружения сохраните также их RepoDigests.
- Замените тег Open Notebook в
compose.yamlна выбранный стабильный выпуск. - Обновите контейнер и проверьте старый блокнот, новую загрузку, поиск и чат.
docker compose pull open_notebook
docker compose up -d open_notebook
docker compose logs --tail=100 open_notebook
При откате учитывайте миграции базы: старый образ может быть несовместим с уже изменёнными данными. Надёжное восстановление требует соответствующих друг другу версии приложения и копии данных.
Сколько стоит собственный Open Notebook
Сам проект открыт и распространяется по лицензии MIT. Расходы складываются из VPS, резервного хранения и выбранной обработки.
При внешнем API отдельно оплачиваются генерация ответов, embeddings и, если используются, распознавание речи или озвучивание. Большая загрузка архива создаёт расходы на индексацию; повторная индексация может создать их снова. Передача полных документов в Chat увеличивает объём входного текста.
У локальной схемы нет оплаты за каждый запрос к внешней модели, но нужен сервер с достаточными ресурсами. Поэтому сравнивайте стоимость подходящего оборудования с реальным расходом API, а не только цену самого дешёвого VPS.
Для оценки загрузите небольшую характерную подборку, выполните обычные рабочие запросы и посмотрите фактическое потребление ресурсов и API. По этому тесту проще выбрать конфигурацию, чем по количеству PDF в папке.
Частые вопросы
Можно ли пользоваться без домена?
Да, через SSH-туннель. В .env задайте API_URL=http://localhost:8502. Запустите только базу и приложение:
docker compose up -d surrealdb open_notebook
Если Caddy уже был запущен, остановите его командой docker compose stop caddy. На своём компьютере откройте туннель, заменив пользователя и IP:
ssh -N -L 8502:127.0.0.1:8502 user@SERVER_IP
После этого откройте http://localhost:8502. Окно SSH должно оставаться открытым. Порт приложения при такой схеме не требуется публиковать в интернете.
Можно ли дать доступ нескольким сотрудникам?
В рассматриваемой версии Open Notebook ориентирован на одного пользователя. Общий пароль не создаёт отдельные личные кабинеты и разграничение документов по сотрудникам. Для изолированных наборов данных используйте отдельные экземпляры приложения или систему с подходящей моделью доступа.
Работает ли поиск с русскими документами?
Да, если текст корректно извлечён, а выбранные языковая и embedding-модели поддерживают русский. Проверяйте весь путь: OCR, поиск по словам, поиск по смыслу и ответ с подтверждением из источника.
Можно ли работать полностью без интернета?
Локальная обработка возможна после подготовки всех компонентов, но первоначальное скачивание Docker-образов, моделей и дополнительных OCR-зависимостей требует доступа к соответствующим ресурсам. Импорт веб-страниц и облачные API без сети работать не будут.
Почему веб-страница добавляется пустой?
Причиной может быть JavaScript, авторизация или ограничение автоматического доступа. Для JavaScript-страниц можно включить локальный Crawl4AI через OPEN_NOTEBOOK_ENABLE_CRAWL4AI=true и выбрать его в настройках обработки. Если нужен один материал, часто проще добавить доступный вам текст вручную.
Можно ли создавать аудиопересказ документов?
Да, но для этого дополнительно настраивают модель озвучивания и параметры выпуска. Распознавание речи требуется для загрузки аудио, а не для чтения текстового PDF. Провайдеры аудио тоже входят в цепочку обработки данных и могут создавать отдельные расходы.
Как понять, что установка готова к работе
Проверьте весь сценарий на своём документе: вход с паролем, корректное извлечение текста, завершённую индексацию, поиск нужного фрагмента и ответ, который подтверждается оригиналом. Затем перезапустите контейнеры и убедитесь, что блокнот сохранился.
После этого загрузите небольшую рабочую подборку и проверьте резервное восстановление. Когда эти шаги проходят без ошибок, можно переносить остальной архив и подбирать модели уже по качеству ответов на ваши задачи.