Цей репозиторій містить інфраструктурний код для автоматизації розгортання проекту Cinema Club.
CC-infra/
├── .github/
│ └── workflows/
│ ├── gitleaks.yml # Сканування секретів
│ ├── deploy_infra.yml # Розгортання інфраструктури (ручний запуск)
│ └── deploy_app.yml # Розгортання додатку (ручний запуск)
├── ansible/
│ ├── roles/
│ │ ├── infrastructure/ # Системні налаштування
│ │ │ └── tasks/
│ │ │ └── main.yml # Встановлення Docker, системних пакетів
│ │ └── application/ # Деплой додатку
│ │ ├── tasks/
│ │ │ └── main.yml # Docker Compose деплой, cleanup
│ │ └── templates/
│ │ └── docker-compose.yml.j2 # Шаблон без volumes
│ ├── deploy_infrastructure.yml # Playbook для інфраструктури
│ ├── deploy_application.yml # Playbook для додатку
│ └── inventory.ini # Інвентарь серверів
├── .gitleaks.toml # Конфігурація Gitleaks
└── README.md # Цей файл
Цей репозиторій забезпечує:
- Розділення інфраструктури та додатку - окремі workflow для системних налаштувань та деплою
- Docker-based deployment - код додатку запакований в Docker image
- Версіонування - кожен build отримує тег
latest+v{номер}(v1, v2, v3...) - Безпеку - сканування коду на наявність секретів за допомогою Gitleaks
- Ручне керування - всі деплої запускаються вручну (workflow_dispatch)
Додайте в Settings → Secrets and variables → Actions:
Для SSH доступу:
SERVER_IP- IP вашого сервера (наприклад:193.27.208.30)SSH_PORT- SSH порт (наприклад:15322)SSH_USER- користувач для деплою (рекомендовано:deploy)SSH_PRIVATE_KEY- приватний SSH ключ (ED25519)
Для Docker Hub:
DOCKER_USERNAME- ваш Docker Hub usernameDOCKER_PASSWORD- Docker Hub access token (не пароль!)
- Перейдіть в Actions → Deploy Infrastructure
- Натисніть Run workflow → Run workflow
- Очікуйте завершення (~2-5 хв)
Що відбувається:
- ✅ Оновлення системи Ubuntu
- ✅ Встановлення Docker, git, python3
- ✅ Створення директорій для додатку
- ✅ Налаштування користувача для Docker
Запускати: Тільки при новому сервері або оновленні системних компонентів
- Перейдіть в Actions → Deploy Application
- Натисніть Run workflow → Run workflow
- Очікуйте завершення (~3-7 хв)
Що відбувається:
- ✅ Збирає Docker image з кодом з репозиторію CinemaClub
- ✅ Теги:
latest+v{номер запуску}(v1, v2, v3...) - ✅ Пуш на Docker Hub:
ivansstef/cinemaclub - ✅ Деплой на сервер через Ansible
- ✅ Cleanup старих образів (залишає 3 останні)
- ✅ Перевірка доступності сайту
Запускати: Кожен раз при оновленні коду CinemaClub
http://your-server-ip:8080
- Налаштуйте
ansible/inventory.ini:
[webservers]
your-server-ip ansible_port=15322 ansible_user=deploy ansible_ssh_private_key_file=~/.ssh/deploy_key- Деплой інфраструктури:
cd ansible
ansible-playbook -i inventory.ini deploy_infrastructure.yml- Деплой додатку:
ansible-playbook -i inventory.ini deploy_application.yml -e "image_tag=latest"Репозиторій автоматично сканується на наявність секретів:
- При кожному push
- При створенні pull request
- Щоденно о 4:00 ранку
Цільовий сервер:
- Ubuntu 22.04 LTS
- Користувач
deployз NOPASSWD:ALL sudo - SSH доступ через ED25519 ключ
- Відкритий порт 8080 для HTTP
Для CI/CD (GitHub Actions):
- GitHub Secrets налаштовані (SSH + Docker Hub)
- Docker Hub акаунт з access token
Для локальної розробки:
- Ansible 2.9+
- SSH ключ для доступу до сервера
- Python 3.8+
- Тригери: Push, Pull Request, щоденно о 4:00
- Що робить: Сканує код на наявність секретів, паролів, токенів
- Статус: Постійно активний
- Тригери: Тільки ручний запуск (workflow_dispatch)
- Що робить:
- Підключається до сервера через SSH (користувач
deploy) - Встановлює системні залежності (Docker, git, Python)
- Налаштовує директорії та користувача
- НЕ деплоїть додаток!
- Підключається до сервера через SSH (користувач
- Коли запускати: При новому сервері або оновленні системи
- Налаштування: Потребує SSH Secrets
- Тригери: Тільки ручний запуск (workflow_dispatch)
- Що робить:
- Клонує репозиторій CinemaClub
- Збирає Docker image (nginx:1-alpine-slim + код)
- Теги:
latest+v{run_number}(v23, v24, v25...) - Пуш на Docker Hub:
ivansstef/cinemaclub - Ansible деплоїть через docker-compose (без volumes!)
- Cleanup старих образів (залишає 3 останні на сервері)
- Перевірка HTTP доступності
- Коли запускати: Після змін в коді CinemaClub
- Налаштування: Потребує SSH + Docker Hub Secrets
Всі workflow запускаються тільки вручну для контролю над деплоєм.
- Код в образі: Весь код CinemaClub запакований в Docker image (без volumes)
- Версії: Кожен build створює два теги:
latest+v{номер} - Cleanup: На сервері зберігаються тільки 3 останні образи (автоматичне видалення старих)
- Docker Hub: Всі версії зберігаються на Docker Hub (ручне видалення при потребі)
- Всі секрети в GitHub Secrets (ніколи в коді!)
- SSH ключ ED25519 для deploy користувача
- Docker Hub access token (не пароль!)
- NOPASSWD sudo тільки для deploy користувача
-
Інфраструктура (deploy_infra.yml):
- Запускається ПЕРШИЙ РАЗ на новому сервері
- Встановлює системні компоненти
- НЕ торкається додатку
-
Додаток (deploy_app.yml):
- Запускається ПРИ КОЖНОМУ ОНОВЛЕННІ коду
- Збирає новий Docker image з коду CinemaClub
- Деплоїть через Ansible (docker-compose down/pull/up)
- Чистить старі образи
Новий сервер:
1. Deploy Infrastructure (один раз)
2. Deploy Application (перший деплой)
Оновлення коду CinemaClub:
1. Deploy Application (тільки це)
Оновлення системних пакетів:
1. Deploy Infrastructure
- Створіть feature branch
- Внесіть зміни
- Переконайтесь, що Gitleaks не виявив секретів
- Створіть Pull Request
- Репозиторій додатку: CinemaClub
- Docker Hub: ivansstef/cinemaclub
- GitHub Actions: Workflows
- ✅ Інфраструктура: Розділена на окремі ролі (infrastructure/application)
- ✅ Docker: Версіонування + cleanup старих образів
- ✅ CI/CD: Ручні workflow для Deploy Infrastructure та Deploy Application
- ✅ Безпека: Gitleaks сканування + користувач deploy з обмеженими правами
- ✅ Production-ready: Деплой на 193.27.208.30:8080
Останнє оновлення: Листопад 2025 - Рефакторинг архітектури, розділення infra/app