Перенос существующего userside в контейнерную версию

Это не инструкция по обновлению моей версии с предыдущей на новую. Это инструкция по переходу от обычной версии userside на мою версию в докере. Если вы ищите инструкцию по обновлению моей версии, то она здесь.

Вам не нужно устанавливать PHP или Postgres или что-то еще, что не указано в этой инструкции. После перехода на мою версию вам больше не понадобятся на этом сервере PHP, Postgres и все остальное, если оно не используется на сервере где-то еще. Nginx может использоваться и далее как реверсивный прокси, например, для SSL.

Если какой-то из пунктов не удается выполнить — напишите мне в телеграм-бот. Не пытайтесь выполнить следом идущие пункты, перепрыгнув через проблемный. Это не сработает.

Версии, с которых возможен переход

Технически переход возможен с версии 3.12 и новее (в том числе network), но фактически переход с версий 3.12 - 3.14 не может быть предсказуем по разным причинам. На данный момент есть достаточный положительный опыт перехода с версий 3.17, 3.16 и 3.15.

Стоит отметить, что даже в официальной документации userside указано, что рекомендуется поэтапное обновление (когда для обновления с 3.12 на 3.18 сначала обновляются на 3.13, затем на 3.14 и т.д.), чего моя сборка не может обеспечить по простой причине — она имеет версию 3.18 и использует PHP 8.1. Также из документации и опыта общения с коллегами можно сделать вывод, что успех обновления очень сильно зависит от конкретных данных в базе данных, что в определенных случаях может приводить к проблемам с миграциями. Это, к сожалению, предсказать нельзя. Только разбираться по факту, что не так с данными.

Обратите внимание!

У вас может быть два варианта уже установленного userside (или userside network):

  1. userside установлен прямо на хост. Вы устанавливали самостоятельно nginx, php, postgres и т.д. на вашу операционную систему и затем устанавливали userside по инструкции в каталог /var/www/userside.

  2. userside установлен в докер-бандл. Вы установили докер, затем установили docker-bundle от userside по этой инструкции в каталог /docker/userside.

От способа установки текущей обычной версии, с которой вы собираетесь перейти на мою версию, зависят некоторые пункты дальнейшей инструкции. Будьте внимательны!

Последовательность действий

  1. Установить Docker Engine Server и плагин Compose v2 последних версий. Официальная документация. Проще всего это сделать при помощи автоматического скрипта https://get.docker.com/:

    sudo curl -fsSL get.docker.com | sh
    sudo gpasswd -a $USER docker
    newgrp docker
    
  2. Создать структуру каталогов для набора контейнеров. Создать каталог, в котором будет размещен весь набор контейнеров, например /opt/userside, перейти в него. Создать в нем структуру каталогов, в которых будут размещаться данные.

    sudo mkdir -p /opt/userside
    cd /opt/userside
    sudo mkdir -p data/{var,backup,database}
    sudo chown -R 82:82 data
    

    Важно

    Все остальные пункты инструкции подразумевают, что текущим активным каталогом является /opt/userside.

  3. Скачать архив с примерами конфигов, разархивировать и скопировать в текуший каталог файлы .env и docker-compose.yaml из него.

    sudo curl http://uscr.duckdns.org/config.tgz -o config.tgz
    sudo tar xzf config.tgz
    sudo cp config-examples/.env ./
    sudo cp config-examples/docker-compose.yaml ./
    
  4. Отредактировать конфигурационные файлы .env и docker-compose.yaml. В .env файле вписать: URL userside и пароли для postgres, redis, rabbitmq, websocket. Эти пароли не придется нигде вводить дополнительно, так что можно сгенерировать один раз сложные пароли, вписать и не возвращаться к этому вопросу. Избегайте использования символов из набора $@#\/.

    Если порт 80 на вашем сервере занят, например, web-сервером, то в docker-compose.yaml для сервиса userside нужно изменить номер порта (слева от двоеточия), например на 8080 или на любой другой и userside будет доступен на этом порту:

    services:
      userside:
        ports:
          - 8080:80
    

    Предупреждение

    Порт справа от двоеточия должен быть всегда 80. Формат YAML чувствителен к форматированию. Следите за отступами.

    Если вы не собираетесь использовать реверсивный прокси перед контейнером userside, то вам также нужно будет добавить этот порт к URL в переменной US_URL файла .env.

  5. Остановить существующий стационарный userside. Остановить службу php-fpm и отключить запуск модулей и userside cron в crontab. Если используется docker-bundle от userside, то остановить существующий docker-бандл по инструкции бандла.

  6. Запустить только сервис postgres в новом userside.

    docker compose up -d postgres
    

    И дождаться его запуска. Выполняйте следующую команду несколько раз, чтобы проверить состояние. Оно должно быть: Up xx seconds/minutes (healthy).

    docker compose ps postgres
    
  7. Скопировать базу данных из старого userside в новый. Выберите одно из действий в зависимости от варианта текущей установки.

    Если старый userside установлен прямо на хост, просто выполните команду (скопируйте целиком):

    sudo -u postgres pg_dump --no-owner --no-acl \
        --quote-all-identifiers -Fp -d userside \
        | docker compose exec -T postgres psql -U userside
    

    Скорее всего название вашей прежней базы данных userside, но если это не так, то измените название базы данных на правильное (значение опции -d в третей строке).

    В процессе следить за выводом. Если будут ошибки, сообщите мне в телеграм-бот.

    Если используется docker-bundle от userside, то нужно будет сначала перейти в каталог с прежним docker-бандлом, выполнить команду резервного копирования, затем вернуться в каталог /opt/userside и выполнить команду восстановления:

    cd /docker/userside
    docker compose run --rm postgres pg_dump -U userside \
      --no-owner --no-acl --quote-all-identifiers -Fp -Z 5 \
      -d userside > /opt/userside/userside.sql.gz
    
    cd /opt/userside
    gunzip < userside.sql.gz \
      | docker compose exec -T postgres psql -U userside
    

    В процессе следить за выводом. Если будут ошибки, сообщите мне в телеграм-бот.

  8. Скопировать файлы из старого userside в новый.

    1. Файл settings.json

      Если текущий userside установлен на хост:

      sudo cp /var/www/userside/common/config/settings.json data/settings.json
      

      Если текуший userside установлен в docker-bundle от userside:

      sudo cp /docker/userside/data/userside/common/config/settings.json data/settings.json
      
    2. Файлы вложений. Выберите одно из действий в зависимости от варианта текущей установки

      Если текущий userside установлен на хост и его версия 3.15 или новее:

      sudo cp -r /var/www/userside/var/attachments data/var/attachments
      

      Если текущий userside установлен на хост и его версия 3.12 - 3.14:

      sudo mkdir -p data/var/attachments/legacy
      sudo cp -r /var/www/userside/userside3/main/attach data/var/attachments/legacy
      

      Если текущий userside установлен в docker-bundle от userside:

      sudo cp -r /docker/userside/data/userside/var/attachments data/var/attachments
      
  9. Изменить владельца и права доступа для подкаталога data.

    sudo chown -R 82:82 data/var data/settings.json
    sudo chmod -R u=rwX,g=rX,o=rX data/var
    
  10. Запустить все остальные контейнеры набора.

    docker compose up -d
    

    Сначала будут загружены образы контейнеров, затем будут запущены контейнеры. После чего начнется процесс миграции, который может длиться очень долго в зависимости от количества данных в базе, от версии userside, с которой выполняется переход. Миграции могут выполняться как за несколько минут, так и за несколько часов. Наблюдать за логом выполнения можно командой:

    docker compose logs --no-log-prefix -f userside
    

    Выход Ctrl + C

  11. Проверить успешность выполнения миграций. Перед тем как продолжить, необходимо убедиться, что миграции завершились успешно. Если вдруг вы не следили за логом миграций (команда в пункте выше), то вы можете посмотреть последние строки файла лога миграций при помощи команды:

    tail data/var/log/migrations.log
    

    Посоедние строки этого файла, говорящие об успешности завершения миграций, выглядят так:

    xxx migrations were applied.
    
    Migrated up successfully.
    

    Если вместо этого текста вы видите следующий текст:

    Migration failed. The rest of the migrations are canceled.
    

    то остановите набор контейнеров и напишите мне в телеграм-бот.

    docker compose stop
    
  12. Как только все миграции завершатся успешно, можно открывать userside в браузере. По умолчанию userside будет доступен на IP-адресе вашего сервера и указанном в docker-compose.yaml порту. Если вам нужно использовать доменное имя или SSL, вы можете настроить реверсивный прокси nginx спереди контенейра. Смотрите ниже.

    На этом перенос завершен.

  13. Опционально: использование SSL. Настройте реверсивный прокси на nginx (устанавливается вами самостоятельно), на котором настройте и SSL. Пример конфигурации реверсивного прокси находится в файле nginx/nginx-reverse-proxy.conf из архива примеров, который вы скачали. В примере показано, как можно проксировать запросы к контейнеру. Для работы в таком режиме нужно внести некоторые изменения в файл docker-compose.yaml, а именно настройка портов для сервиса userside и rabitmq должна быть такой:

    services:
      userside:
        ports:
          - 127.0.0.1:8080:80
      rabitmq:
        ports:
          - 127.0.0.1:15674:15674
    

    После изменения конфигурации docker-compose.yaml необхоимо остановить и снова запустить набор контейнеров:

    docker compose stop
    docker compose up -d
    

    Также обязательно измените значение US_URL в файле .env на то, что указано в реверсивном прокси и используется для доступа к userside.

  14. Опционально: Тюнинг.

    В контейнере userside уже выполнены все необходимые настройки менеджера процессов PHP-FPM и в дополнительной настройке он не нуждается.

    Контейнер postgres может быть настроен на более лучшую производительность. Обратитесь к статье по тюнингу PostgreSQL. Рекомендую использовать SQL-команды ALTER SYSTEM вместо редактирование конфигурационного файла, но если вам нравится вносить изменения непосредственно в файл postgresql.conf, то он находится по пути: data/database/postgresql.conf.

    Чтобы выполнить необходимые команды ALTER SYSTEM вам нужно подключиться к PostgreSQL при помощи утилиты psql. Это можно сделать двумя способами:

    1. Через контейнер userside:

      docker compose exec userside psql
      
    2. Напрямую к контейнеру postgres (здесь нужно обязатено указать имя пользователя БД):

      docker compose exec postgres psql -U userside
      

    Выполните все необходимые команды ALTER SYSTEM и завериште работу утилиты введя \q (или нажав Ctrl + D).

    После изменения настроек нужно перезапустить весь набор контейнеров:

    docker compose restart