1. Первоначальная настройка сервера
1.1. Создание нового пользователя
Подключаемся к серверу по SSH:
ssh root@YOUR_SERVER_IP
Создаем пользователя (замени deploy
на нужное имя):
adduser deploy
Выдаем sudo права:
usermod -aG sudo deploy
Проверяем, что пользователь добавлен в группу:
groups deploy
1.2. Настройка SSH-ключа
С локального компьютера:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
Заливаем ключ на сервер:
ssh-copy-id deploy@YOUR_SERVER_IP
Или вручную добавляем ключ на сервер:
mkdir -p /home/deploy/.ssh
nano /home/deploy/.ssh/authorized_keys
Вставляем содержимое ~/.ssh/id_rsa.pub
и сохраняем. Затем:
chmod 600 /home/deploy/.ssh/authorized_keys
chown -R deploy:deploy /home/deploy/.ssh
1.3. Запрет входа под root
Редактируем конфиг SSH:
nano /etc/ssh/sshd_config
Изменяем:
PermitRootLogin no
PasswordAuthentication no
Перезапускаем SSH:
systemctl restart ssh
Теперь подключение возможно только под deploy
.
2. Установка Docker и Docker Compose
Обновляем пакеты:
apt update && apt upgrade -y
Ставим Docker:
apt install -y docker.io
Добавляем пользователя deploy
в группу docker
:
usermod -aG docker deploy
Перезапускаем сервер:
reboot
После перезапуска проверяем:
docker --version
Ставим Docker Compose:
apt install -y docker-compose
3. Установка Nginx в Docker
Создаем директорию для Server:
mkdir ~/server-settings
mkdir -p ~/server-settings/nginx/{conf,logs,html}
mkdir -p ~/server-settings/certbot/{www,conf}
Создаем docker-compose.yml
:
nano ~/server-settings/docker-compose.yml
Вставляем:
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
Запускаем:
cd ~/nginx && docker-compose up -d
Для запроса сертификата выполняем команду:
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 для нескольких доменов
Создаем файл конфигурации:
touch ~/server-settings/nginx/conf/guide-it.conf
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:
docker-compose restart nginx
4. Настройка Nginx для нескольких доменов
Создаем конфиги для доменов:
nano ~/nginx/conf/guide-it.conf
Пример для guide-it.ru:
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:
docker restart nginx
6. Установка GitLab Runner
Создаем volume
для gitlab-runner
:
docker volume create {volume-name}
# Пример front-gitlab-runner-config
docker volume create front-gitlab-runner-config
Создаем контейнер
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
docker exec -it {container-name} gitlab-runner register
# Пример для front-gitlab-runner
docker exec -it front-gitlab-runner gitlab-runner register
Настройка ошибки:
docker volume inspect {volume-name}
Найти строку "Mountpoint": "/var/lib/docker/volumes/front-gitlab-runner-config/_data",
Перейти по данному пути и открыть файл config.toml
Изменить строку volumes = ["/cache"]
на:
["/var/run/docker.sock:/var/run/docker.sock", "/cache"]
7. Интеграция GitLab CI/CD
Создаем .gitlab-ci.yml
в репозитории:
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'