Linux

Как развернуть Wiki.js 3 на своём сервере в Docker: пошаговое руководство

Пошаговое развёртывание Wiki.js 3.3.1 в Docker Compose с PostgreSQL 17: подготовка сервера, compose-файл, первый вход и смена пароля, настройка домена, редактор страниц, HTTPS через nginx, обновление, резервные копии и разбор типичных ошибок.

Как развернуть Wiki.js 3 на своём сервере в Docker: пошаговое руководство

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.

Страница входа Wiki.js 3
Страница входа. Администратор создаётся автоматически, отдельного мастера установки нет

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

Принудительная смена пароля при первом входе
Принудительная смена пароля: до неё панель администратора недоступна

Сразу же поменяйте и email администратора: Users → пользователь Administrator. На этот адрес уходят письма о сбросе пароля, и адрес example.com для рабочей вики бесполезен.

Гостевой доступ по умолчанию закрыт: анонимного посетителя перебрасывает на /login, вики не показывает даже главную. Права гостей включаются в Groups → Guests, когда контент готов к публикации.

Шаг 5. Настройка сайта: домен, название, язык

Панель администратора — по адресу /_admin. На дашборде сразу после установки три группы и два пользователя — это значения по умолчанию.

Дашборд панели администратора Wiki.js 3
Дашборд: версия, число страниц и пользователей, последние входы
Предупреждение о wildcard-хосте на дашборде
Предупреждение о wildcard-хосте: сайт отвечает на любое имя, письма не отправляются

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

Настройки General с указанным доменом
General: название, описание, домен сайта. Домен снимает предупреждение и включает отправку писем

Там же имеет смысл заполнить:

  • 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.

Редактор Markdown с превью в Wiki.js 3
Редактор Markdown: слева разметка, справа превью, сверху сохранение

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

Готовая страница вики с заголовками, блоком кода и таблицей
Результат: страница с оглавлением, блоком кода и таблицей

Дальше наполнение идёт обычным порядком: страницы в папки, меню — в 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.

Официальные ссылки

Итог

Развёртывание сводится к двум сервисам в одном compose-файле, одной проверке в логах и смене пароля при первом входе — на чистом сервере это занимает около получаса, большая часть уходит на скачивание образа. Дальше вики живёт как обычный набор контейнеров: обновление — смена тега, резервная копия — дамп базы, публикация — nginx с сертификатом. Главное, что стоит проверить сразу после установки, — версия PostgreSQL не ниже 17, заданный домен сайта и закрытый наружу порт приложения.

Wiki.jsDockerDocker ComposePostgreSQLnginxHTTPSвикисистемное администрирование
← Все статьи

Яндекс Браузер

Блокировка рекламы, перевод страниц и нейросеть в одном окне.

Реклама

Комментарии 1

D
Digi 14.11.2026 · 01:45

Я тоже пользуюсь такой вики у себя, пока все устраивает

Оставить комментарий

Имя и текст — этого достаточно. Комментарий появится сразу; подозрительные сообщения уходят на проверку.

Сдвиньте ползунок вправо для проверки
Спам и реклама блокируются автоматически.
Читайте также

Похожие публикации

12 Ноя

Плагины NetBox 4.7.5: ставим Topology Views и NetBox DNS в Docker

Как установить плагины в NetBox 4.7.5 в Docker: свой образ через uv, включение PLUGINS, миграции и статика. На примере двух самых скачиваемых плагинов — Topology Views 5.0.2 и NetBox DNS 1.7.3.

→
12 Ноя

Как развернуть NetBox 4.7.5 на чистом сервере Linux в Docker: пошаговое руководство

Пошаговое развёртывание NetBox 4.7.5 (DCIM + IPAM) в Docker Compose на чистом Debian 12 или Ubuntu 24.04: подготовка сервера, Docker из официального репозитория, настройка окружения, первый вход, наполнение базы, бэкап, обновление и HTTPS через reverse proxy.

→
05 Ноя

Сайт-портфолио с блогом на Django: от чистой Debian до запущенного сервера

Пошаговая сборка Django-сайта с блогом: окружение и зависимости, модели, админка на Unfold с визуальным редактором, gunicorn под systemd и nginx впереди — с командами, проверками и разбором грабель.

→