Поднимаем staging для личных целей

Как и у многих разработчиков, у меня с завидной регулярностью возникает задача быстренько развернуть стенд для тестирование/показа какого-нибудь проекта.
Пару лет, пришел к простому варианту, который экономит время и деньги на основе ubuntu, nginx и docker-compose.


Выбираем площадку для staging

Уже длительное время я использую vps для подобных задач. Буквально месяц назад производил переоценку с точки зрения цена-качество. И остановился на варианте https://www.hetzner.com/cloud CX21.
За 5.88 евро вы получаете 2ядерный CPU, 4GB оперативки и 40SSD. Что по сравнению, например с DigitalOcean - дешево. А за дополнительные 1.18 евро можно обеспечить себя регулярными бэкапами.


Что будет на staging

Мы развернем VPS, настроим firewall. Установим nginx, certbot для сертификатов и docker-compose.

Базовая настройка сервера

Reference

Настройка firewall

$ ssh root@your_server
$ ufw app list
$ ufw allow OpenSSH
$ ufw status

Доступ только по ключу

Reference

Редактируем файл
$ vim /etc/ssh/sshd_config

и выставляем значение no для PasswordAuthentication no

И перезапускаем SSH
$ systemctl restart ssh

Установка docker и docker-compose

Установка docker

Reference

$ apt update
$ apt install apt-transport-https ca-certificates curl software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
$ apt-cache policy docker-ce
$ apt install docker-ce
$ systemctl status docker

Установка docker-compose

Reference

Выбираем на странице https://github.com/docker/compose/releases интересующую версию.

$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ docker-compose --version

Установка и настройка nginx

Reference

$ apt update
$ apt install nginx
$ ufw app list
$ ufw allow "Nginx Full"
$ ufw status

Инструкция для установки certbot от letsencrypt: https://certbot.eff.org/lets-encrypt/ubuntufocal-nginx)

Подготавливаем basic-авторизацию для будущих проектов

$ apt install apache2-utils
$ htpasswd -c /etc/nginx/htpasswd YOUR_LOGIN

для обновления пароля
$ htpasswd /etc/nginx/htpasswd YOUR_LOGIN

Создаем отдельного пользователя для управление docker-compose

$ adduser deployer --disabled-password
$ sudo usermod -aG docker deployer
$ sudo usermod -aG docker deployer
$ su - deployer
$ groups

Если захотите - потом можно будет настроить пользователю deployer вход по ключу для деплоя из CI.

Как развернуть приложение (на примере strapi)

$ vim /etc/nginx/sites-enabled/strapi

Вставляете содержимое:

server {
    server_name strapi.YOUR_DOMAIN;

# если хотите закрыть доступ с помощью настроенной ранее basic-авторизации - раскомментируйте строки далее
#    auth_basic "Restricted";
#    auth_basic_user_file /etc/nginx/htpasswd;
    access_log syslog:server=[2001:db8::1]:1234,facility=local7,tag=nginx,severity=info;

    location / {
        proxy_pass      http://127.0.0.1:1337;
    }
}

И перезагружаем nginx: $ service nginx restart

Для выпуска сертификата выполняете certbot и следуюете инструкции.

Далее проваливаемся в su - deployer и docker-compose.yml

version: '3'
services:
  strapi:
    image: strapi/strapi
    environment:
      DATABASE_CLIENT: postgres
      DATABASE_NAME: strapi
      DATABASE_HOST: postgres
      DATABASE_PORT: 5432
      DATABASE_USERNAME: strapi
      DATABASE_PASSWORD: strapi
    volumes:
      - ./app:/srv/app
    ports:
      - '1337:1337'
    depends_on:
      - postgres

  postgres:
    image: postgres:13-alpine
    environment:
      POSTGRES_DB: strapi
      POSTGRES_USER: strapi
      POSTGRES_PASSWORD: strapi
    volumes:
      - ./data:/var/lib/postgresql/data

Далее выполняем docker-compose up -d