Установка Wiki.js — быстро разворачиваем эту прекрасную Вики на Ubuntu, с подробным и доходчивым описанием всех шагов.
Давненько не брал я в руки шашки.., пришло время что-то написать. Поскольку многие вендоры ушли и CISCO заблокировала продажи, доступ к страницам и даже к аккаунту, свернулись большие и хорошие проекты. Поэтому будем оптимизировать нашу IT-инфраструктуру на полностью бесплатных решениях.
Начнём с Вики. Почему корпоративная Вики является обязательным инструментом рассказывал тут. А вот здесь рассказывал про установку MediaWiki. Почему бы не поставить снова её? К сожалению, за 6 лет MediaWiki не сильно подвинулась в плане дизайна, да и фич тоже. А ведь это важно. Эстетическая составляющая. Хочется работать с красивым и современным интерфейсом. Повышается мотивация сотрудников что-то делать, заполнять эту Вики.
Рассматривал как ещё вариант XWiki, не понравилось. Установил, поглядел.. Как-то слишком просто, платная интеграция с AD (или дикий танец с бубнами). В топку. И вот наконец Wiki.js. На сайте неплохая документация, как всегда она неподробная и не без косяков. В нете есть статьи про установку, но среди них ни одной чтобы гладко настроить всё от начала до конца, важные для понимания моменты не указаны. Начинаем исправлять собственной документацией.
Это цикл из трёх статей: установка без Docker, настройка Вики, установка с Docker.
Функционал и плюсы
Ещё пару слов что нам надо от корпоративной Вики, что есть у Wiki.js, почему именно она. Фичи:
- Полностью бесплатная, весь функционал, который нужен, бесплатен;
- Нативная поддержка HTTPS;
- Интеграция с AD;
- Двухфакторная аутентификация;
- есть API.
Дизайн:
- Современный вид (уже говорил);
- Продвинутые возможности оформления;
- Древовидное меню разделов.
Возможности:
- Комментарии, теги, поиск;
- Отправка оповещений на e-mail;
- Поддержка русского и английского;
- Хорошая документация (тоже говорил).
Просто по-человечески сделана. Люди когда делали, понимали какие ожидания от корпоративной Вики.
Схема развёртывания
Итак, наша Вики состоит из 4 частей по порядку установки:
- Ubuntu Server;
- PostgreSQL;
- Node.js;
- Wiki.js.
Ubuntu Server
Тут всё просто, забираем здесь. Рассказывать подробнее про установку на VM не буду, каждый в состоянии это сделать самостоятельно. Выбираю Option 2 - Manual server Installation
. Текущая версия 22.04 LTS. Из компонентов потребуется только SSH:
[X] Install OpenSSH server
После установки настраиваем вход по SSH без пароля. Далее в процессе работы будет удобно. Работаем из Windows, на большинстве корпоративных машин эта операционка. В папке Putty есть тулза puttygen.exe, запускаем.
- Тип ключа для генерации — RSA;
- Генерировать;
- Закрытый ключ сохраняем в файл без парольной защиты;
- Создаём в Putty новую сессию, сохраняем;
- Подключаемся по SSH пока с паролем;
andy@wiki:~$ vim .ssh/authorized_keys - нажимаем i, вставляем содержимое открытого ключа, выйти и сохранить: Esc, потом Shift-ZZ
- Подвязываем к сессии SSH закрытый ключ:

- Ещё раз сохраняем сессию SSH.
Теперь при открытии сессии достаточно ввести имя пользователя. А если в Connection-Data
заполнить поле Auto-login username
, то и вводить вообще ничего не надо.
Защитить приватный ключ легко средствами Windows. Поместить в папку, настроить права для папки, в свойствах папки включить шифрование. Никто, никогда, не откроет.
Чтобы не вводить пароль при вводе команды sudo
, редактируем файл:
andy@wiki:~$ sudo -s Вводим пароль пользователя root@wiki:/home/andy# vim /etc/sudoers %sudo ALL=(ALL:ALL) ALL andy ALL= (ALL) NOPASSWD: ALL - добавляем строчку c именем пользователя, чтобы записать и выйти: Esc, потом :wq!
Важно, строчку надо добавлять после %sudo
. Всё, можно работать с комфортом. Далее для краткости:
там где команды от рута, вместо полной строки приглашения root@wiki:...# будет #
PostgreSQL
Мне не нравятся имена, и тем более пароли, по умолчанию. Буду менять по сравнению с тем, что написано в документации Wiki.js:
andy@wiki:~$ sudo -s # apt install postgresql - установка # pg_isready - проверка установки, должно написать что принимает подключения /var/run/postgresql:5432 - accepting connections # sudo su - postgres - переключаемся на пользователя postgres postgres@isec-wiki:~$ psql - входим в режим настройки postgres=# create user wiki_db_adm with password 'LyDfsJVMR9G'; CREATE ROLE postgres=# create database wiki_db_mos_1; CREATE DATABASE postgres=# grant all privileges on database wiki_db_mos_1 to wiki_db_adm; GRANT postgres=# \q postgres@wiki:~$ exit logout
Изменить пароль пользователю:
alter user wiki_db_adm with password 'new_password';
Ну а delete
понятно, удалить. Примерно так.
Node.js
Эта среда является основной для Wiki.js. Вот тут был первый косяк. Если установить как:
# apt install -y nodejs
То в результате установится очень древняя версия:
# node -v v10.19.0
В документашке написано, что минимальная поддерживаемая версия это v10.12:
Node.js 10: version 10.12 or later.
И как бы нормально. Нет, чуть забегая вперёд, с этой версией не работает:

На скрине запускаю из под рута и v10.19 вываливает ошибку, меняю на v16.14, всё ok. Поэтому для Node.js лучше всего так:
# curl -fsSL https://deb.nodesource.com/setup_19.x | sudo -E bash - &&\ # sudo apt-get install -y nodejs
Есть ещё один способ, он устанавливает Node.js в каталог пользователя и значит только для текущего пользователя. Данный способ для этой установки плохо подходит.
Wiki.js
Последний шаг установки:
# wget https://github.com/Requarks/wiki/releases/latest/download/wiki-js.tar.gz # mkdir /opt/wiki # tar xzf wiki-js.tar.gz -C /opt/wiki # cd /opt/wiki # mv config.sample.yml config.yml # vim config.yml
Далее редактируем конфиг, привожу какие строки должны быть раскомментированы на этом шаге:
port: 80 - было 3000 db: type: postgres host: localhost port: 5432 user: wiki_db_adm pass: LyDfsJVMR9G db: wiki_db_mos_1 ssl: false ssl: enabled: false port: 3443 format: pfx pfx: path/to/cert.pfx passphrase: null dhparam: null bindIP: 0.0.0.0 logLevel: info logFormat: default ha: false dataPath: ./data
Замечания по конфигу:
- Сразу бросаются в глаза нестандартные порты. Они тут неспроста. Поменял 3000 на 80 и далее из-за этого будет второй косяк. Если нужно чтобы работало сразу, оставляем 3000;
- SSL должен быть выключен.
Далее, запускаем Вики как приложение (обязательно из папки Вики /opt/wiki
):
# node server
Это весьма полезный инструмент, так как приводится подробный лог:

В частности тут видно, что произошло успешное подключение к базе, а значит имя и пароль пользователя базы указаны правильно. HTTP зашуршал на 80 порту, в конфиге нет ошибок.
Теперь переходим к браузеру и тут страничка первоначальной настройки:

После того как ведём данные (телеметрию надо отключить) и жмакнем INSTALL
, произойдёт первичное заполнение базы.
Сервис
Сейчас Вики запущена как приложение, если нажать в сессии SSH Ctrl-Z
, приложение закроется и доступ к вебу пропадёт. Запуск Вики был протестирован, ошибок нет, можно переводить в сервис.
Cоздадим отдельного системного пользователя для старта сервиса, так как запускать сервис от рута нехорошо:
# groupadd --system wiki # useradd -s /sbin/nologin --system -g wiki wiki
Этот пользователь лишенец без домашней папки и права входа в консоль. Теперь создаём сам сервис:
# cd /etc/systemd/system # vim wiki.service
Далее помещаем туда текст:
[Unit] Description=Wiki.js After=network.target [Service] Type=simple ExecStart=/usr/bin/node server Restart=always User=wiki Environment=NODE_ENV=production WorkingDirectory=/opt/wiki [Install] WantedBy=multi-user.target
Тут нужно задать правильный путь к директории Вики и имя пользователя.
# chown -R wiki:wiki /opt/wiki
Делаем нашего лишенца владельцем директории Вики, хоть что-то теперь у него есть. 🙂
# systemctl daemon-reload # systemctl start wiki # systemctl enable wiki Created symlink /etc/systemd/system/multi-user.target.wants/wiki.service → /etc/systemd/system/wiki.service. # systemctl status wiki
И вот он волшебный, заветный скрин:

На этом всё? Да если бы, переходим к таблшутингу.
Траблшутинг сервиса
Сервис работает, хорошо, а вот веб не прогружается, начинаем разбираться. Успешный старт службы означает, что команда, указанная в строке конфига службы ExecStart
отработала без фатальных ошибок. При этом лога мы не видим. Идём сначала в системный лог:
# cat /var/log/syslog | grep wiki
Тут что-то есть, но ничего интересного. Идём в папку Вики, тоже ничего или не нашёл. Как быть? Самый простой способ здесь дать лишенцу временно доступ в консоль:
# passwd wiki - задаём пароль # usermod wiki -s /bin/bash
Логинимся:
Could not chdir to home directory /home/wiki: No such file or directory wiki@wiki:/$ cd opt wiki ; node server
Стартуем Вики-приложение под этим пользователем и тут в логе видим:
2022-04-19T20:57:28.279Z [MASTER] warn: listen EACCES: permission denied 0.0.0.0:80
Оказывается работа с портами до 1024 возможна только из под рута. Наверное знал когда-то про это, но сейчас точно забыл. И на первый взгляд есть две опции:
- Запускать сервис с повышением привилегий. Небезопасно, удобно в работе;
- Работать с кривыми портами, безопасно, неудобно в работе.
Оба варианта плохие. Идём на сайт Wiki.js и тут находим целых три workaround'а. Помог Solution A, он как раз для Ubuntu. Выполнять его надо для пользователя, под которым стартует сервис. Команда хоть и выполняется от рута, сохраняется окружение пользователя:
wiki@wiki:/$ sudo apt-get install libcap2-bin wiki@wiki:/$ sudo setcap cap_net_bind_service=+ep `readlink -f \`which node\``
Для этого закинул wiki в sudoers
(по аналогии как это было рассказано в начале статьи), выполнил привязку, удалил из sudoers
. Далее возвращаем как было:
# usermod wiki -s /sbin/nologin This account is currently not available. - пробуем залогиниться, залогиниться нельзя
Проверяем веб, Вики нормально работает на 80 порту из под нашего системного пользователя.
Заключительные настройки
Включим FW:
# ufw allow 80 Rules updated Rules updated (v6) # ufw allow 443 Rules updated Rules updated (v6) # ufw allow ssh Rules updated Rules updated (v6) # ufw --force enable Firewall is active and enabled on system startup # reboot
Перезагрузка для уверенности, затем проверяем доступность SSH, веба и что FW действительно работает:
# ufw status Status: active To Action From -- ------ ---- 22/tcp ALLOW Anywhere 80/tcp ALLOW Anywhere 443/tcp ALLOW Anywhere ...
Отключим обновление Ubuntu, ставим нули:
# vim /etc/apt/apt.conf.d/20auto-upgrades APT::Periodic::Update-Package-Lists "0"; APT::Periodic::Unattended-Upgrade "0";
Обновлять будем только саму Вики. На этом всё.
Приглашаю поделиться мнением в Tелеграм канал
Пытаюсь разбираться в Линуксах, но:
"curl -fsSL https://deb.nodesource.com/setup_16.x | -E bash -" терминал не принимал.
Пришлось полезть в мануал на гитхаб и там для 16:
"curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash - &&\"
Заработало.
Спасибо, Илья. Ошибка из-за невнимательности. Исправил.
А можно подружить с wiki.js + nginx?
Да, люди ставят и есть солюшены в нете, не знаю насколько рабочие. Для меня вопрос неактуален.
Да, вполне рабочий вариант
Подскажите, чем не безопасно запускать сервис от root?
Тут вопрос в другом, а именно в подходе. Можно делать всё тяп-ляп, а можно приучать себя к Best Practice. Там говорится что пользовательский сервис не должен работать от рута, если есть такая возможность.
Когда сервис варится исключительно внутри системы, пусть работает от рута. Фиг с ним. Наш же сервис торчит наружу веб мордой. Значит может быть легко атакован. Даже не глядя в инет могу предположить, что Node.js имеет вагон и телегу уязвимостей. Вот кратко, а подробнее в поиск.
А если запускать его от лица www-data?
Наверное, не такой прям гуру Ubuntu и всех тонкостей. Сделал в меру своего понимания, а может там и лучше можно.
Да я вот тоже, потому и спрашиваю. Спасибо за ответ.