Skip to Content
3️⃣ День 3Подготовка сервера

Подготовка сервера

В этом разделе настроим сервер Ubuntu 22.04 для запуска продакшн-сервиса с Docker и NGINX.

Для выполнения данного задания вам понадобится:

  • Сервер с Ubuntu 22.04 LTS или 24.04 LTS
  • SSH-ключ для доступа к серверу
  • Публичный IP сервера
  • Domain для привязке его к серверу

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

# 🔄 Обновляем список пакетов и сразу устанавливаем последние версии всех установленных пакетов sudo apt update && sudo apt upgrade -y # 📦 Устанавливаем необходимые пакеты: # - apt-transport-https: поддержка репозиториев по HTTPS # - ca-certificates: для проверки SSL-сертификатов # - curl: для загрузки файлов # - software-properties-common: утилиты для управления репозиториями sudo apt install -y apt-transport-https ca-certificates curl software-properties-common # 📁 Создаем директорию для хранения ключей GPG Docker sudo mkdir -p /etc/apt/keyrings # 🔑 Загружаем и сохраняем официальный GPG-ключ Docker в бинарном формате # Нужен для проверки подлинности пакетов из внешних репозиториев curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \ sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg # ➕ Добавляем официальный репозиторий Docker в список источников APT # Используем: # - архитектуру (например amd64) # - ключ GPG из /etc/apt/keyrings/docker.gpg # - имя релиза Ubuntu (например focal, jammy) echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \ https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null # 🔄 Обновляем список пакетов, чтобы включить новый Docker-репозиторий sudo apt update # 📥 Устанавливаем сам Docker и связанные компоненты: # - docker-ce: Docker Community Edition # - docker-ce-cli: командная строка Docker # - containerd.io: контейнерный runtime # - docker-buildx-plugin: расширенная сборка образов # - docker-compose-plugin: плагин новой версии docker compose (v2) sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin sudo systemctl enable docker # ⚙️ Включаем автозапуск Docker при загрузке системы # ✅ Проверка установки Docker: выводит версию клиента и демона docker version # ✅ Проверка установки Docker Compose (v2): запускается как подкоманда `docker compose` docker compose version

3. Установка и настройка NGINX

sudo apt install -y nginx sudo systemctl enable nginx sudo systemctl start nginx

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

Создайте конфиг:

sudo nano /etc/nginx/sites-available/devops-intensive.it-incubator.io

Пример конфигурации

nginx.conf
server { listen 80; # Слушаем HTTP-запросы на 80 порту server_name devops-intensive.it-incubator.io; # Указываем домен или публичный IP сервера location /api { proxy_pass http://localhost:4545; # Проксируем запросы на локальный Node.js-сервер (в контейнере) proxy_http_version 1.1; # Используем HTTP/1.1 для поддержки веб-сокетов и keep-alive proxy_set_header Host $host; # Передаём оригинальный Host-заголовок } location / { proxy_pass http://localhost:4546; # Проксируем запросы на локальный Node.js-сервер (в контейнере) proxy_http_version 1.1; # Используем HTTP/1.1 для поддержки веб-сокетов и keep-alive proxy_set_header Host $host; # Передаём оригинальный Host-заголовок } }

Сохраните файл и примените:

# Создаём символическую ссылку из файла конфигурации в sites-available в папку sites-enabled, # чтобы NGINX начал использовать этот конфиг (активируем сайт) sudo ln -s /etc/nginx/sites-available/devops-intensive.it-incubator.io /etc/nginx/sites-enabled/ # Проверяем синтаксис конфигурации NGINX и ищем ошибки sudo nginx -t # Перезагружаем NGINX, чтобы применить новые настройки (без остановки сервера) sudo systemctl reload nginx

4. Привязка домена к серверу через Cloudflare

Чтобы ваш домен (например, devops-intensive.it-incubator.io) указывал на ваш сервер:-

Шаг 2: Зайдите в Cloudflare

  1. Перейдите на https://dash.cloudflare.com
  2. Выберите нужный домен
  3. Перейдите во вкладку DNS

Шаг 3: Добавьте A-запись

ТипИмяЗначениеTTLПрокси
A@45.12.34.56Auto🔒 Вкл.

Примечание: @ означает основной домен (devops-intensive.it-incubator.io). Если хотите настроить www.example.com, добавьте вторую A-запись с именем www.


Шаг 4: Проверьте привязку

Откройте терминал и выполните:

ping devops-intensive.it-incubator.io

Если возвращается ваш IP — всё работает.

Теперь можно использовать devops-intensive.it-incubator.io в настройке NGINX и получить SSL через Certbot.


5. Настройка домена и HTTPS через Let’s Encrypt

sudo apt install -y certbot python3-certbot-nginx sudo certbot --nginx -d devops-intensive.it-incubator.io

🟢 Готово! Теперь у вас настроен продакшн-сервер с Docker, NGINX и SSL.

Теперь настроим рабочую директорию на сервере для наших приложений

1. Создайте рабочую директорию

sudo mkdir /var/www/devops-intensive.it-incubator.io sudo chown -R $USER:$USER /var/www/devops-intensive.it-incubator.io

2 Создадим там файл .env для наших приложений

sudo nano /var/www/devops-intensive.it-incubator.io/.env
DB_USER= DB_PASSWORD= DB_NAME= BACKEND_IMAGE= FRONTEND_IMAGE=

3. Создадим docker-compose.yml для наших приложений

sudo nano /var/www/devops-intensive.it-incubator.io/docker-compose.yml
services: db: image: postgres:16 environment: POSTGRES_USER: ${DB_USER} POSTGRES_PASSWORD: ${DB_PASSWORD} POSTGRES_DB: ${DB_NAME} volumes: - pgdata:/var/lib/postgresql/data healthcheck: test: ["CMD", "pg_isready", "-U", "${DB_USER}"] interval: 10s timeout: 5s retries: 5 backend: image: ${BACKEND_IMAGE} depends_on: db: condition: service_healthy environment: DB_HOST: db DB_PORT: 5432 DB_NAME: ${DB_NAME} DB_USER: ${DB_USER} DB_PASSWORD: ${DB_PASSWORD} ports: - "8090:3001" healthcheck: test: ["CMD", "curl", "-f", "http://localhost:3001/api/health"] interval: 10s timeout: 5s retries: 3 start_period: 5s frontend: image: ${FRONTEND_IMAGE} ports: - "8080:80" depends_on: backend: condition: service_healthy volumes: pgdata:
Last updated on