Skip to content

1. Первоначальная настройка сервера

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

Подключаемся к серверу по SSH:

bash
ssh root@YOUR_SERVER_IP

Создаем пользователя (замени deploy на нужное имя):

bash
adduser deploy

Выдаем sudo права:

bash
usermod -aG sudo deploy

Проверяем, что пользователь добавлен в группу:

bash
groups deploy

1.2. Настройка SSH-ключа

С локального компьютера:

bash
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

Заливаем ключ на сервер:

bash
ssh-copy-id deploy@YOUR_SERVER_IP

Или вручную добавляем ключ на сервер:

bash
mkdir -p /home/deploy/.ssh
nano /home/deploy/.ssh/authorized_keys

Вставляем содержимое ~/.ssh/id_rsa.pub и сохраняем. Затем:

bash
chmod 600 /home/deploy/.ssh/authorized_keys
chown -R deploy:deploy /home/deploy/.ssh

1.3. Запрет входа под root

Редактируем конфиг SSH:

bash
nano /etc/ssh/sshd_config

Изменяем:

ini
PermitRootLogin no
PasswordAuthentication no

Перезапускаем SSH:

bash
systemctl restart ssh

Теперь подключение возможно только под deploy.


2. Установка Docker и Docker Compose

Обновляем пакеты:

bash
apt update && apt upgrade -y

Ставим Docker:

bash
apt install -y docker.io

Добавляем пользователя deploy в группу docker:

bash
usermod -aG docker deploy

Перезапускаем сервер:

bash
reboot

После перезапуска проверяем:

bash
docker --version

Ставим Docker Compose:

bash
apt install -y docker-compose

3. Установка Nginx в Docker

Создаем директорию для Server:

bash
mkdir ~/server-settings
bash
mkdir -p ~/server-settings/nginx/{conf,logs,html}
mkdir -p ~/server-settings/certbot/{www,conf}

Создаем docker-compose.yml:

bash
nano ~/server-settings/docker-compose.yml

Вставляем:

yaml
version: '3.8'
services:
    nginx:
        image: nginx:1.27
        container_name: nginx
        restart: unless-stopped
        ports:
            - "80:80"
            - "443:443"
        volumes:
            - ./nginx/conf:/etc/nginx/conf.d
            - ./nginx/logs:/var/log/nginx
            - ./nginx/html:/usr/share/nginx/html
            - ./certbot/www:/var/www/certbot
            - ./certbot/conf:/etc/letsencrypt
        depends_on:
            - certbot
        networks:
          - webnet

    certbot:
        image: certbot/certbot
        container_name: certbot
        volumes:
            - ./certbot/www:/var/www/certbot
            - ./certbot/conf:/etc/letsencrypt
        networks:
          - webnet
networks:
    webnet:
        driver: bridge

Запускаем:

bash
cd ~/nginx && docker-compose up -d

Для запроса сертификата выполняем команду:

bash
docker run --rm \
  -v "/home/guideitadmin/nginx/certbot/conf:/etc/letsencrypt" \
  -v "/home/guideitadmin/nginx/certbot/www:/var/www/certbot" \
  certbot/certbot certonly --webroot -w /var/www/certbot \
  -d guide-it.ru -d www.guide-it.ru \
  --email fntraders@ya.ru \
  --agree-tos \
  --non-interactive

4. Настройка Nginx для нескольких доменов

Создаем файл конфигурации:

bash
touch ~/server-settings/nginx/conf/guide-it.conf
nginx
server {
    listen 80;
    server_name guide-it.ru www.guide-it.ru;

    # Папка для верификации Let's Encrypt
    root /var/www/certbot;
    index index.html;

    # Директория для проверки доменов Certbot
    location /.well-known/acme-challenge/ {
        root /var/www/certbot;  # Указываем тот же путь, что и для webroot
        try_files $uri =404;
    }

    # Редирект с HTTP на HTTPS
    location / {
        return 301 https://$host$request_uri;
    }

    # Если нужен редирект
    location / {
        proxy_pass http://localhost:4000;
        proxy_set_header Host $host;
        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;
    }
}

# Сервер для HTTPS (порт 443)
server {
    listen 443 ssl;
    server_name guide-it.ru www.guide-it.ru;

    # Путь к сертификатам, полученным от Certbot
    ssl_certificate /etc/letsencrypt/live/guide-it.ru/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/guide-it.ru/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    # Путь для обслуживания файлов сайта
    root /usr/share/nginx/html;
    index index.html;

    # Основной location для сайта
    location / {
        try_files $uri $uri/ =404;
    }
}

Перезапуск nginx:

bash
docker-compose restart nginx

4. Настройка Nginx для нескольких доменов

Создаем конфиги для доменов:

bash
nano ~/nginx/conf/guide-it.conf

Пример для guide-it.ru:

nginx
server {
    listen 80;
    server_name guide-it.ru www.guide-it.ru;

    location / {
        proxy_pass http://localhost:4000;
        proxy_set_header Host $host;
        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;
    }
}

Повторяем для help.guide-it.ru, todo.guide-it.ru и т.д. Перезапускаем Nginx:

bash
docker restart nginx

6. Установка GitLab Runner

Создаем volume для gitlab-runner:

bash
docker volume create {volume-name}

# Пример front-gitlab-runner-config
docker volume create front-gitlab-runner-config

Создаем контейнер

bash
docker run -d --name {container-name} --restart always \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v {volume-name}:/etc/gitlab-runner \
  gitlab/gitlab-runner:latest

# Пример с front-gitlab-runner
docker run -d --name front-gitlab-runner --restart always \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v front-gitlab-runner-config:/etc/gitlab-runner \
  gitlab/gitlab-runner:latest

Регистрация gitlab-runner

bash
docker exec -it {container-name} gitlab-runner register

# Пример для front-gitlab-runner
docker exec -it front-gitlab-runner gitlab-runner register

Настройка ошибки:

bash
docker volume inspect {volume-name}

Найти строку "Mountpoint": "/var/lib/docker/volumes/front-gitlab-runner-config/_data",

Перейти по данному пути и открыть файл config.toml

Изменить строку volumes = ["/cache"] на:

bash
["/var/run/docker.sock:/var/run/docker.sock", "/cache"]

7. Интеграция GitLab CI/CD

Создаем .gitlab-ci.yml в репозитории:

yaml
stages:
  - build
  - deploy

build:
  stage: build
  image: node:18
  script:
    - npm install
    - npm run build
  artifacts:
    paths:
      - dist/

deploy:
  stage: deploy
  image: alpine
  before_script:
    - apk add --no-cache openssh
  script:
    - scp -r dist/ deploy@YOUR_SERVER_IP:/var/www/guide-it
    - ssh deploy@YOUR_SERVER_IP 'docker restart nginx'