Files
2026-07-10 10:25:49 +05:00

177 lines
4.9 KiB
YAML

- 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