1. Первоначальная настройка сервера
1.1. Создание нового пользователя
Подключаемся к серверу по SSH:
ssh root@YOUR_SERVER_IPСоздаем пользователя (замени deploy на нужное имя):
adduser deployВыдаем sudo права:
usermod -aG sudo deployПроверяем, что пользователь добавлен в группу:
groups deploy1.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/.ssh1.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-compose3. Установка Nginx в Docker
Создаем директорию для Server:
mkdir ~/server-settingsmkdir -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-interactive4. Настройка Nginx для нескольких доменов
Создаем файл конфигурации:
touch ~/server-settings/nginx/conf/guide-it.confserver {
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 nginx4. Настройка 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 nginx6. Установка 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'