LEMP-сервер с Let’s Encrypt SSL через NGINX Proxy Manager

В этом руководстве мы развернём LEMP-сервер с помощью готового Docker-образа webdevops/php-nginx:8.4, который уже включает необходимые расширения PHP и веб-сервер. Дополнительно подключим бесплатный SSL от Let’s Encrypt через NGINX Proxy Manager.

Что потребуется

  • Облачный сервер с Ubuntu
  • Установленные Docker и Docker Compose
  • Домен, настроенный на IP сервера
  • Открытые порты 80 и 443

Структура проекта

Создайте структуру проекта:

mkdir ~/lemp-docker && cd ~/lemp-docker
mkdir www configCode language: Bash (bash)

Создайте файл config/php.ini (опционально):

memory_limit = 256M
upload_max_filesize = 64M
post_max_size = 64M
display_errors = OnCode language: Bash (bash)

Создайте файл docker-compose.yml со следующим содержимым:

services:
  app:
    image: webdevops/php-nginx:8.2
    container_name: lemp-app
    restart: always
    ports:
      - "8081:80"
    volumes:
      - ./www:/app
      - ./config/php.ini:/opt/docker/etc/php/php.ini
    environment:
      - WEB_DOCUMENT_ROOT=/app
      - PHP_DISPLAY_ERRORS=1
    networks:
      - lemp-net

  db:
    image: mariadb:10.5
    container_name: lemp-db
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: mydb
      MYSQL_USER: myuser
      MYSQL_PASSWORD: mypass
    volumes:
      - db_data:/var/lib/mysql
    networks:
      - lemp-net

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: lemp-pma
    expose:
      - "80"
    environment:
      PMA_HOST: lemp-db
      MYSQL_ROOT_PASSWORD: rootpass
    networks:
      - lemp-net

  npm:
    image: jc21/nginx-proxy-manager:latest
    container_name: nginx-proxy-manager
    restart: always
    ports:
      - "80:80"
      - "443:443"
      - "81:81"
    volumes:
      - npm_data:/data
      - npm_letsencrypt:/etc/letsencrypt
    networks:
      - lemp-net

volumes:
  db_data:
  npm_data:
  npm_letsencrypt:

networks:
  lemp-net:
    driver: bridgeCode language: YAML (yaml)

Значения переменных MYSQL_ROOT_PASSWORD, MYSQL_DATABASE, MYSQL_USER и MYSQL_PASSWORD можно изменить под свои нужды. Эти параметры используются для начальной инициализации базы данных. Если вы хотите хранить их отдельно — создайте файл .env в корне проекта и перенесите туда значения, используя синтаксис ${MYSQL_PASSWORD} внутри docker-compose.yml.

Запуск контейнеров

Запустите контейнеры командой:

docker compose up -dCode language: Bash (bash)

Перейдите в панель управления NGINX Proxy Manager по адресу http://IP_СЕРВЕРА:81.

Авторизация по умолчанию:

  • Логин: admin@example.com
  • Пароль: changeme

Настройка домена и SSL

Добавьте новый Proxy Host в интерфейсе NPM:

  • Domain: example.com
  • Forward Hostname / IP: lemp-app
  • Forward Port: 80
  • Enable SSL → Request a new certificate
  • Force SSL → включить

После сохранения сайт будет доступен по адресу https://example.com с автоматически выпущенным сертификатом Let’s Encrypt.

Доступ к phpMyAdmin

Чтобы настроить доступ к phpMyAdmin, добавьте отдельный Proxy Host:

  • Domain: db.example.com
  • Forward Hostname / IP: lemp-pma
  • Forward Port: 80
  • Enable SSL → Request a new certificate
  • Force SSL → включить

После этого откройте https://db.example.com и авторизуйтесь с логином myuser и паролем mypass, либо используйте root.

Установка CMS

Вы можете загрузить установочные файлы своей CMS (например, WordPress) в директорию www. Откройте в браузере https://example.com — начнётся установка.

Для подключения к базе данных используйте параметры:

  • Хост: lemp-db
  • Имя базы: mydb
  • Пользователь: myuser
  • Пароль: mypass

Удалите ранее созданный файл index.php с phpinfo(), если он ещё присутствует, чтобы не мешал установке.

Остановка и удаление

Остановка всех контейнеров:

docker compose downCode language: Bash (bash)

Удаление вместе с томами:

docker compose down -vCode language: Bash (bash)

Всё вышеописанное может быть выполнено нашей службой поддержки при заказе облачного сервера (VPS) в Unihost.kz. Мы поможем с развёртыванием окружения, настройкой Docker и подключением SSL.