Установка Wiki.js

Установка 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 закрытый ключ:
Установка Wiki.js
  • Ещё раз сохраняем сессию 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.

И как бы нормально. Нет, чуть забегая вперёд, с этой версией не работает:

Установка Wiki.js

На скрине запускаю из под рута и 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

Это весьма полезный инструмент, так как приводится подробный лог:

Установка Wiki.js

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

Теперь переходим к браузеру и тут страничка первоначальной настройки:

Установка Wiki.js

После того как ведём данные (телеметрию надо отключить) и жмакнем 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

И вот он волшебный, заветный скрин:

Установка Wiki.js

На этом всё? Да если бы, переходим к таблшутингу.

Траблшутинг сервиса

Сервис работает, хорошо, а вот веб не прогружается, начинаем разбираться. Успешный старт службы означает, что команда, указанная в строке конфига службы 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елеграм канал

10 thoughts on “Установка Wiki.js”

    1. Спасибо, Илья. Ошибка из-за невнимательности. Исправил.

    1. Да, люди ставят и есть солюшены в нете, не знаю насколько рабочие. Для меня вопрос неактуален.

  1. Павел

    Подскажите, чем не безопасно запускать сервис от root?

    1. Тут вопрос в другом, а именно в подходе. Можно делать всё тяп-ляп, а можно приучать себя к Best Practice. Там говорится что пользовательский сервис не должен работать от рута, если есть такая возможность.
      Когда сервис варится исключительно внутри системы, пусть работает от рута. Фиг с ним. Наш же сервис торчит наружу веб мордой. Значит может быть легко атакован. Даже не глядя в инет могу предположить, что Node.js имеет вагон и телегу уязвимостей. Вот кратко, а подробнее в поиск.

        1. Наверное, не такой прям гуру Ubuntu и всех тонкостей. Сделал в меру своего понимания, а может там и лучше можно.

          1. Павел

            Да я вот тоже, потому и спрашиваю. Спасибо за ответ.

Leave a Comment

Scroll to Top