Версия:

Инструкция по установке экземпляра ПО “Сервис видеоконсультаций Voda”

CCS.Deployment - Универсальная система развертывания

Подготовка

Чистый сервер на Linux (предпочтительно Debian 13+)

Закажите в облачном дата-центре (с соответствием 152-ФЗ) чистый сервер или создайте его в собственной инфраструктуре.

Для ознакомления достаточно сервера например с такими характеристиками: 2x3.3 ГГц, 4ГБ RAM, 50ГБ SSD (можно и слабее).

ОС: Debian 12-13

Домены

Подготовьте 2 домена (можно поддомены). Один для самого сервиса, другой для сервиса coturn.

Например: serv1.voda-sale.ru и coturn.serv1.voda-sale.ru.

Пропишите DNS записи A, указав IP созданного сервера.

Проследите, чтобы при наличии DNS записей типа AAAA, там был указан IPv6 созданного сервера, или удалите эти записи. Так как если оставить AAAA записи по умолчанию (ведут на хостинг провайдера), то подключение может быть не стабильно и работать через раз.

Установка

Подключитесь на пустой сервер

Либо используя пароль, либо по публичному ключу.

Как получить публичный ключ на вашем компьютере:

Сменить root пароль на чистой системе (необязательно)

Сгенерировать новый пароль (не забудьте сохранить его себе)

openssl rand -base64 16

Установить новый пароль (если вы только получили пароль от провайдера на чистую ОС)

passwd

Установка зависимостей и настройка под root

На минимальной установке Linux (например, Debian minimal) выполните следующие команды:

# Под root
# Получаем и запускаемм мастер-скрипт установки из открытого репозитория (https://gitflic.ru/project/ccsmskru/ccs-deployment-first)
wget "https://gitflic.ru/project/ccsmskru/ccs-deployment-first/blob/raw?file=first.sh" -O first.sh && chmod +x first.sh
Что происходит при запуске

Скрипт first.sh автоматически выполнит:

  1. Поиск ранее используемых конфигураций
  2. Определение ОС - автоматически определит дистрибутив и версию
  3. Установку зависимостей - установит git, curl, wget, vim, …
  4. Создание пользователя под которым будет работать контейнеры с сервисами - создаст или выберет из созданных пользователя для CCS
  5. Клонирование репозитория развертывания CCS.Deployment - скачает проект РАЗВЕРТЫВАНИЯ с GitFlic или GitHub
  6. Настройки для coturn - Если проекту требуется coturn (именно на этом сервере, то можно сразу запустить настройки для него)

Параметры и опции скрипта first.sh

Использование

# Интерактивный режим (рекомендуется)
./first.sh

# Использование готовой конфигурации
./first.sh /path/to/config.cfg

Интерактивные опции (скрипт все подскажет при установке)

Выбор конфигурации

Управление пользователями

Настройка паролей (для новых пользователей)

Управление паролями:

Выбор репозитория с скриптами развертывания CCS.Deployment

Методы авторизации Git

Настройка coturn

Скрипт предложит сразу выполнить настройку coturn. Выполните это, если вам необходим сервис coturn и вы устанавливаете его на этом же сервере.

Для ознакомления с сервисом Voda coturn устанавливается на том же сервере, что и сам сервис, поэтому эту настройку необходимо выполнить.

Настройка под пользователем

В конце скрипт спросит, начать ли установку под пользователем. В текущей реализации она ничего не делает, так как вам нужно самостоятельно переподключиться под пользователем и выполнить указанные действия (см. инструкцию дальше).

Повторное использование

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

Использование сохраненной конфигурации

# Скрипт автоматически найдет и предложит использовать
# существующие конфигурации при повторном запуске
./first.sh

Что делать дальше (под пользователем)

Войти под созданным пользователем:

Открыть и настроить config.sh (через vim или удаленный редактор в IDE или специальном ПО):

vim ~/config.sh
# заполните параметры (см. ниже) и установите
config_is_ready=1

Настройки config.sh

Ниже описаны константы, которые нужно заполнить в ~/config.sh. Он генерируется из шаблона и имеет настройки по умолчанию, однако они универсальные под различные сервисы. Часть нужно скорректировать, часть удалить.

Перед описанием всех настроек, вот пример настроенного конфига для сервиса voda для ознакомления.

(можете скопировать его, исправив домены, IP и логин и пароль для сервиса COTURN)

#!/bin/bash

# Универсальный конфигурационный файл CCS
# Поддерживает: Debian/Ubuntu, RHEL/CentOS/Rocky Linux/Fedora

config_is_ready=1

# =====================================================================================
# ОСНОВНЫЕ ПУТИ И НАСТРОЙКИ
# =====================================================================================

DEPLOY_PATH="${HOME}/CCS.Deployment" # путь к файлам развертывания (исключая start.sh)

# Определение путей в зависимости от ОС
source "${DEPLOY_PATH}/config_utils/os_paths.sh"

apps_path=~/apps
services_path=~/services
env_file="${HOME}/.env"

# Глобальный список разрешённых исходящих (rootless, per-user egress на nftables)
# Можно указывать домены и/или IP/CIDR. "*" — разрешить всё.
# Примеры:
# allowed_outgoing_urls_or_ip=("mail2.pro-fm.com" "1.2.3.4" "gitflic.ru")
# allowed_outgoing_urls_or_ip=("*")
# ВАЖНО: Если вы используете SMTP (например, порт 587), убедитесь, что хост почтового сервера разрешен.
allowed_outgoing_urls_or_ip=("*")
#allowed_outgoing_urls_or_ip=("АДРЕС_БЭКАПОВ" "git@github.com")

# =====================================================================================
# СЕРВИСЫ
# =====================================================================================

# Список сервисов для развертывания
declare services=("db" "ccs_voda" "nginx" "coturn" "backup")

# Сетевые настройки Podman
# Имя сети. Используйте 'host' для host networking (фолбэк при коллизиях подсети)
podman_net='mynet'
# Подсеть для пользовательской сети Podman (пример: '192.168.200.0/24').
# Если оставить пустым, будет создана сеть без явной подсети.
# При конфликте маршрутов скрипт установки может автоматически переключить podman_net на 'host'.
podman_subnet=''

# =====================================================================================
# НАСТРОЙКИ БАЗЫ ДАННЫХ
# =====================================================================================

db_service_name="mariadb"
db_data_path="${services_path}/db/mariadb_data"
db_conf_file="${services_path}/db/50-server.cnf"

# Версия и источник базового образа MariaDB для контейнера
# Можно указать конкретный патч-релиз (например, 12.1.2), минорную ветку (12.1),
# или мажорную (12) — в двух последних случаях будет браться последний патч релиза ветки.
# Значения по умолчанию подобраны под актуальную стабильную версию.
db_base_image_registry="docker.io/library"   # реестр/организация образа
db_base_image_name="mariadb"                 # имя образа
db_base_image_tag="12.1.2"                   # тег образа (актуальная версия по умолчанию)

# Публикация порта БД для удалённого доступа/SSH‑туннеля
# Рекомендованный безопасный сценарий: публиковать только на 127.0.0.1 и подключаться через SSH‑туннель.
# Примеры туннеля см. в README (раздел «Подключение к БД через SSH‑туннель»).
# 1 — включить публикацию порта, 0 — не публиковать порт хоста
db_publish_enabled=1
# Адрес привязки публикации. 127.0.0.1 — безопасно (порт доступен только локально на сервере)
db_publish_bind_address="127.0.0.1"
# Внешний порт БД на хосте (нестандартный по умолчанию, чтобы снизить вероятность коллизий/сканов)
db_ext_port=33060

# =====================================================================================
# CCS ПРИЛОЖЕНИЯ
# =====================================================================================

# CCS APP (Backend)
ccs_voda_service_name="ccs_voda"
ccs_voda_name="ccs_voda"
ccs_voda_service_template="app_template"
#ccs_voda_service_dir="ccs_voda" # Директория для кастомных файлов. По умолчанию = ccs_voda_service_name
ccs_voda_path="${apps_path}/${ccs_voda_name}"
ccs_voda_git_url="git@gitflic.ru:ccsmskru/voda.git" # SSH формат. Или https://gitflic.ru/project/user/repo.git
ccs_voda_git_branch="master"


# Настройки приложения
ccs_voda_node_max_memory=4096
ccs_voda_port=8080
ccs_voda_ext_port=8080
ccs_voda_db_service_name="mariadb"
ccs_voda_init_sql="ccs.init.sql"

# Настройки доменов и Nginx
# Можно указать протокол, тогда конфиг будет соответствующий. По умолчанию HTTPS
# Можно указать несколько доменов разделенных пробелом
ccs_voda_domains=("serv1.voda-sale.ru")
ccs_voda_public_root="${ccs_voda_name}/public"
# Если сервис сохраняет location в routes/.env то переменная ccs_voda_nginx_location будет проигнорирована
#ccs_voda_nginx_location="~ ^/(index\.html|login\.html|api|check|socket\.io|uploadFile|upload-avatar|resetpassword|files/.*|scripts/|confirmEmail|payment/uniteller/confirm|payment/tbank/confirm)"

# Общие настройки бэкапа
ccs_voda_backup_remote_dir_name="${ccs_voda_name}"

# Расписание резервного копирования (cron формат)
ccs_voda_backup_db_daily="0 22 * * *"      # ежедневно в 22:00 по МСК
ccs_voda_backup_db_monthly="0 0 1 * *"     # ежемесячно 1 числа в 00:00
ccs_voda_backup_db_yearly="0 21 31 12 *"   # ежегодно 31 декабря в 21:00
ccs_voda_backup_files_daily="0 2 * * *"    # ежедневно в 02:00

# Настройки удаленного хранения
# Если "localhost" то дампы будут только на этом же сервере
ccs_voda_backup_db_remote_address=("localhost") # Пример: ("myuser@192.168.1.100" "myuser@514.1.17.64")

# Для резервного копирования файлов
ccs_voda_backup_files_remote_address=("localhost")
ccs_voda_backup_files_directories=("files" "public/upload" "public/savedFiles" "serverUploads")




# =====================================================================================
# НАСТРОЙКИ NGINX
# =====================================================================================

nginx_service_name="nginx"
nginx_confd_path="${services_path}/nginx/conf.d"
nginx_ssl_path="${services_path}/nginx/ssl-nginx"
nginx_well_known_path="${services_path}/nginx/.well-known"

# Сервисы для получения доменов и путей (используется ${service}_domains => app_domains)
nginx_services=("ccs_voda" "coturn")

# =====================================================================================
# НАСТРОЙКИ COTURN (если нужен вашему сервису)
# =====================================================================================
coturn_service_name="coturn"
coturn_name="coturn"
coturn_service_template="coturn"

# ATTENTION! If you change default ports, you need to open it in firewall
# ATTENTION! Default ports you need open too. Please use prepareOS/open_ports_for_coturn.sh

#coturn_listening_port=3478
#coturn_tls_listening_port=5349
#coturn_min_port=49152
#coturn_max_port=65535

coturn_domain="coturn.serv1.voda-sale.ru"
coturn_external_ip="000.000.000.000" # Please set the external IP of the server

coturn_username="serv1_coturn_voda_user"
coturn_password="CHANGE_ME_al18Q#u$"

coturn_ssl_path="${nginx_ssl_path}" # Common path to certificates for coturn and nginx


#You can specify the protocol, then the config will be appropriate. Default is HTTPS

coturn_domains=("coturn.serv1.voda-sale.ru")
coturn_public_root="${services_path}/${coturn_name}"
# Если сервис сохраняет location в routes/.env то переменная coturn_nginx_location будет проигнорирована
coturn_nginx_location="~ ^/(coturn/)"
coturn_nginx_http_conf="coturn_http.conf"
coturn_nginx_https_conf="coturn_https.conf"


# =====================================================================================
# НАСТРОЙКИ РЕЗЕРВНОГО КОПИРОВАНИЯ
# =====================================================================================

# PARAMS FOR BACKUP
backup_service_name="backup"
# services to get BACKUP (${service}_backup_db_daily => app_backup_db_daily)
backup_services=("ccs_voda")

# =====================================================================================
# СИСТЕМНЫЕ НАСТРОЙКИ
# =====================================================================================

# Настройки бэкапа (системный сервис)
backup_service_name="backup"

# Дополнительные переменные среды (добавьте свои если нужно)
# export CUSTOM_VAR="value"

# =====================================================================================
# ПРОВЕРКА КОНФИГУРАЦИИ
# =====================================================================================

# Функция проверки конфигурации (вызывается автоматически)
validate_config() {
    local errors=0

    echo "Проверка конфигурации..."

    # Проверяем основные пути
    if [[ ! -d "$DEPLOY_PATH" ]]; then
        echo "ОШИБКА: DEPLOY_PATH не найден: $DEPLOY_PATH"
        errors=$((errors + 1))
    fi

    # Проверяем Git URL
    for service in "${services[@]}"; do
        local git_url_var="${service}_git_url"
        local git_url="${!git_url_var}"

        if [[ -n "$git_url" && ! "$git_url" =~ ^git@.* && ! "$git_url" =~ ^https://.* ]]; then
            echo "ПРЕДУПРЕЖДЕНИЕ: Некорректный Git URL для $service: $git_url"
        fi
    done

    # Проверяем домены
    for service in nginx_services; do
        local domains_var="${service}_domains"
        if [[ -n "${!domains_var}" ]]; then
            echo "Настроены домены для $service: ${!domains_var}"
        fi
    done

    if [[ $errors -gt 0 ]]; then
        echo "Найдено ошибок: $errors"
        return 1
    fi

    echo "Конфигурация прошла базовую проверку"
    return 0
}

# Автоматическая проверка если config_is_ready = 1
if [[ $config_is_ready == 1 ]]; then
    validate_config || {
        echo "ВНИМАНИЕ: Найдены проблемы в конфигурации!"
    }
fi

DNS (Уже сделано на этапе подготовки)

Для тех доменов, которые вы указали в конфиге необходимо прописать A и AAAA записи вашего сервера. AAAA может быть не обязательн, но если он есть, то должен указывать корректно. В противном случае certbot не сможет корректно подтвердить владение сервером и не выпустит сертификаты.

Установить сервисы из конфига (пример):

Авторизация в docker (необязательно)

Во время установки, система запрашивает образы из docker. Если образов много, или если вы делаете несколько попыток (так как забыли что-то указать в конфиге или еще по каким причинам), вы можете столкнуться с лимитом на неавторизованные запросы.

You have reached your unauthenticated pull rate limit. https://www.docker.com/increase-rate-limit

Чтобы избежать этого, или по факту, авторизуйтесь в докере (вам нужен аккаунт на docker.com):

# Скрипт использует podman, а не docker, поэтому используем его
podman login docker.io
Запуск установки

Чтобы запустить установку, наберите start.sh имя_команды список_сервисов_к_которым_применить_команду

Вы всегда можете просто запустить ./start.sh и получить помощь по командам и синтаксису. А также список прописанных в конфиге сервисов “Available services:”

./start.sh install db nginx ccs_app ccs_app_front backup
# Или на примере сервиса VODA
# ./start.sh install db ccs_voda nginx coturn backup

Следуйте инструкциям скрипта.

Правка конфига конкретного сервиса после установки

Рассмотрим на примере сервиса Voda. Ключевые параметры уже заполнены, такие как настройки подключения к БД и прочее.

После изменения и сохранения конфигурации требуется перезапустить сервис

./start.sh restart ccs_app
# ./start.sh restart voda

SSL‑сертификаты: выпуск и автообновление

Как установить

После установки сервисов, включая nginx, и настройки DNS для указанных доменов, можно выпускать сертификаты.

Это делается под root пользователем из домашней директории.

# под root
#./cert.sh <имя_пользователя>
./cert.sh ccs_voda

Необходимо ответить на стандартные вопросы certbot, указав почту администратора и согласившись с лицензией.

После успешного выпуска, нужно снова зайти под пользователем (не через su, а отдельной сессией) и выполнить повторную установку сервиса nginx.

# Под пользователем ccs_voda (или того, которого вы создали на начальном этапе)
# ./start.sh install nginx && ./start.sh restart coturn # Если используется coturn то его нужно перезапустить, чтобы он подтянул сертификаты
./start.sh install nginx

При этом скрипт, обнаружив в нужной директории сертификаты, подготовит новые конфиги уже для работы по https, а http будет перенаправляться на https.

Что делает система

Логи и отладка

Готово.

Обновление приложения

Кодовая база

Обновление производится через тот же скрипт ./start.sh и предусмотрено несколько режимов:

После обновления обязательно перезапустить nginx

./start.sh update2 ccs_app && ./start.sh restart nginx

Обновление БД

Платформа GoCore на которой построено приложение большую часть профайлов различных сущностей хранит в базе данных. Поэтому при крупных доработках, требуется также обновление базы.

Автоматизированного механизма миграций в текущей версии продукта не имеется, однако разработчик может смерджить необходимые таблицы встроенными средствами. Это может быть сделано на компьютере разработчика, но для этого потребуется скачивать актуальную базу. Или это можно сделать через удаленное подключение к базе на сервере через ssh тунель. Ниже будет описано, как настроить такой доступ.

Действия для обновления

./start.sh restart ccs_app nginx

Настройка туннеля для удаленного доступа к БД

# Пробрасываем локальный порт 3306 к серверному 127.0.0.1:33060
ssh -N -L 3306:127.0.0.1:33060 user@your.server

# Затем подключаемся клиентом к localhost:3306
# host: localhost
# port: 3306
# user/pass: согласно настройкам/приложению

Важно: