Развертывание веб-приложения с Docker Compose и Ansible

Задание

Автоматизировать развертывание отказоустойчивого веб-приложения с использованием:

  • Docker Compose для оркестрации контейнеров

  • Ansible для автоматизации развертывания

  • Nginx в качестве reverse proxy с балансировкой нагрузки

  • MySQL/MariaDB с персистентным хранилищем

  • PHPMyAdmin для управления БД

Структура решения

  1. Docker Compose конфигурация

  2. Ansible роль для автоматизации

  3. Настройка Nginx как reverse proxy

Docker Compose Конфигурация

Пример файла docker-compose.yml:

version: '3.8'

services:
  nginx:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
    depends_on:
      - web1
      - web2

  web1:
    image: your-web-app-image  # Заменить на Flask/WP образ
    environment:
      - DB_HOST=db
    networks:
      - app-network

  web2:
    image: your-web-app-image  # Заменить на Flask/WP образ
    environment:
      - DB_HOST=db
    networks:
      - app-network

  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: app_db
    volumes:
      - db_data:/var/lib/mysql
    networks:
      - app-network

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    environment:
      PMA_HOST: db
    ports:
      - "8080:80"
    depends_on:
      - db

volumes:
  db_data:

networks:
  app-network:

Ansible Роль

Структура роли (roles/deploy/tasks/main.yml):

- name: Install Docker dependencies
  apt:
    name: "{{ item }}"
    state: present
  loop:
    - apt-transport-https
    - ca-certificates
    - curl
    - software-properties-common

- name: Add Docker GPG key
  apt_key:
    url: https://download.docker.com/linux/ubuntu/gpg
    state: present

- name: Add Docker repository
  apt_repository:
    repo: deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable
    state: present

- name: Install Docker
  apt:
    name: docker-ce
    state: present

- name: Install Docker Compose
  get_url:
    url: https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-linux-x86_64
    dest: /usr/local/bin/docker-compose
    mode: '0755'

- name: Copy docker-compose files
  copy:
    src: docker-compose.yml
    dest: /opt/app/
    nginx.conf:
    src: nginx.conf
    dest: /opt/app/

- name: Start containers
  command: docker-compose up -d
  args:
    chdir: /opt/app/

- name: Restore DB from dump
  community.docker.docker_container_exec:
    container: db
    command: sh -c "mysql -u root -psecret app_db < /dump.sql"
  when: dump_file_exists

Настройка Nginx как Reverse Proxy

Пример nginx.conf:

events {}
http {
    upstream backend {
        server web1:8000;
        server web2:8000;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://backend;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}

Важные замечания

  1. Для WordPress заменить your-web-app-image на wordpress:php8.1-apache

  2. Настроить правильные порты для приложения

  3. Добавить health-check для контейнеров

  4. Использовать секреты для чувствительных данных (env-файлы)

  5. Настроить SSL/TLS при необходимости