Skip to content

Infrastructure

Vladislav Kuznecov edited this page Mar 20, 2022 · 14 revisions

Настройка инфраструктуры

Я ещё не такой крутой, чтобы создавать полноценный скрипт на каком-нибудь Puppet, так что вот шпаргалка по настройке нового VDS:


Общая настройка VDS

Создание нового пользователя

  1. useradd -m dusic - добавление нового пользователя
  2. sudo passwd dusic - установка пароля
  3. usermod -aG sudo dusic - выдача расширенных прав

Настройка SSH (часть 1)

  1. nano /etc/ssh/sshd_config - конфигурация SSH
    1. Переопределить опцию Port. Например, на 2232
    2. Разрешить авторизацию по паролю: AllowUsers dusic
  2. sudo ufw allow 2232/tcp - открытие порта в фаерволе
  3. sudo ufw enable - включение фаервола
  4. sudo ufw reload - перезагрузка фаервола
  5. sudo service sshd restart - перезагрузка SSH сервера
  6. На этом моменте следует переоткрыть сессию SSH на новом порту через нового пользователя

Настройка SSH (часть 2)

  1. chsh -s /bin/bash - иногда требуется явно выставить командную оболочку
  2. sudo ufw deny 22/tcp - закрытие старого SSH порта
  3. sudo ufw reload - перезагрузка фаервола
  4. sudo ufw status verbose - можно посмотреть статус фаервола

Настройка SSH доступа по ключу (только, если у вас Linux)

  1. mkdir ~/.ssh - создание директории
  2. touch ~/.ssh/authorized_keys - создание файла с доверенными клиентами

Локально:

  1. cat ~/.ssh/id_rsa.pub | ssh dusic@$IP -p $PORT 'cat >> ~/.ssh/authorized_keys' - добавление ключа на сервер. На месте $IP и $PORT IP и порт (вау)

Теперь можно локально зайти на сервер как крутой: ssh dusic@$IP -p $PORT

А ещё можно локально настроить ~/.ssh/config и быть вообще крутым: ssh dusic-app-1

Настройка fail2ban

  1. sudo apt install fail2ban
  2. Конфигурация sudo vim /etc/fail2ban/jail.local
[sshd]
enabled  = true
port     = 2232
logpath  = /var/log/auth.log
maxretry = 6
  1. sudo service fail2ban restart
  2. sudo tail -n 1000 /var/log/fail2ban.log - лог

Настройка сервера с приложением

Настройка RVM и Ruby

  1. Всё по гайду
  2. Возможно потребуется прогнать source, который советует сам RVM
  3. rvm install 3.1.1 - установка интерпретатора
  4. gem install bundler:2.3.8 - установка Bundler
  5. gem install rake - установка Rake

Настройка Node.js

  1. Всё по гайду, нужна 16-я версия
  2. sudo npm install -g yarn - установка Yarn

Установка mp3_to_dca

Вообще говоря, можно просто закинуть бинарник собранный под данную систему, но пускай будет инструкция по сборке из исходников

  1. Установка Crystal по гайду
  2. git clone https://github.com/fizvlad/mp3_to_dca-cr && cd mp3_to_dca-cr - исходники
  3. shards install - библиотеки
  4. sudo apt install libopus-dev - зависимость
  5. crystal build -s -t -p --release ./src/main.cr -o ./bin/mp3_to_dca - бинарник
  6. sudo ln -s $PWD/bin/mp3_to_dca /usr/local/bin/mp3_to_dca - симлинк на конвертер

Установка youtube-dl

  1. sudo curl -L https://yt-dl.org/downloads/latest/youtube-dl -o /usr/local/bin/youtube-dl
  2. sudo chmod a+rx /usr/local/bin/youtube-dl

Настройка окружения

  1. Добавить к ~/.bash_profile и/или ~/.profile переменную окружения: RAILS_ENV="production"; export RAILS_ENV

Настройка доступа к репозиторию

Этот шаг должен быть уже не нужен, учитывая, что репозиторий теперь публичный

  1. ssh-keygen -t rsa -b 4096 -C "your@mail.ru" && cat ~/.ssh/id_rsa.pub - SSH ключ сервера, его надо добавить в настройки репозитория Github

Прочие зависимости

  1. sudo apt install libpq-dev - взаимодействие с Postgres
  2. sudo apt install ffmpeg - ffmpeg

Настройка Puma

  1. Создать Linux сервис, создав /etc/systemd/system/puma.service:
[Unit]
Description=Puma HTTP Server for Dusic (production)
After=network.target
[Service]
Type=simple
User=dusic
Environment="RAILS_ENV=production" "RAILS_MAX_THREADS=8"
WorkingDirectory=/home/dusic/dusic/current
ExecStart=/home/dusic/.rvm/bin/rvm default do bundle exec puma -C /home/dusic/dusic/current/config/puma.rb -e production
ExecReload=/bin/kill -TSTP $MAINPID
ExecStop=/bin/kill -TERM $MAINPID
StandardOutput=append:/home/dusic/dusic/shared/log/puma_access.log
StandardError=append:/home/dusic/dusic/shared/log/puma_error.log
Restart=always
[Install]
WantedBy=multi-user.target
  1. sudo systemctl daemon-reload - перезагрузка списка демонов
  2. Разрешить перезагрузку сервиса без sudo, добавив dusic ALL=(ALL) NOPASSWD: /bin/systemctl restart puma в /etc/sudoers.d/dusic
  3. systemctl status puma - статус Puma
  4. sudo systemctl restart puma - перезагрузка Puma
  5. journalctl -u puma -f - логи Puma

Настройка сервера с БД

  1. Всё по гайду
  2. Создать в БД роль dusic
  3. Создать в БД роль blazer:
CREATE ROLE blazer LOGIN PASSWORD 'secret123';
GRANT CONNECT ON DATABASE dusic_production TO blazer;
GRANT USAGE ON SCHEMA public TO blazer;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO blazer;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO blazer;
  1. RAILS_ENV=production rails db:prepare - создание БД

Настройка сервера с балансером

Установка Nginx

  1. Всё по гайду
  2. sudo service nginx start
  3. Корневой конфиг: /etc/nginx/nginx.conf

Настройка фаервола

  1. sudo ufw allow 80/tcp - HTTP
  2. sudo ufw allow 443/tcp - HTTPS
  3. sudo ufw reload - перезагрузка фаервола

Первичная конфигурация Nginx

  1. Вот тут: sudo vim /etc/nginx/conf.d/default.conf
server {
    listen 80;
    listen 443;
    charset utf8;
    root /home/dusic/dusic/current/public;
    try_files $uri/index.html $uri @app;
    location @app {
        proxy_pass http://0.0.0.0:3000;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
    }
    
    error_page 500 502 503 504 /500.html;
}
  1. sudo nginx -t - проверка корректности конфигурации
  2. sudo service nginx restart - перезагрузка nginx

Настройка сертификатов

  1. Установка certbot по гайду

Финальная конфигурация Nginx

  1. sudo vim /etc/nginx/conf.d/default.conf
map $http_upgrade $connection_upgrade {
  default upgrade;
  '' close;
} # this is required to proxy Grafana Live WebSocket connections

server {
    listen 80;
    server_name dusic.fizvlad.com;

    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name dusic.fizvlad.com;

    ssl_certificate /etc/letsencrypt/live/disic.xyz/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/disic.xyz/privkey.pem;

    charset utf8;

    root /home/dusic/dusic/current/public;

    try_files $uri/index.html $uri @app;

    location @app {
        proxy_pass http://0.0.0.0:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Ssl on;
        proxy_set_header X-Forwarded-Port $server_port;
        proxy_set_header X-Forwarded-Host $host;
    }

    location /ws {
        proxy_pass http://0.0.0.0:3000/ws;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Ssl on;
        proxy_set_header X-Forwarded-Port $server_port;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
    }

    location /grafana/ {
        proxy_set_header Host $http_host;
        proxy_pass http://185.98.87.66:3000/;
    }

    location /grafana/api/live/ {
        rewrite  ^/(.*)  /$1 break;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_set_header Host $http_host;
        proxy_pass http://185.98.87.66:3000/api/live/;
    }

    error_page 500 502 503 504 /500.html;
}

server {
    listen 80;

    server_name disic.xiz;

    return 301 https://dusic.fizvlad.com$request_uri;
}

server {
    listen 443 ssl;
    server_name disic.xiz;

    ssl_certificate /etc/letsencrypt/live/disic.xyz/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/disic.xyz/privkey.pem;

    return 301 https://dusic.fizvlad.com$request_uri;
}
  1. sudo nginx -t - проверка корректности конфигурации
  2. sudo service nginx restart - перезагрузка nginx
  3. sudo tail -f /var/log/nginx/access.log - лог обращений
  4. sudo tail -f /var/log/nginx/error.log - лог ошибок

Настройка прокси

Контекст: Иногда ВК начинает выбивать капчу на логине или на поиске. Лучший способ - создание интерфейса для её решения, либо подключение к какому-нибудь сервису решения капчи. Быстро можно решать, зайдя в ВК через прокси сервера с приложением. Проще всего использовать 3proxy

Установка 3proxy

Примечание: Манипуляции под root-пользователем

  1. wget https://github.com/z3APA3A/3proxy/archive/0.9.3.tar.gz - скачать исходники (можно и версии новее)
  2. tar -xvf 0.9.3.tar.gz
  3. cd 3proxy-0.9.3/
  4. sudo make -f Makefile.Linux - сбор пакета под Линукс
  5. sudo mkdir /etc/3proxy
  6. sudo mkdir -p /var/log/3proxy
  7. sudo cp bin/3proxy /usr/local/bin/
  8. sudo adduser --system --disabled-login --no-create-home --group proxy3 - создание пользователя
  9. id proxy3 - копируем ID пользователя (увидим что-то такое: uid=113(proxy3) gid=120(proxy3) groups=120(proxy3))
  10. sudo chown proxy3:proxy3 -R /etc/3proxy
  11. sudo chown proxy3:proxy3 /usr/local/bin/3proxy
  12. sudo chown proxy3:proxy3 /var/log/3proxy
  13. sudo ufw allow 4545/tcp - заранее открываем порт
  14. sudo ufw reload

Настройка 3proxy

Вот тут: sudo vim /etc/3proxy/3proxy.cfg

# User and group
setgid 120
setuid 113

# Launch as daemon
daemon

# Logging
log /var/log/3proxy/3proxy.log D
logformat "- +_L%t.%. %N.%p %E %U %C:%c %R:%r %O %I %h %T"

# Allow all
allow * * * *

# Auth
auth strong
users "dusic:CL:complicatedPassword"

# DNS servers
nserver 8.8.8.8
nserver 77.88.8.8
nserver 127.0.0.53

# DNS cache
nscache 65536

# Port
proxy -p4545 -n -a

Настройка демона 3proxy

Вот тут: sudo vim /etc/systemd/system/3proxy.service

[Unit]
Description=3proxy Proxy Server

[Service]
Type=simple
ExecStart=/usr/local/bin/3proxy /etc/3proxy/3proxy.cfg
ExecStop=/bin/kill `/usr/bin/pgrep 3proxy`
RemainAfterExit=yes
Restart=on-failure

[Install]
WantedBy=multi-user.target

Запускаем нового демона:

sudo systemctl daemon-reload
sudo systemctl enable 3proxy
sudo systemctl start 3proxy

Clone this wiki locally