diff --git a/README.md b/README.md index bb32931..bbcd24c 100644 --- a/README.md +++ b/README.md @@ -1,93 +1,354 @@ -# Деплой инфраструктуры Olimp +# Ansible Playbook для развертывания инфраструктуры Olimp -## Структура проекта -Infra/ -├── inventories/ # Конфигурация хостов -├── group_vars/ # Переменные по группам -├── roles/ # Ansible роли -├── olimp-deploy.yml # Основной плейбук -├── vault.yml # Секреты (зашифровано) -└── README.md # Документация +Данный проект содержит Ansible playbook для автоматизированного развертывания и настройки серверной инфраструктуры, включая базовую настройку контейнеров, установку Docker и развертывание различных сервисов. -Infra/ +## 🏗️ Структура проекта +/opt/servers/Olimp/ +├── olimp-deploy.yml # Основной плейбук ├── inventories/ -│ └── hosts.yml +│ └── hosts # Файл инвентаризации ├── group_vars/ -│ ├── all.yml -│ └── gateway.yml +│ └── all.yml # Общие переменные для всех хостов ├── roles/ -│ ├── proxmox_lxc/ -│ │ └── tasks/ -│ │ └── main.yml -│ ├── base_setup/ -│ │ ├── tasks/ -│ │ │ ├── main.yml -│ │ │ └── ssh.yml -│ │ └── handlers/ -│ │ └── main.yml -│ ├── docker/ -│ │ └── tasks/ -│ │ └── main.yml -│ ├── heimdall/ -│ │ └── tasks/ -│ │ └── main.yml -│ └── npm/ -│ └── tasks/ -│ └── main.yml -├── olimp-deploy.yml -├── vault.yml +│ ├── base_setup/ # Базовая настройка хостов +│ ├── docker/ # Установка Docker и Docker Compose +│ ├── npm/ # Nginx Proxy Manager +│ ├── heimdall/ # Heimdall - дашборд приложений +│ ├── mealie/ # Mealie - менеджер рецептов +│ └── bookstack/ # Bookstack - система документации └── README.md -## Использование - -### Запуск полного деплоя: -```bash -ansible-playbook -i inventories/hosts.yml olimp-deploy.yml --ask-vault-pass - -Запуск отдельных компонентов: -bash -# Только создание контейнера -ansible-playbook -i inventories/hosts.yml olimp-deploy.yml --tags create_lxc --ask-vault-pass -# Только базовая настройка -ansible-playbook -i inventories/hosts.yml olimp-deploy.yml --tags base_setup -# Только установка Docker -ansible-playbook -i inventories/hosts.yml olimp-deploy.yml --tags docker -# Только Heimdall -ansible-playbook -i inventories/hosts.yml olimp-deploy.yml --tags heimdall - -Роли - -proxmox_lxc - Создание LXC контейнеров в Proxmox - -base_setup - Базовая настройка ОС - -docker - Установка Docker - -heimdall - Развертывание Heimdall - -Порядок развертывания -Создание LXC контейнеров - -Базовая настройка ОС - -Установка Docker - -Развертывание сервисов - text -## 🚀 КАК ЗАПУСТИТЬ: +## 🎯 Инвентаризация -1. **Создайте структуру каталогов** в GitLab репозитории -2. **Добавьте все файлы** в соответствующие каталоги -3. **Зашифруйте vault.yml:** - ```bash - ansible-vault encrypt vault.yml -Запустите тестовый прогон: +Файл `inventories/hosts`: +```ini +[infra] +gateway ansible_host=192.168.1.221 int_ip=192.168.1.221 +data ansible_host=192.168.1.222 int_ip=192.168.1.222 +📋 Предварительные требования +Целевые хосты должны быть доступны по SSH + +Ansible установлен на управляющей машине + +Python установлен на целевых хостах + +Права sudo для пользователя, выполняющего развертывание + +📦 Установка зависимостей +bash +# Установка необходимых коллекций Ansible +ansible-galaxy collection install community.docker +🚀 Основной плейбук: olimp-deploy.yml +yaml +--- +- hosts: all + roles: + - { role: base_setup, tags: deploy_base } + +- hosts: gateway + roles: + - { role: docker, tags: deploy_docker } + - { role: npm, tags: deploy_npm } + - { role: heimdall, tags: deploy_heimdall } + +- hosts: data + roles: + - { role: docker, tags: deploy_docker } + - { role: mealie, tags: deploy_mealie } + - { role: bookstack, tags: deploy_bookstack } +🎮 Запуск плейбука +Полное развертывание +bash +ansible-playbook -i inventories/hosts olimp-deploy.yml +Выборочное развертывание по тегам +bash +# Базовая настройка всех хостов +ansible-playbook -i inventories/hosts olimp-deploy.yml --tags deploy_base + +# Установка Docker на конкретный хост +ansible-playbook -i inventories/hosts olimp-deploy.yml --tags deploy_docker --limit data + +# Установка конкретного сервиса +ansible-playbook -i inventories/hosts olimp-deploy.yml --tags deploy_mealie --limit data +ansible-playbook -i inventories/hosts olimp-deploy.yml --tags deploy_bookstack --limit data +ansible-playbook -i inventories/hosts olimp-deploy.yml --tags deploy_npm --limit gateway +ansible-playbook -i inventories/hosts olimp-deploy.yml --tags deploy_heimdall --limit gateway +🔧 Детальное описание ролей +Роль: base_setup +Тег: deploy_base + +Назначение: Базовая настройка всех хостов инфраструктуры. + +Задачи: + +Update and upgrade apt packages - обновление пакетов и кэша apt + +Install base packages - установка базовых пакетов из переменной base_packages + +Configure timezone - настройка часового пояса из переменной timezone + +Configure locale - настройка локали из переменной system_locale + +Set default locale - установка системной локали + +Install Python requests library - установка библиотеки Python3 requests для работы модулей Ansible + +Источник переменных: group_vars/all.yml + +Роль: docker +Тег: deploy_docker + +Назначение: Установка Docker и Docker Compose на целевые хосты. + +Задачи: + +Install Docker dependencies - установка зависимостей Docker + +Add Docker GPG key - добавление GPG ключа Docker + +Add Docker repository - добавление официального репозитория Docker + +Install Docker - установка Docker CE и компонентов + +Install Docker Compose - установка Docker Compose Plugin + +Start and enable Docker service - запуск и включение службы Docker + +Verify Docker installation - проверка установки Docker и Docker Compose + +Особенности: Использует официальные репозитории Docker для установки последних версий. + +Роль: npm (Nginx Proxy Manager) +Тег: deploy_npm + +Назначение: Установка Nginx Proxy Manager на хост gateway. + +Задачи: + +Create directories for NPM - создание директорий для данных NPM + +Deploy NPM docker-compose.yml - развертывание docker-compose файла из шаблона + +Start NPM container - запуск контейнера NPM + +Check NPM container status - проверка статуса контейнера + +Порты: 80, 443, 81 +Web-интерфейс: http://gateway_ip:81 + +Источник переменных: group_vars/all.yml - npm_base_dir, npm_data_dir, npm_letsencrypt_dir + +Роль: heimdall +Тег: deploy_heimdall + +Назначение: Установка Heimdall - дашборда для быстрого доступа к приложениям. + +Задачи: + +Create directories for Heimdall - создание директорий для данных Heimdall + +Deploy Heimdall docker-compose.yml - развертывание docker-compose файла + +Start Heimdall container - запуск контейнера Heimdall + +Check Heimdall container status - проверка статуса контейнера + +Порт: 45131 +Web-интерфейс: http://gateway_ip:45131 + +Источник переменных: group_vars/all.yml - heimdall_base_dir, heimdall_config_dir, heimdall_port + +Роль: mealie +Тег: deploy_mealie + +Назначение: Установка Mealie - менеджера рецептов на хост data. + +Задачи: + +Create Mealie directory structure - создание директорий в /mnt/mealie + +Set proper ownership for Mealie data directory - установка прав владельца для директории данных + +Deploy Mealie docker-compose.yml - развертывание docker-compose файла + +Pull Mealie Docker image - загрузка образа Mealie + +Start Mealie container - запуск контейнера Mealie + +Check Mealie container status - проверка статуса контейнера + +Порт: 45132 +Web-интерфейс: http://data_ip:45132 +Использует: SQLite базу данных по умолчанию + +Источник переменных: group_vars/all.yml - mealie_base_dir, mealie_data_dir, mealie_port + +Роль: bookstack +Тег: deploy_bookstack + +Назначение: Установка Bookstack - системы для ведения документации на хост data. + +Задачи: + +Create Bookstack directory structure - создание директорий в /mnt/bookstack + +Deploy Bookstack docker-compose.yml - развертывание docker-compose файла + +Start Bookstack services - запуск контейнеров Bookstack и MariaDB + +Check Bookstack container status - проверка статуса контейнеров + +Порт: 45131 +Web-интерфейс: http://data_ip:45131 +Использует: MariaDB базу данных + +Особенности: Сохраняет существующие данные из /mnt/bookstack + +Источник переменных: group_vars/all.yml - bookstack_base_dir, bookstack_config_dir, bookstack_uploads_dir, bookstack_db_dir, bookstack_port + +⚙️ Переменные конфигурации +Файл group_vars/all.yml содержит все общие переменные: + +yaml +# Общие настройки для всех хостов +timezone: Asia/Yekaterinburg +system_locale: ru_RU.UTF-8 + +# Базовые пакеты для установки на всех хостах +base_packages: + - curl + - wget + - gnupg + - ca-certificates + - software-properties-common + - tree + - htop + - nano + - git + - apt-transport-https + - net-tools + - dnsutils + - iputils-ping + - traceroute + +# Настройки Docker сервисов + +# NPM (Nginx Proxy Manager) +npm_base_dir: "/opt/npm" +npm_data_dir: "/opt/npm/data" +npm_letsencrypt_dir: "/opt/npm/letsencrypt" + +# Heimdall +heimdall_base_dir: "/opt/heimdall" +heimdall_config_dir: "/opt/heimdall/config" +heimdall_port: "45131" + +# Mealie +mealie_base_dir: "/mnt/mealie" +mealie_data_dir: "/mnt/mealie/data" +mealie_port: "45132" + +# Bookstack +bookstack_base_dir: "/mnt/bookstack" +bookstack_config_dir: "/mnt/bookstack/config" +bookstack_uploads_dir: "/mnt/bookstack/uploads" +bookstack_db_dir: "/mnt/bookstack/db" +bookstack_port: "45131" +bookstack_db_password: "secure_password_123" +bookstack_db_root_password: "secure_root_password_123" +🏛️ Архитектура решения +Хост Gateway (192.168.1.221) +Nginx Proxy Manager - порты 80, 443, 81 + +Обратный прокси для управления доменами и SSL + +Heimdall - порт 45131 + +Дашборд для быстрого доступа ко всем сервисам + +Хост Data (192.168.1.222) +Mealie - порт 45132 + +Менеджер рецептов с возможностью импорта и организации + +Bookstack - порт 45131 + +Система документации с поддержкой книг, глав и страниц + +📊 Мониторинг и логи +Проверка статуса сервисов +bash +# На хосте gateway +docker ps --filter name=npm --filter name=heimdall + +# На хосте data +docker ps --filter name=mealie --filter name=bookstack +Просмотр логов +bash +# Просмотр логов конкретного сервиса +docker logs mealie -f --tail 50 +docker logs bookstack-mnemo -f --tail 50 + +# Просмотр логов через docker compose +cd /mnt/mealie && docker compose logs +cd /mnt/bookstack && docker compose logs +💾 Резервное копирование +Данные всех сервисов сохраняются в смонтированных директориях: + +Mealie: /mnt/mealie/data + +Bookstack: /mnt/bookstack/config, /mnt/bookstack/uploads, /mnt/bookstack/db + +Для резервного копирования достаточно архивировать эти директории. bash -ansible-playbook -i inventories/hosts.yml olimp-deploy.yml --ask-vault-pass --check -Запустите деплой: +# Пример резервного копирования +tar -czf mealie_backup_$(date +%Y%m%d).tar.gz /mnt/mealie/data +tar -czf bookstack_backup_$(date +%Y%m%d).tar.gz /mnt/bookstack +🔄 Обновление сервисов +bash +# Обновление всех сервисов на хосте +cd /path/to/service +docker compose pull +docker compose up -d + +# Или через Ansible +ansible-playbook -i inventories/hosts olimp-deploy.yml --tags deploy_mealie,deploy_bookstack --limit data +🛠️ Устранение неисправностей +Проверка подключения +bash +ansible -i inventories/hosts all -m ping +Проверка синтаксиса плейбука +bash +ansible-playbook -i inventories/hosts olimp-deploy.yml --syntax-check +Запуск в режиме отладки +bash +ansible-playbook -i inventories/hosts olimp-deploy.yml --tags deploy_mealie -vvv +Проверка переменных +bash +ansible -i inventories/hosts all -m debug -a "var=hostvars[inventory_hostname]" +🔒 Безопасность +Все пароли и чувствительные данные должны храниться в зашифрованном виде с помощью Ansible Vault + +Регулярно обновляйте образы контейнеров для получения исправлений безопасности + +Настройте брандмауэр для ограничения доступа к портам bash -ansible-playbook -i inventories/hosts.yml olimp-deploy.yml --ask-vault-pass \ No newline at end of file +# Использование Ansible Vault для шифрования секретов +ansible-vault encrypt group_vars/secrets.yml +🚀 Дополнительные возможности +Проект может быть расширен добавлением новых ролей для: + +Мониторинга (Prometheus, Grafana) + +Резервного копирования + +Централизованного логирования + +Автоматического обновления контейнеров + +📝 Лицензия +[Указать лицензию проекта] \ No newline at end of file diff --git a/group_vars/gateway_servers.yml b/group_vars/gateway_servers.bkp similarity index 100% rename from group_vars/gateway_servers.yml rename to group_vars/gateway_servers.bkp diff --git a/roles/gateway/handlers/main.yml b/roles/gateway/handlers/main.yml deleted file mode 100644 index 07fb442..0000000 --- a/roles/gateway/handlers/main.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -- name: restart docker - systemd: - name: docker - state: restarted \ No newline at end of file diff --git a/roles/gateway/tasks/main.yml b/roles/gateway/tasks/main.yml deleted file mode 100644 index 53bf023..0000000 --- a/roles/gateway/tasks/main.yml +++ /dev/null @@ -1,93 +0,0 @@ ---- -- name: Install system dependencies - apt: - pkg: - - aptitude - - apt-transport-https - - ca-certificates - - curl - - software-properties-common - - python3-pip - - virtualenv - - python3-setuptools - state: latest - update_cache: true - -- name: Add Docker GPG apt Key - apt_key: - url: https://download.docker.com/linux/ubuntu/gpg - state: present - -- name: Add Docker Repository - apt_repository: - repo: deb https://download.docker.com/linux/ubuntu noble stable - state: present - -- name: Install Docker CE - apt: - name: docker-ce - state: latest - update_cache: true - -- name: Install Docker Python module - pip: - name: docker - -- name: Configure Docker for LXC compatibility - copy: - content: | - { - "storage-driver": "vfs" - } - dest: /etc/docker/daemon.json - notify: restart docker - -- name: Ensure Docker daemon is running - systemd: - name: docker - state: started - enabled: yes - -- name: Create directories for services - file: - path: "{{ item.path }}" - state: directory - mode: '0755' - loop: - - { path: "{{ heimdall.config_dir }}" } - - { path: "{{ npm.data_dir }}" } - - { path: "{{ npm.letsencrypt_dir }}" } - -- name: Pull Docker images - community.docker.docker_image: - name: "{{ item.image }}" - source: pull - loop: - - { image: "{{ heimdall.image }}" } - - { image: "{{ npm.image }}" } - -- name: Deploy Heimdall container - community.docker.docker_container: - name: heimdall - image: "{{ heimdall.image }}" - state: started - restart_policy: unless-stopped - ports: - - "{{ heimdall.port }}" - volumes: - - "{{ heimdall.config_dir }}:/config" - env: - PUID: "{{ heimdall.user_id }}" - PGID: "{{ heimdall.group_id }}" - TZ: "{{ heimdall.timezone }}" - -- name: Deploy NPM container - community.docker.docker_container: - name: npm - image: "{{ npm.image }}" - state: started - restart_policy: unless-stopped - ports: "{{ npm.ports }}" - volumes: - - "{{ npm.data_dir }}:/data" - - "{{ npm.letsencrypt_dir }}:/etc/letsencrypt" \ No newline at end of file