Установка

Для работы вам потребуется собственный VPS с установленным Docker, и доменное имя.
Если у вас еще нет своего сервера - нужно создать. Лично я работаю на Timeweb.Cloud, вы можете воспользоваться моей реферальной ссылкой.
Если планируете выкладывать видеоролики, сервер лучше брать помощнее, от 4х ядер процессора и выше, потому что кодирование видео потребует ресурсы. То же касается и места на диске, но здесь всегда можно воспользоваться облаком S3.
Все инструкции даются для Ubuntu 22.04 LTS.

Установка Docker

Заходим на сервер как root, и следуем командам из официальной документации для подключения к репозиторию:
apt update
apt install ca-certificates curl gnupg
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg

echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Теперь установливаем все нужные пакеты:
apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin 
apt install -y nginx certbot python3-certbot-nginx mc htop

Запускаем проект

Создаём домашнюю директорию проекта, клонируем в неё исходники проекта и пробуем запустить:
mkdir /home/orbita
git clone https://github.com/bezumkin/orbita.git /home/orbita
cd /home/orbita
cp .env.dist .env
nano .env
После команды nano .env отроется редактор системных настроек - здесь вам необходимо указать правильный внешний адрес вашего сайта
Я указываю свой адрес вместе с протоколом https для которого мы позже получим SSL сертификат:
SITE_URL=https://orbita-test.bezumkin.ru/
Теперь можно проверить запуск контейнеров командой
docker compose up
Подождите пока все контейнеры будут скачаны и собраны. Дольше всего будет собираться контейнер с Node, вам нужно дождаться появления строчки Listening on http://[::]:3000
Это значит, что всё хорошо и фронтенд готов принимать запросы. Теперь можно прерывать работу через Ctrl+C.
Обязательно указываем владельца www-data для директорий, которые будут меняться в процессе работы.
chown www-data:www-data tmp upload log

Системная служба

Чтобы наши контейнеры стартовали сразу после загрузки сервера, нужно создать службу в systemd.
nano /etc/systemd/system/orbita.service
И копируем туда вот это:
[Unit]
Description=Orbita
After=docker.service
Requires=docker.service

[Service]
WorkingDirectory=/home/orbita/
ExecStart=docker compose -f /home/orbita/docker-compose.yml up --build
ExecStartPost=service nginx reload
ExecStop=docker compose -f /home/orbita/docker-compose.yml stop
Restart=on-failure

[Install]
WantedBy=multi-user.target
Остаётся только активировать и проверить статус новой службы следующими командами:
systemctl enable orbita
systemctl status orbita
И вот теперь уже можно запустить Орбиту как положено - в фоновом режиме, под управлением systemd.
systemctl start orbita
Если вам интересно, как идёт процесс запуска и что вообще происходит с контейнерами, можно посмотреть логи:
cd /home/orbita && docker compose logs --tail=10 -f
Выход из просмотра логов так же, через Ctrl+C.

Настройка веб-сервера Nginx

Орбита запущена и работает, но недоступна снаружи. По умолчанию она слушает только локальный порт 8080 и чтобы это исправить, нам потребуется получить SSL сертификат и настроить Nginx для внешних подключений.
Сделать это не так сложно, как кажется.
Если вы только создали новый сервер, то сейчас самое время привязать ваше доменное имя к его IP. Для написания этой инструкции я использую имя orbita-test.bezumkin.ru, так что во всех командах меняйте этот адрес на свой.
После изменения DNS нужно подождать минут 10-20, а потом можно провести тестовый запрос (флаг --dry-run) в LetsEncrypt на получение сертификата.
certbot certonly --nginx -d orbita-test.bezumkin.ru --dry-run
При первом запуске вас попросят указать свой email и согласиться с условиями обслуживания.
В итоге вы должны получить сообщение The dry run was successful - это значит, что можно выпускать настоящий сертификат.
Делаем это той же командой, только без флага --dry-run.
Вы получили настоящий SSL сертификат, который будет автоматически обновляться раз в 90 дней.
Теперь можно создать конфигурацию нашего сайта для Nginx:
nano /etc/nginx/conf.d/orbita.conf
Вставляем в него вот такой конфиг. Обратите внимание на указание путей к сертификатам с предыдущей картинки.
server {
    listen 80;
    listen 443 ssl http2;
    server_name orbita-test.bezumkin.ru;

    ssl_certificate /etc/letsencrypt/live/orbita-test.bezumkin.ru/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/orbita-test.bezumkin.ru/privkey.pem;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    include /etc/letsencrypt/options-ssl-nginx.conf;

    if ($scheme = 'http') {
        return 307 https://$host$request_uri;
    }

    location / {
        proxy_buffering off;
        client_max_body_size 0;
        proxy_request_buffering off;

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Host $server_name;
        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 X-Scheme $scheme;
        proxy_read_timeout 1m;
        proxy_connect_timeout 1m;
        proxy_pass http://127.0.0.1:8080;
    }
}
Правильность конфигурации проверяем командой nginx -t, и если ошибок нет - перезапускаем наш веб-сервер:
systemctl restart nginx
После этого пробуем зайти по адресу сайта, и если всё хорошо - добавляем к адресу /admin  и заходим как admin с паролем admin.
Теперь можно менять админский пароль, настраивать уровни подписок и прочее.
Можно еще перезагрузить сервер, чтобы проверить, что Nginx и Орбита стартуют автоматически.

Демонстрация того, как работает установка на локальной машине с MacOS: