Перейти к содержанию

Обзор развертывания LEMP на сервере

Предпосылки и предварительные требования

  • Сервер, работающий под управлением Ubuntu (или любой другой Linux‑дистрибутив на основе Debian).
  • Установлены и настроены Docker и Docker Compose.
  • У пользователя есть права суперпользователя (root или sudo).
  • На диске должно быть достаточно свободного места для размещения файлов данных и веб‑содержимого.

Структура файлов и каталогов

/root/data          – каталог для хранения данных MySQL
/root/webroot       – каталог для размещения веб‑содержимого (доступен в контейнере как /var/www/html)
data/nginx/         – каталог для файлов конфигурации и переменных certbot
    nginx-certbot.env – переменные окружения для certbot
    user_conf.d/     – пользовательские конфигурации Nginx
nginx_secrets (docker‑volume)
    – хранит сертификаты Let's Encrypt
compose.yml         – файл Docker Compose, генерируемый из шаблона

Все каталоги /root/data и /root/webroot создаются с правами 0755 и владельцем root.

Права доступа и безопасность

  • Каталоги /root/data и /root/webroot доступны только пользователю root и группы root. Это защищает данные от случайного изменения.
  • Внутри контейнера LEMP используется переменная MYSQL_ROOT_PASSWORD, которую задаёт администратор. Она должна храниться в надёжном месте (не в открытом тексте).
  • Сертификаты Let's Encrypt находятся в внешнем volume nginx_secrets. Доступ к нему имеет только пользователь root и процессы контейнера Nginx‑certbot.

Базы данных

  • В контейнере MySQL 8.3 (из образа adhocore/lemp:8.3) сохраняются данные в /root/data, который монтируется как /var/lib/mysql.
  • Порт 3306 контейнера проброшен на хост‑порт 3306, что позволяет подключаться к базе из внешних приложений.
  • Дополнительно проброшен порт 5432 (PostgreSQL). Если база не используется, порт можно отключить.

Контейнеры Docker и их запуск

Создание сети

docker network create lemp-net

Контейнер LEMP

docker run -d \
  --name lemp-stack \
  --network lemp-net \
  -p 88:80 \
  -p 3306:3306 \
  -p 5432:5432 \
  -v /root/data:/var/lib/mysql \
  -v /root/webroot:/var/www/html \
  -e MYSQL_ROOT_PASSWORD=YOUR_PASSWORD \
  --restart always \
  adhocore/lemp:8.3
- Порты
- 88:80 – HTTP‑доступ к веб‑страницам
- 3306:3306 – доступ к MySQL
- 5432:5432 – доступ к PostgreSQL (если нужно)

  • Volumes
  • /root/data:/var/lib/mysql – данные базы
  • /root/webroot:/var/www/html – файлы веб‑сайта

Docker Compose – прокси с certbot

Файл compose.yml (сгенерированный из шаблона) выглядит так:

volumes:
  nginx_secrets:
    external: true

services:
  nginx:
    image: jonasal/nginx-certbot:latest
    restart: unless-stopped
    environment:
      - CERTBOT_EMAIL=hkadm@hostkey.com
    env_file:
      - /data/nginx/nginx-certbot.env
    network_mode: host
    volumes:
      - nginx_secrets:/etc/letsencrypt
      - /data/nginx/user_conf.d:/etc/nginx/user_conf.d

Запуск:

docker compose -f compose.yml up -d

Прокси серверы

  • Nginx‑certbot (jonasal/nginx-certbot:latest) работает в режиме host‑network, поэтому слушает порты 80 и 443 напрямую.
  • Конфигурации пользователя размещаются в /data/nginx/user_conf.d. Это удобно для создания виртуальных хостов и редиректов.
  • Сертификаты автоматически получаются и обновляются через Certbot, храниться они в внешнем volume nginx_secrets.

Настройки прав, запуск, остановка и обновление

Действие Команда
Запустить LEMP‑контейнер docker start lemp-stack
Остановить LEMP‑контейнер docker stop lemp-stack
Обновить образ LEMP docker pull adhocore/lemp:8.3
docker restart lemp-stack
Запустить прокси‑контейнер docker compose -f compose.yml up -d
Остановить прокси‑контейнер docker compose -f compose.yml down
Обновить образ nginx‑certbot docker pull jonasal/nginx-certbot:latest
docker compose -f compose.yml up -d

Для полного обновления обоих контейнеров можно выполнить:

docker pull adhocore/lemp:8.3
docker pull jonasal/nginx-certbot:latest
docker compose -f compose.yml up -d

Обратите внимание, что все команды выполняются от имени пользователя с правами root (или с использованием sudo).

question_mark
Я могу вам чем-то помочь?
question_mark
ИИ Помощник ×