Как развернуть Wiki.js 3 на своём сервере в Docker: пошаговое руководство
Пошаговое развёртывание Wiki.js 3.3.1 в Docker Compose с PostgreSQL 17: подготовка сервера, compose-файл, первый вход и смена пароля, настройка домена, редактор страниц, HTTPS через nginx, обновление, резервные копии и разбор типичных ошибок.
Wiki.js — открытая вики на Node.js, которую удобно поставить своей команде вместо Confluence: Markdown, права по группам, история версий, полнотекстовый поиск, импорт из MediaWiki и Notion. Третья ветка переписана: новый интерфейс, REST API /_api вместо GraphQL, страницы собираются из блоков, есть совместное редактирование. Всё это распространяется одним Docker-образом, а база живёт в отдельном контейнере.
Ниже — развёртывание Wiki.js 3.3.1 с PostgreSQL 17 на чистом сервере Debian 12 или Ubuntu 24.04. Скриншоты сняты на тестовом стенде той же версии, домен в примерах — wiki.example.com. Команды, конфиги и поведение интерфейса проверены на этом стенде: контейнеры поднимались, страница создавалась, прокси отдавал HTTPS.
Что важно знать о третьей версии до установки
- Образ публикуется как
ghcr.io/requarks/wiki:3(GitHub Packages) иrequarks/wiki(Docker Hub). Тег3сейчас указывает на 3.3.1; внутри образа Node.js 26. - Поддерживается только PostgreSQL. MySQL, MariaDB, MS SQL и SQLite, которые работали во второй ветке, в третьей отключены.
- Веб-мастера установки нет. Схема базы создаётся при первом старте, администратор тоже:
admin@example.comс паролем12345678, который вики требует сменить при первом входе. - Требование к базе жёстче, чем написано на странице требований: там всё ещё указан PostgreSQL 9.5+, а сборка 3.3.1 при старте проверяет версию и отказывается работать с 16 и ниже. Нужен PostgreSQL 17+ — это первое, на чём спотыкается установка.
Что понадобится
- Сервер с Debian 12 (bookworm) или Ubuntu 24.04 LTS и доступом по SSH, root или sudo;
- Docker Engine 24 и новее с плагином Compose v2;
- 2 ГБ ОЗУ и 2 ядра: официально хватает 1 ГБ и одного ядра, но рендеринг страниц и индексация поиска идут всплесками;
- 10 ГБ диска (образ вики занимает около 3,5 ГБ после распаковки, плюс база и вложения);
- отдельный домен или поддомен. В подкаталог вики не ставится — только корень хоста;
- открытые 80 и 443 на внешнем периметре, если будете выпускать сертификат Let's Encrypt.
Шаг 1. Каталог проекта и файл переменных
Заводим отдельный каталог и файл .env: пароль базы не должен лежать в compose-файле, который вы потом покажете коллеге или положите в git.
mkdir -p /opt/wikijs && cd /opt/wikijs
touch .env && chmod 600 .env
Содержимое .env — четыре переменные. Пароль генерируйте, а не придумывайте руками: openssl rand -base64 24.
POSTGRES_DB=wiki
POSTGRES_USER=wikijs
POSTGRES_PASSWORD=ChangeMe_Str0ngPass
WIKI_PORT=3000
Compose читает .env из каталога проекта и подставляет значения в файл при запуске. Порт 3000 — внутренний для контейнера; наружу он выйдет только на loopback, а публичный доступ отдаст reverse proxy.
Шаг 2. Файл docker-compose.yml
Два сервиса: база и вики. У базы — healthcheck: без него depends_on ждёт только запуска контейнера, и вики стартует раньше, чем PostgreSQL начнёт принимать подключения. Том pgdata именованный, а не привязанный к папке: так права на каталог данных остаются за пользователем postgres внутри контейнера, и при пересоздании ничего не ломается.
services:
db:
image: postgres:17-alpine
environment:
POSTGRES_DB: ${POSTGRES_DB}
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
interval: 10s
timeout: 5s
retries: 5
restart: unless-stopped
wiki:
image: ghcr.io/requarks/wiki:3
depends_on:
db:
condition: service_healthy
environment:
DB_TYPE: postgres
DB_HOST: db
DB_PORT: 5432
DB_USER: ${POSTGRES_USER}
DB_PASS: ${POSTGRES_PASSWORD}
DB_NAME: ${POSTGRES_DB}
ports:
- "127.0.0.1:${WIKI_PORT}:3000"
restart: unless-stopped
volumes:
pgdata:
Разбираем ключевые места, из-за которых чаще всего не работает:
DB_HOST: db— имя сервиса из этого же файла, а неlocalhost: контейнеры общаются по внутренней сети Compose.127.0.0.1:${WIKI_PORT}:3000— порт 3000 открыт только на самом сервере. Проверено: с другого хоста в сети порт не отвечает, с сервера — отдаёт 200. Наружу вики смотрит через nginx.restart: unless-stopped— контейнеры поднимаются после перезагрузки сервера.pgdata— том для/var/lib/postgresql/data. Именно он хранит базу; удаление тома (docker compose down -v) стирает вики целиком.
Шаг 3. Запуск и проверка
Поднимаем и смотрим, что оба контейнера перешли в healthy.
cd /opt/wikijs
docker compose up -d
docker compose ps
В логах вики ищем строки о версии, базе и запущенном HTTP-сервере — это и есть признак готовности:
docker compose logs wiki | grep -E "Wiki.js|PostgreSQL|HTTP Server"
Ожидаемый вывод на стенде:
info: = Wiki.js 3.3.1 =======================
info: Using PostgreSQL v17.12.0 [ OK ]
info: Created administrator account <admin@example.com> with the default password 12345678, which must be changed at first login
info: Starting HTTP Server on port 3000 [ STARTING ]
info: HTTP Server: [ RUNNING ]
Проверяем, что приложение отвечает локально:
curl -I http://127.0.0.1:3000/login
Если в логах вместо этого Your PostgreSQL database version (16) is too old and unsupported by Wiki.js. Requires >= 17. Exiting... — образ базы старый. В compose должен стоять postgres:17-alpine или новее; замена тега на 16 останавливает вики на старте, причём база при этом успешно подключается, и ошибка легко пропускается.
Шаг 4. Первый вход и смена пароля
Открываем вики и попадаем на страницу входа. Учётная запись уже создана при первом старте: admin@example.com, пароль 12345678.

После первого входа вики не пускает дальше, пока не сменишь пароль — тот же экран входа превращается в форму смены, и только после неё открывается сайт.

Сразу же поменяйте и email администратора: Users → пользователь Administrator. На этот адрес уходят письма о сбросе пароля, и адрес example.com для рабочей вики бесполезен.
Гостевой доступ по умолчанию закрыт: анонимного посетителя перебрасывает на /login, вики не показывает даже главную. Права гостей включаются в Groups → Guests, когда контент готов к публикации.
Шаг 5. Настройка сайта: домен, название, язык
Панель администратора — по адресу /_admin. На дашборде сразу после установки три группы и два пользователя — это значения по умолчанию.


Причина предупреждения — настройка Site Hostname со значением *. С таким значением сайт отвечает на любое имя, которое пришлёт клиент, а письма (сброс пароля, приглашения, уведомления) не уходят, пока у сайта нет постоянного адреса. Лечится в Site → General: вписываем домен, на котором будет жить вики, и нажимаем APPLY. На стенде предупреждение исчезло сразу после сохранения.

Там же имеет смысл заполнить:
- Site Title и Site Description — они идут в шапку и в метатеги страниц;
- Company / Organization Name и Content License — подвал сайта;
- Mail → Base URL и параметры SMTP, иначе сброс пароля и приглашения работать не будут;
- Security → Trust Proxy, если вики стоит за nginx: без этого все запросы выглядят приходящими с адреса прокси, и в журнале аудита вместо адресов пользователей один и тот же IP;
- Locale — добавить
ru-RU, если интерфейс нужен по-русски. Язык интерфейса не влияет на содержание страниц.
Шаг 6. Первая страница и редактор
Пока главной страницы нет, вики показывает приветственный экран с предложением её создать. Новая страница открывается по адресу /_edit/<путь> либо кнопкой с плюсом в шапке; путь задаётся там же и может быть вложенным, например infra/docker.
Редактор по умолчанию — Markdown с превью справа: разметка, таблицы и блоки кода видны до сохранения. Кроме него в вики есть визуальный редактор и AsciiDoc; набор доступных редакторов настраивается в Site → Editors.

После сохранения страница рендерится не мгновенно, а фоновой задачей — обычно это секунды. Готовая страница выглядит так: заголовки, блок кода и таблица оформлены штатными стилями темы.

Дальше наполнение идёт обычным порядком: страницы в папки, меню — в Navigation, доступ — через группы и правила для путей. Для переноса контента в Utilities есть импорт Markdown, HTML, Notion и резервной копии Wiki.js 2.x.
Шаг 7. HTTPS через nginx
Порт 3000 наружу не публикуем: TLS терминирует nginx, вики слушает только loopback. Конфигурация ниже проверена на стенде — nginx -t проходит, страница отдаётся по HTTPS.
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 443 ssl;
http2 on;
server_name wiki.example.com;
ssl_certificate /etc/letsencrypt/live/wiki.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/wiki.example.com/privkey.pem;
client_max_body_size 32m;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_read_timeout 300s;
}
}
Что здесь важно: Host должен совпадать с доменом из Site Hostname, иначе вики не найдёт сайт и отдаст пустую страницу; заголовки Upgrade/Connection нужны для WebSocket — на них работает совместное редактирование и живые уведомления; client_max_body_size ограничивает загрузку файлов (по умолчанию в nginx это 1 МБ, и загрузка картинок в вики будет падать с 413). Сертификат выпускается обычным certbot --nginx -d wiki.example.com, HTTP-порт 80 остаётся открытым для продления.
Обновление
Версия меняется тегом образа. Перед обновлением — резервная копия (следующий раздел), затем:
cd /opt/wikijs
docker compose pull
docker compose up -d
Миграции базы вики применяет сама при старте: в логах видно Ensuring DB migrations have been applied.... Если нужна конкретная версия, вместо тега 3 ставьте полный — ghcr.io/requarks/wiki:3.3.1: тогда обновление не прилетит неожиданно, но и исправления придётся тянуть руками. Дашборд показывает доступную версию в карточке Wiki.js version.
Резервное копирование и восстановление
Вся структура вики — страницы, история, пользователи, права, настройки — лежит в PostgreSQL. Дамп снимается одной командой прямо из контейнера:
docker compose exec -T db pg_dump -U wikijs -Fc -d wiki > /var/backups/wikijs-$(date +%F).dump
На стенде такой дамп пустой вики занимает 241 КБ. Восстановление — в новый том, на пустую базу:
docker compose stop wiki
docker compose exec -T db psql -U wikijs -d postgres -c 'DROP DATABASE wiki WITH (FORCE);'
docker compose exec -T db psql -U wikijs -d postgres -c 'CREATE DATABASE wiki OWNER wikijs;'
docker compose exec -T db pg_restore -U wikijs -d wiki < /var/backups/wikijs-2026-11-13.dump
docker compose start wiki
Файлы, загруженные в страницы, хранятся отдельно от базы — провайдер хранилища настраивается в Storage. Если там локальный диск, каталог с вложениями копируется вместе с дампом; если хранилище в базе, вложения уже внутри дампа.
Типичные проблемы
- Контейнер вики перезапускается, в логах «database version is too old». В compose стоит PostgreSQL 16 или старше. Нужен тег 17 и новее; данные из старого тома сами не переедут, базу надо пересоздать.
- Негде задать логин и пароль администратора при установке. Мастера установки в третьей ветке нет. Логин
admin@example.comи пароль12345678создаются при первом старте, строка об этом есть в логах. - Дашборд ругается на wildcard-хост, письма не приходят. В General не задан домен сайта, стоит
*. Пропишите домен и сохраните. - После прокси открывается пустая страница или 404. Домен в Site Hostname не совпадает с тем, что приходит в заголовке
Host. Проверьте, что nginx передаёт$host, а DNS ведёт на этот сервер. - Загрузка картинок падает с 413. Мало
client_max_body_sizeв nginx илиuploadMaxFileSizeв Security (по умолчанию 10 МБ). - После
docker compose down -vвики пустая. Ключ-vудаляет том с базой. Для обычного перезапуска хватаетdownбез него. - Все пользователи в журнале аудита с одним IP. Не включён Trust Proxy в Security.
Официальные ссылки
- Сайт проекта — js.wiki
- Документация — docs.requarks.io
- Установка в Docker — docs.requarks.io/install/docker
- Исходный код — github.com/requarks/wiki
- Выпуски и история версий — github.com/requarks/wiki/releases
- Образ в GitHub Packages — ghcr.io/requarks/wiki
- Образ на Docker Hub — hub.docker.com/r/requarks/wiki
Итог
Развёртывание сводится к двум сервисам в одном compose-файле, одной проверке в логах и смене пароля при первом входе — на чистом сервере это занимает около получаса, большая часть уходит на скачивание образа. Дальше вики живёт как обычный набор контейнеров: обновление — смена тега, резервная копия — дамп базы, публикация — nginx с сертификатом. Главное, что стоит проверить сразу после установки, — версия PostgreSQL не ниже 17, заданный домен сайта и закрытый наружу порт приложения.
Комментарии 1
Я тоже пользуюсь такой вики у себя, пока все устраивает
Оставить комментарий
Имя и текст — этого достаточно. Комментарий появится сразу; подозрительные сообщения уходят на проверку.