From "Works on My Machine" to Works for the Whole Team.
100+ pages. Full deploy configs. 30+ error fixes. Monitoring, CI/CD. Every fix copy-paste ready.
Who This Is For
What's Inside
10 chapters. Free preview: Ch 0-1. Paid manual: Ch 2-8. PDF + Markdown. Every config is copy-paste ready. Every error has an exact fix — not "check your settings," but "run this command."
- Ch 2: Model Strategy — Per-task model routing (chat vs embedding vs TTS). Cost-optimized configs from $0 to $150/month. Ollama tuning by VRAM.
- Ch 3: Reverse Proxy, TLS & Auth — nginx with HTTP/2, WebSocket, Let's Encrypt. Three-layer auth (password, basic auth, OAuth2). fail2ban brute-force protection.
- Ch 4: Production Deployment — systemd service, split Ollama+App architecture via Tailscale. K8s patterns. Hetzner/AWS/GCP cloud recipes with monthly cost estimates.
- Ch 5: Data Management & Backup — Automated daily backups with rclone off-site (B2/S3/Drive). Tested disaster recovery procedure. Data pruning and migration scripts.
- Ch 6: Multi-User & Team Setup — Per-team instance isolation. OAuth2 proxy with per-user identity. Cost allocation tracking. Offboarding scripts.
- Ch 7: API-Driven Workflows & Automation — Full REST API reference. Python batch ingestion and podcast automation. n8n and Zapier recipes. Custom frontend example (Flask).
- Ch 8: Monitoring & Maintenance — Prometheus + Grafana stack with 6 alert rules. Loki log management. Update/rollback strategy. Weekly/monthly/quarterly maintenance checklists.
What This Is Not
- ✗ Not an official lfnovo/Google product. This is independent community work. No affiliation, no endorsement.
- ✗ Not a "magic fix" for every setup. Open Notebook works with 18+ AI providers across different OS/GPU combos. We cover the 3 most common stacks (Ubuntu + Ollama, macOS + Cloud API, Debian + Docker). Edge cases may need adaptation.
- ✗ Not a video course. It's text — PDF + Markdown. Written for developers who prefer Ctrl+F over scrubbing a timeline.
Why Not Just Read the GitHub Issues?
You can. But the relevant information is scattered across 200+ issues, 50+ discussions, and 4 community forums. The Production Manual organizes, verifies, and writes the fix for each one — with exact commands tested on Ubuntu 24.04, Debian 12, and macOS.
It's the difference between:
- Searching GitHub issues for "Ollama connection error" → finding 15 threads → trying 6 different fixes → one works → 2 hours
- Opening the manual → Ctrl+F "Connection error" → copy-paste the fix → 2 minutes
Free Preview — Read Chapters 0 & 1
No email. No signup. Just open and read. If these chapters don't convince you this manual is worth $19, nothing will.
Chapter 0: Is Open Notebook Right for You? — 7 min read
Open Notebook is an open-source, self-hosted alternative to Google NotebookLM. It ingests documents (PDFs, URLs, YouTube transcripts, audio), indexes them with embeddings, and lets you chat with your content — plus generate multi-speaker AI podcasts. It supports 18+ AI providers instead of just Gemini, has no 50-source limit, and can run entirely offline.
The question isn't whether it's good. The question is whether you should deploy it.
The 2-Minute Test
mkdir open-notebook && cd open-notebook curl -O https://raw.githubusercontent.com/lfnovo/open-notebook/main/docker-compose.yml # Change the encryption key to your own secret string sed -i 's/change-me-to-a-secret-string/a-random-string-you-pick-now/' docker-compose.yml docker compose up -d
Open http://localhost:8502. On first run, Docker downloads the images (~30 seconds to 2 minutes depending on your connection). Once the interface appears, you've deployed Open Notebook.
The Honest Comparison
| Dimension | Open Notebook | NotebookLM |
|---|---|---|
| Data privacy | Full local mode (Ollama). Cloud APIs see query text only. | Everything on Google's servers. |
| Setup time | 2 min Docker (cloud API). 15-30 min (Ollama). 1-2 hrs (production). | 0 min. Sign in. |
| AI providers | 18+ (OpenAI, Claude, Ollama, Groq, DeepSeek, ElevenLabs...) | Gemini only. |
| Source limits | No hard cap. Storage + context window only. | 50 sources per notebook. 500K words per source. |
| Podcast generation | 1-4 speakers. Custom voice profiles. Editable prompts. | 2 speakers. "Live host" mode. |
| API access | Full REST API on port 5055. | None. |
| Citations | Basic (acknowledged weakness). | Excellent. Exact passages highlighted. |
| Cost | $0-$30/user/month (API) or $0 (Ollama) + infra. | Free tier. Plus: ~$20/month/user. |
| Offline | Yes, with Ollama. | No. |
vs AnythingLLM
AnythingLLM (also open source) is similar — but Open Notebook's podcast/audio overview feature is the differentiator. If you don't need podcast generation, AnythingLLM has a more polished UI and easier setup. If you do need podcasts, Open Notebook is the clear winner.
vs PrivateGPT
PrivateGPT focuses on document Q&A with guaranteed local processing. It's lighter but has no podcast feature, no multi-model routing, and a more basic UI. Open Notebook is the full research workspace; PrivateGPT is the focused document chatbot.
Who Should Self-Host
Do it if:
- You handle sensitive documents (legal, medical, proprietary code) and can't upload them to Google
- You want API access to automate document processing in your workflow
- You've hit NotebookLM's 50-source cap and still have 100 more papers to ingest
- You need podcasts with more than 2 speakers or custom voice profiles
- You want to use Claude or GPT-4o for analysis quality that Gemini can't match
- You're building a product and need a white-label document AI backend
Skip it if:
- You use NotebookLM casually and have no compliance requirements
- You don't want to spend 1-2 hours on initial setup and ongoing maintenance
- You need production-quality citations (Open Notebook's citations are basic)
- You just need a chatbot for a few PDFs (use ChatGPT file upload or Claude Projects)
The $0 vs $30 vs $150 Setup
| $0/month | $30/month | $150/month | |
|---|---|---|---|
| Chat model | Ollama (gpt-oss:20b) | Groq (llama-3.3-70b) | Claude Sonnet |
| Embedding | Ollama (nomic-embed-text) | OpenAI (text-embedding-3-small) | Same |
| Podcast TTS | Offline (no podcasts) | ElevenLabs | ElevenLabs |
| Good for | Solo privacy use | Solo/2-person, good quality | Full team, best quality |
| GPU needed | Yes (12GB+ VRAM) | No | No |
Note: Groq offers a generous free tier — most solo users won't hit $30/month under normal usage. The $30 figure is a conservative ceiling.
Chapter 1: Docker Deep Dive — From docker compose up to a Solid Foundation — 15 min read
Chapter 0 gave you a 2-minute quickstart. This chapter explains every single line you just ran, so when something breaks at 2 AM, you know exactly where to look.
The Full docker-compose.yml — Line by Line
Here's the actual compose file from lfnovo/open-notebook, annotated:
services:
# ── SERVICE 1: SurrealDB (Database) ──
surrealdb:
image: surrealdb/surrealdb:v2
command: start --log info \
--user ${SURREAL_USER:-root} \
--pass ${SURREAL_PASSWORD:-root} \
rocksdb:/mydata/mydatabase.db
user: root # Required for bind mounts on Linux
ports:
- "8000:8000"
volumes:
- ./surreal_data:/mydata # All notebooks, notes, chat history
environment:
- SURREAL_EXPERIMENTAL_GRAPHQL=true
restart: always
pull_policy: always
# ── SERVICE 2: Open Notebook App ──
open_notebook:
image: lfnovo/open_notebook:v1-latest
ports:
- "8502:8502" # Web UI
- "5055:5055" # REST API
volumes:
- ./notebook_data:/app/data # Uploaded files, processed docs
environment:
# REQUIRED: Change this to your own secret string
- OPEN_NOTEBOOK_ENCRYPTION_KEY=change-me-to-a-secret-string
# Database connection
- SURREAL_URL=ws://surrealdb:8000/rpc
- SURREAL_USER=${SURREAL_USER:-root}
- SURREAL_PASSWORD=${SURREAL_PASSWORD:-root}
- SURREAL_NAMESPACE=open_notebook
- SURREAL_DATABASE=open_notebook
depends_on:
- surrealdb
restart: always
pull_policy: always
- No
version:key — Docker Compose V2 doesn't need it. - DB service starts first (
depends_on), but the app retries internally on startup. user: rooton SurrealDB is intentional — Linux bind mounts default to root ownership.- No AI provider keys here. Configure them via the UI at Settings → API Keys. The old env-var approach is deprecated.
What Each Volume Actually Stores
| Path | Contents | Backup Priority |
|---|---|---|
./surreal_data/ | Every notebook, note, chat message, source metadata | CRITICAL |
./notebook_data/ | Raw uploaded files (PDFs, audio), processed chunks | HIGH |
You can delete ./notebook_data/ and re-upload documents without losing your research structure. You absolutely cannot delete ./surreal_data/.
The Networking Model
Inside Docker's default bridge network, services reach each other by container name:
open_notebook → surrealdb via ws://surrealdb:8000/rpc ← Docker DNS open_notebook → ollama via http://ollama:11434 ← Docker DNS your browser → open_notebook via http://localhost:8502 ← Host port mapping
http://ollama:11434 — not http://localhost:11434. Inside the container, localhost points to the container itself.
Adding Ollama to the Stack
ollama:
image: ollama/ollama:latest
container_name: open-notebook-ollama
ports:
- "11434:11434"
volumes:
- ./ollama_data:/root/.ollama
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
restart: always
pull_policy: always
If you're on CPU-only or Apple Silicon, remove the entire deploy.resources block.
The First-Run Checklist
# 1. All services running? docker compose ps # 2. Web UI accessible? curl -I http://localhost:8502 # 3. API responding? curl http://localhost:5055/api/health # 4. Database connected? docker compose logs surrealdb | grep -i "started" # 5. Ollama model loaded (if using Ollama)? curl http://localhost:11434/api/tags # 6. ENCRYPTION_KEY changed from default? docker compose exec open_notebook env | grep ENCRYPTION_KEY # 7. Disk space adequate? df -h ./surreal_data ./notebook_data ./ollama_data
Five Common First-Run Errors (And Their Exact Fixes)
Error 1: Ports are not available
sudo lsof -i :8502 # Change host port: "8503:8502" → access on :8503
Error 2: PermissionError on SurrealDB
The SurrealDB container runs as root by default (user: root in compose), which is correct for Linux bind mounts. If you've changed this:
sudo chown -R 1000:1000 ./surreal_data
Error 3: Ollama embedding — Connection error, but chat works
This is the Esperanto library bug (Issue #655). In Settings → API Keys → Ollama, verify the Base URL is set correctly. If the embedding-specific URL field is available, set it explicitly. Workaround: use a cloud embedding provider (OpenAI text-embedding-3-small or Voyage AI) at < $0.01 per 1000 documents.
Error 4: CUDA out of memory
| GPU VRAM | Model size | Recommended num_ctx |
|---|---|---|
| 12 GB | 20B | 2048 |
| 24 GB | 20B | 8192 |
| 12 GB | 8B | 8192 (recommended) |
| 8 GB | 8B | 4096 |
Error 5: WebSocket connection to SurrealDB failed
docker compose exec open_notebook sh -c "wget -qO- http://surrealdb:8000/health" docker compose ps # Verify both services are Up
SurrealDB: Quick Backup/Restore
# Backup docker compose exec surrealdb surreal export \ --conn http://localhost:8000 --user root --pass root \ --ns open_notebook --db open_notebook \ > backup-$(date +%Y%m%d).surql # Restore cat backup-20260625.surql | docker compose exec -T surrealdb surreal import \ --conn http://localhost:8000 --user root --pass root \ --ns open_notebook --db open_notebook
This is the quality bar for every chapter in the full manual. Copy-paste ready. No filler. Real error messages with exact fixes.
Get the Production Manual
PDF + Markdown. Instant download. Free updates.
30-day money-back guarantee. If it doesn't save you 20+ hours, email support@localnotebook.dev for a full refund.
docker compose up and read a terminal. It doesn't teach Docker basics or explain what a GPU is. The Error Reference chapter covers 30+ issues we've personally hit — but Open Notebook is evolving fast. New errors will appear. You'll still need to read error messages and think critically. What this manual gives you is a head start of 20+ hours and a known-good production baseline.
FAQ
Is this official? Does lfnovo endorse it?
No. This is an independent community resource. Not affiliated with or endorsed by lfnovo or Google. It's built from real-world deployment experience — running Open Notebook in production for document research.
What if it doesn't help me?
Email support@localnotebook.dev within 30 days for a full refund. No questions asked. We mean it — if the manual doesn't save you 20+ hours, you shouldn't pay for it.
Will this stay updated with new Open Notebook versions?
Yes. You get all future updates at no extra cost. When Open Notebook ships a breaking change or new feature, the manual is updated within 2 weeks.
I just need the free guides. Is this necessary?
For personal use with cloud APIs, the free deployment guide is enough. If you're deploying for a team, running local models, or need it to work reliably day after day — that's when the 30+ error fixes, monitoring setup, and CI/CD templates pay for themselves.