From cbd381f910e92d353842c7cabb57258ee239e3d3 Mon Sep 17 00:00:00 2001 From: LeoR156 <277007013+LeoR156@users.noreply.github.com> Date: Fri, 10 Jul 2026 10:25:49 +0500 Subject: [PATCH] Add Ansible playbook --- playbook.yml | 176 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 176 insertions(+) create mode 100644 playbook.yml diff --git a/playbook.yml b/playbook.yml new file mode 100644 index 0000000..1a6c877 --- /dev/null +++ b/playbook.yml @@ -0,0 +1,176 @@ +- name: Развертывание бота Stan + hosts: servers + become: true + + + vars_files: + - vars.yml + + tasks: + - name: Установка базовых утилит + apt: + name: + - ca-certificates + - curl + - git + - htop + - ufw + state: present + update_cache: true + + - name: Создаем директорию для GPG-ключа Docker + file: + path: /etc/apt/keyrings + state: directory + mode: '0755' + + - name: Скачивание официального GPG-ключа Docker + get_url: + url: https://download.docker.com/linux/ubuntu/gpg + dest: /etc/apt/keyrings/docker.asc + mode: 'a+r' + + - name: Добавление репозитория Docker + apt_repository: + repo: "deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu {{ ansible_facts['distribution_release'] }} stable" + state: present + filename: docker + + - name: Установка Docker, Nginx и Certbot + apt: + name: + - nginx + - docker-ce + - docker-ce-cli + - docker-buildx-plugin + - docker-compose-plugin + - python3-docker + - certbot + state: present + update_cache: true + + - name: Клонируем репозиторий бота + git: + repo: 'https://github.com/LeoR156/Stan-Ansible' + dest: "{{ bot_dir }}" + force: yes + + - name: Создаем директорию для базы данных на сервере + file: + path: "{{ bot_dir }}/data" + state: directory + mode: '0755' + + - name: Собираем Docker-образ локально + community.docker.docker_image: + name: stan + tag: latest + source: build + build: + path: "{{ bot_dir }}" + nocache: true + + - name: Копируем файл .env на сервер + copy: + src: .env + dest: "{{ bot_dir }}/.env" + + - name: Запускаем контейнер бота + community.docker.docker_container: + name: "tg_bot_stan" + image: stan:latest + state: started + restart_policy: always + ports: + - "127.0.0.1:8813:8813" + env_file: "{{ bot_dir }}/.env" + volumes: + - "{{ bot_dir }}/data:/app/data" + + - name: Настройка UFW - Запрещаем все входящие + ufw: + policy: deny + direction: incoming + + - name: Настройка UFW - Разрешаем все исходящие + ufw: + policy: allow + direction: outgoing + + - name: Настройка UFW - Разрешаем порты 22, 80, 443 + ufw: + rule: allow + port: "{{ item }}" + proto: tcp + loop: + - '22' + - '80' + - '443' + + - name: Включаем UFW + ufw: + state: enabled + + - name: Проверяем, есть ли SSL сертификат + stat: + path: "/etc/letsencrypt/live/{{ domain_name }}/fullchain.pem" + register: cert_file + + - name: Останавливаем Nginx перед получением сертификата + service: + name: nginx + state: stopped + when: not cert_file.stat.exists + + - name: Получаем SSL сертификат (Standalone режим) + command: > + certbot certonly --standalone + --non-interactive + --agree-tos + --email {{ certbot_email }} + -d {{ domain_name }} + when: not cert_file.stat.exists + + - name: Удаляем дефолтный конфиг Nginx + file: + path: /etc/nginx/sites-enabled/default + state: absent + + - name: Копируем шаблон конфигурации Nginx + template: + src: templates/bot.conf.j2 + dest: "/etc/nginx/sites-available/{{ domain_name }}.conf" + notify: Reload Nginx + + - name: Активируем конфиг Nginx (симлинк) + file: + src: "/etc/nginx/sites-available/{{ domain_name }}.conf" + dest: "/etc/nginx/sites-enabled/{{ domain_name }}.conf" + state: link + notify: Reload Nginx + + - name: Запускаем и включаем Nginx в автозагрузку + service: + name: nginx + state: started + enabled: true + + + - name: Активируем Telegram Webhook + shell: > + source {{ bot_dir }}/.env && + curl -s "https://api.telegram.org/bot${STAN}/setWebhook?url=https://{{ domain_name }}/bot${STAN}/" + args: + executable: /bin/bash + register: webhook_result + changed_when: false + + - name: Выводим результат активации Webhook в консоль + debug: + msg: "Ответ от Telegram: {{ webhook_result.stdout }}" + + handlers: + - name: Reload Nginx + service: + name: nginx + state: reloaded