Outline на Ubuntu 24.04: пошаговая установка
Команда разрослась, и общие знания расползлись по чатам, гуглдокам и личным заметкам — искать нужную инструкцию дольше, чем написать её заново. Notion решает проблему, но данные компании лежат на чужих серверах, а тарифы за место растут вместе с командой. Outline закрывает тот же сценарий — быстрый поиск, чистый Markdown, вложенные коллекции документов — но крутится на вашем сервере, и вы сами решаете, где хранятся данные. Ниже — рабочая установка на Ubuntu 24.04 через Docker Compose, с реальными конфигами, а не выдержками из чужого README.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Что нужно перед установкой
Outline — не однобинарник, а связка из четырёх компонентов: сам сервис, PostgreSQL, Redis и хранилище файлов. Легковесным его не назвать, но и прожорливым тоже — для команды до 30-50 человек хватает скромной конфигурации.
Минимум для старта:
- VPS с 2 vCPU и 2 ГБ RAM — Outline поднимется, но под нагрузкой (одновременная работа 15+ человек, крупные вложения) лучше закладывать 4 ГБ, особенно если Postgres и Redis крутятся на том же сервере.
- 20-40 ГБ диска — зависит от объёма вложений (картинки, PDF в документах).
- Ubuntu 24.04 LTS с обновлённым пакетным кэшем и пользователем с правами sudo.
- Домен или поддомен, у которого A-запись указывает на IP сервера — без него не получить HTTPS-сертификат, а без HTTPS современные браузеры будут ругаться на cookie-сессии. Если домен ещё не привязан к серверу, сначала разберитесь с настройкой домена и DNS.
- Заранее решённый вопрос авторизации: у Outline нет собственной пары логин/пароль «из коробки» — нужен либо SMTP для входа по magic-link на почту, либо OAuth-провайдер (Google, Slack, GitHub, Azure AD, любой generic OIDC вроде Keycloak или Authentik). Разберём оба варианта ниже.
Устанавливаем Docker и Docker Compose
Официальный образ Outline рассчитан на Docker, и связка сервисов удобнее всего описывается через Compose. Если Docker на сервере ещё не стоит, ставим его официальным скриптом:
sudo apt update && sudo apt upgrade -y
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $USER
После usermod перелогиньтесь (или выполните newgrp docker), чтобы группа применилась без выхода из SSH-сессии. Проверьте, что Compose плагин на месте:
docker compose version
Если команда не найдена — версия Docker слишком старая или ставилась не через официальный скрипт. Подробный разбор установки, включая нюансы с драйверами хранения и правами, — в статье про установку Docker на Ubuntu 24.04 с нуля.
Создайте рабочую директорию проекта:
sudo mkdir -p /opt/outline
cd /opt/outline
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверOAuth или magic-link: как Outline пускает пользователей
Это тот шаг, на котором чаще всего застревают при первом self-host Outline: сервис твёрдо требует внешнего провайдера идентификации. Самый быстрый вариант для небольшой команды — вход по ссылке на почту (magic-link), без создания OAuth-приложения. Для этого просто настройте SMTP — если у вас уже есть рабочий почтовый сервер или SMTP-релей (Mailgun, Postmark, Yandex 360, свой Postfix), понадобятся только его данные:
SMTP_HOST=smtp.example.com
SMTP_PORT=587
SMTP_USERNAME=outline@example.com
SMTP_PASSWORD=пароль-приложения
SMTP_FROM_EMAIL=outline@example.com
SMTP_REPLY_EMAIL=support@example.com
SMTP_SECURE=true
Если вы уже настраивали почту для сервера, полезно свериться со статьёй по настройке SMTP-релея — она снимает большинство вопросов с TLS и авторизацией.
Второй вариант — OAuth. Для Google: заходите в Google Cloud Console, создаёте OAuth 2.0 Client ID типа «Web application», в Authorized redirect URIs указываете https://wiki.example.com/auth/google.callback, полученные client_id и client_secret кладёте в переменные:
GOOGLE_CLIENT_ID=xxxxxxxx.apps.googleusercontent.com
GOOGLE_CLIENT_SECRET=xxxxxxxx
Для generic OIDC (Keycloak, Authentik, Zitadel — если у вас уже поднят свой identity-провайдер) переменные другие:
OIDC_CLIENT_ID=outline
OIDC_CLIENT_SECRET=секрет-из-провайдера
OIDC_AUTH_URI=https://auth.example.com/realms/main/protocol/openid-connect/auth
OIDC_TOKEN_URI=https://auth.example.com/realms/main/protocol/openid-connect/token
OIDC_USERINFO_URI=https://auth.example.com/realms/main/protocol/openid-connect/userinfo
OIDC_USERNAME_CLAIM=preferred_username
OIDC_DISPLAY_NAME=Company SSO
Можно включить сразу несколько способов входа одновременно — тогда на странице логина появится выбор. Для первого запуска проще всего ограничиться SMTP: меньше внешних зависимостей, меньше что может пойти не так.
Docker Compose: Postgres, Redis и сам Outline
Соберём три сервиса в одном файле. Хранилище вложений возьмём локальное — для небольшой команды это проще, чем поднимать отдельный S3-совместимый бакет. Если вложений будет много и вы захотите вынести их за пределы диска сервера — рядом можно развернуть MinIO и переключить FILE_STORAGE на s3.
Файл /opt/outline/.env:
NODE_ENV=production
SECRET_KEY=замените-на-вывод-openssl-rand--hex-32
UTILS_SECRET=замените-на-второй-такой-же-вывод
URL=https://wiki.example.com
PORT=3000
DATABASE_URL=postgres://outline:пароль-бд@postgres:5432/outline
DATABASE_SSL=disable
REDIS_URL=redis://redis:6379
FILE_STORAGE=local
FILE_STORAGE_LOCAL_ROOT_DIR=/var/lib/outline/data
FILE_STORAGE_UPLOAD_MAX_SIZE=26214400
# из предыдущего раздела — SMTP или OAuth-переменные
SMTP_HOST=smtp.example.com
SMTP_PORT=587
SMTP_USERNAME=outline@example.com
SMTP_PASSWORD=пароль-приложения
SMTP_FROM_EMAIL=outline@example.com
SMTP_REPLY_EMAIL=support@example.com
SECRET_KEY и UTILS_SECRET сгенерируйте по отдельности:
openssl rand -hex 32
Файл /opt/outline/docker-compose.yml:
services:
outline:
image: outlinewiki/outline:latest
restart: unless-stopped
env_file: .env
ports:
- "127.0.0.1:3000:3000"
volumes:
- storage-data:/var/lib/outline/data
depends_on:
- postgres
- redis
redis:
image: redis:7-alpine
restart: unless-stopped
volumes:
- redis-data:/data
postgres:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_USER: outline
POSTGRES_PASSWORD: пароль-бд
POSTGRES_DB: outline
volumes:
- postgres-data:/var/lib/postgresql/data
volumes:
storage-data:
redis-data:
postgres-data:
Обратите внимание: порт Outline проброшен только на 127.0.0.1 — наружу сервис будет смотреть через reverse-proxy с HTTPS, напрямую по 3000-му порту извне достучаться не получится, и это осознанное решение, а не баг конфига.
Поднимаем:
cd /opt/outline
docker compose up -d
docker compose logs -f outline
При первом старте контейнер сам прогоняет миграции базы — в логах это видно по строкам Migrations complete. Если контейнер падает сразу после старта, в 9 случаях из 10 причина — опечатка в DATABASE_URL или несовпадение пароля с тем, что задан в postgres.
HTTPS и reverse-proxy через Caddy
Outline требует HTTPS даже для внутреннего использования — часть механизмов авторизации и cookie завязаны на secure-контекст. Caddy для этого удобнее nginx: сертификат Let's Encrypt получает и продлевает сам, без отдельного certbot и cron-задач.
Если Caddy ещё не установлен, порядок действий подробно разобран в статье про Caddy с автоматическим SSL на Ubuntu 24.04. После установки конфиг для Outline простой — файл /etc/caddy/Caddyfile:
wiki.example.com {
reverse_proxy 127.0.0.1:3000
}
Перезапускаем:
sudo systemctl reload caddy
Не забудьте открыть 80 и 443 порты в файрволе (80-й нужен для проверки домена при выпуске сертификата):
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
Через 10-30 секунд Caddy выпустит сертификат и https://wiki.example.com откроет страницу входа Outline.
Первый запуск, бэкапы и обновления
Первый, кто войдёт через настроенный SMTP или OAuth, автоматически становится админом организации в Outline — создаёт workspace и приглашает остальных по ссылке или почте. Дальше можно заводить коллекции документов, настраивать права на уровне команд и групп.
Бэкапы — здесь два независимых объекта: база данных и файловое хранилище вложений.
Дамп Postgres из контейнера:
docker compose exec postgres pg_dump -U outline outline | gzip > outline-$(date +%F).sql.gz
Вложения при FILE_STORAGE=local лежат в docker-томе storage-data — это по сути каталог /var/lib/docker/volumes/outline_storage-data/_data, его тоже нужно копировать регулярно, вместе с дампом базы. Если хотите вынести это на автоматику с ротацией и внешним хранением, логика описана в статье про автоматические бэкапы на Ubuntu 24.04 — принцип тот же, меняются только пути.
Обновление до новой версии — обычный pull-и-рестарт, миграции применяются автоматически при старте контейнера:
cd /opt/outline
docker compose pull outline
docker compose up -d outline
Перед мажорным обновлением (смена первой цифры версии) стоит сделать свежий дамп базы — Outline активно развивается, и иногда между релизами меняется схема хранения некоторых полей.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверНужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.
Частые вопросы
Можно ли обойтись без SMTP и без OAuth-приложения?
Нет, Outline требует хотя бы один способ входа — либо SMTP для magic-link, либо один из OAuth-провайдеров. Собственной пары логин/пароль в интерфейсе нет — это осознанное решение разработчиков ради безопасности.
Хватит ли 2 ГБ RAM в продакшене?
Для команды до 10-15 человек — обычно да, но Postgres и Redis в docker-compose тоже едят память, и на 2 ГБ полезно выставить лимиты контейнеров и следить за swap. Для более активной команды спокойнее взять 4 ГБ.
Нужен ли обязательно S3 для файлов?
Нет, локальное хранилище (FILE_STORAGE=local) работает штатно и проще в бэкапе на старте. К S3-совместимому хранилищу (например, MinIO) стоит переходить, когда вложений становится много и хочется отделить их от диска основного сервера.
Можно ли поставить Outline без Docker, напрямую на хост?
Формально да — это Node.js-приложение, но официальный путь поддержки — Docker, и все актуальные инструкции ориентированы именно на него. Голая установка потребует вручную тянуть Node нужной версии, yarn-зависимости и настраивать systemd-юнит — Docker Compose избавляет от этой возни.
Что если домен ещё не готов, а попробовать хочется уже сейчас?
Можно временно поднять Outline без Caddy, обратившись к http://IP-сервера:3000 с открытым портом — но это только для локальной проверки: часть функциональности (secure-cookie) в браузере может работать нестабильно без HTTPS, и оставлять так в проде нельзя.
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →