Для работы вам потребуется собственный VPS с установленным Docker, и доменное имя.
Если у вас еще нет своего сервера - нужно создать. Лично я работаю на
Timeweb.Cloud, вы можете воспользоваться
моей реферальной ссылкой.
Если планируете выкладывать видеоролики, сервер лучше брать помощнее, от 4х ядер процессора и выше, потому что кодирование видео потребует ресурсы. То же касается и места на диске, но здесь всегда можно воспользоваться облаком S3.
Все инструкции даются для Ubuntu 22.04 LTS.
apt update
apt install ca-certificates curl git 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/
Обратите внимание также на настройку NGINX_PORT - по умолчанию там 8080, но на некоторых VPS этот порт может быть уже занят панелью ISP. В таком случае нужно указать свободный порт, например 8081.
Теперь можно проверить запуск контейнеров командой
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 up --build
ExecStartPost=service nginx reload
ExecStop=docker compose 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.
Орбита запущена и работает, но недоступна снаружи. По умолчанию она слушает только локальный порт 8080 (NGINX_PORT) и чтобы вывести её наружу, нам потребуется получить 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
Вставляем в него вот такой конфиг. Обратите внимание на указание путей к сертификатам с предыдущей картинки и параметр proxy_pass. Если вы меняли NGINX_PORT в .env, то здесь нужно указать ваше новое значение, вместо 8080.
server {
listen 80;
listen 443 ssl http2;
server_name orbita-test.bezumkin.ru;
add_header X-Frame-Options "SAMEORIGIN";
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: