stuff
This commit is contained in:
parent
86d48f70f5
commit
c67cfbd3e8
34 changed files with 9034 additions and 239 deletions
|
|
@ -1,39 +0,0 @@
|
||||||
# Forgejo CI/CD для Mnemo Cards
|
|
||||||
|
|
||||||
## Быстрый старт
|
|
||||||
|
|
||||||
1. **Настройте секреты в Forgejo:**
|
|
||||||
```
|
|
||||||
DEPLOY_SSH_PRIVATE_KEY # SSH ключ для деплоя
|
|
||||||
```
|
|
||||||
|
|
||||||
2. **Протестируйте локально:**
|
|
||||||
```bash
|
|
||||||
./test_ci_locally.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
3. **Push в main/master:**
|
|
||||||
```bash
|
|
||||||
git push origin main
|
|
||||||
```
|
|
||||||
|
|
||||||
## Workflows
|
|
||||||
|
|
||||||
- `ci-main.yml` - Главный pipeline
|
|
||||||
- `ci-backend.yml` - Backend (Dart)
|
|
||||||
- `ci-web.yml` - Web app (Flutter)
|
|
||||||
- `ci-mobile.yml` - Mobile app (Flutter)
|
|
||||||
- `cd-deploy.yml` - Автоматический деплой
|
|
||||||
- `code-quality.yml` - Контроль качества
|
|
||||||
- `release.yml` - Автоматические релизы
|
|
||||||
|
|
||||||
## Создание релиза
|
|
||||||
|
|
||||||
```bash
|
|
||||||
git tag v1.2.3
|
|
||||||
git push origin v1.2.3
|
|
||||||
```
|
|
||||||
|
|
||||||
## Подробная документация
|
|
||||||
|
|
||||||
Смотрите [CI_CD_SETUP.md](../CI_CD_SETUP.md) для полной информации.
|
|
||||||
1
.forgejo/workflows
Symbolic link
1
.forgejo/workflows
Symbolic link
|
|
@ -0,0 +1 @@
|
||||||
|
../tools/ci
|
||||||
234
README.md
234
README.md
|
|
@ -1,215 +1,61 @@
|
||||||
# Mnemo Cards - Мобильное приложение для изучения языков
|
# Mnemo Cards
|
||||||
|
|
||||||
Полнофункциональная система для изучения языков, включающая мобильное приложение, веб-сервер, телеграм-бот и веб-игры.
|
Проект для изучения языков с использованием мнемоники.
|
||||||
|
|
||||||
## 🏗️ Структура проекта
|
## Структура проекта
|
||||||
|
|
||||||
Проект состоит из нескольких взаимосвязанных компонентов:
|
- `mnemo_cards/` - мобильное приложение (Flutter)
|
||||||
|
- `mnemo_cards_web_v2/` - веб версия (Flutter Web)
|
||||||
|
- `mnemo_cards_backend/` - backend сервер (Dart)
|
||||||
|
- `mnemo_cards_common/` - общие библиотеки
|
||||||
|
- `@tools/` - инструменты разработки и деплоя
|
||||||
|
|
||||||
### 📱 Мобильное приложение (`mnemo_cards/`)
|
## Быстрый старт
|
||||||
Основное Flutter приложение для iOS и Android с функциями:
|
|
||||||
- Изучение языков через карточки
|
|
||||||
- Интеграция с Firebase (Firestore, Analytics, Crashlytics)
|
|
||||||
- Система покупок (YooKassa, In-App Purchase)
|
|
||||||
- Реклама (Yandex Mobile Ads)
|
|
||||||
- Локальные уведомления
|
|
||||||
- Интеграция с веб-играми через WebView
|
|
||||||
- Поддержка Telegram Web App
|
|
||||||
|
|
||||||
**Технологии:** Flutter, BLoC, Auto Route, Firebase, WebView
|
### Разработка
|
||||||
|
|
||||||
### 🌐 Веб-приложение (`mnemo_cards_web/`)
|
|
||||||
Веб-версия Flutter приложения с функциями:
|
|
||||||
- Изучение языков через карточки в браузере
|
|
||||||
- Интеграция с Firebase (Firestore, Analytics, Crashlytics)
|
|
||||||
- Адаптивный дизайн для различных устройств
|
|
||||||
- Синхронизация данных с мобильным приложением
|
|
||||||
- Поддержка PWA (Progressive Web App)
|
|
||||||
- Интеграция с веб-играми
|
|
||||||
|
|
||||||
**Технологии:** Flutter Web, BLoC, Auto Route, Firebase, PWA
|
|
||||||
|
|
||||||
### 🔧 Общие компоненты (`mnemo_cards_common/`)
|
|
||||||
Общие DTO и утилиты для мобильного приложения:
|
|
||||||
- Модели данных
|
|
||||||
- Сетевые утилиты
|
|
||||||
- JSON сериализация
|
|
||||||
- Криптографические функции
|
|
||||||
|
|
||||||
### 🖥️ Backend сервер (`mnemo_cards_backend/`)
|
|
||||||
Dart сервер на базе Shelf framework:
|
|
||||||
- REST API для мобильного приложения
|
|
||||||
- База данных Isar
|
|
||||||
- Интеграция с Google APIs
|
|
||||||
- Система платежей YooKassa
|
|
||||||
- Периодические задачи
|
|
||||||
- Swagger документация
|
|
||||||
|
|
||||||
**Технологии:** Dart, Shelf, Isar, Google APIs
|
|
||||||
|
|
||||||
### 🔧 Backend общие компоненты (`mnemo_cards_common_backend/`)
|
|
||||||
Общие компоненты для backend:
|
|
||||||
- Модели данных
|
|
||||||
- Утилиты для работы с Isar
|
|
||||||
- Общие бизнес-логика
|
|
||||||
|
|
||||||
### 🤖 Telegram бот (`mnemo_cards_telegram_bot/`)
|
|
||||||
Telegram бот для управления приложением:
|
|
||||||
- Административные функции
|
|
||||||
- Распространение APK файлов
|
|
||||||
- Управление пользователями
|
|
||||||
- Интеграция с основным backend
|
|
||||||
|
|
||||||
**Технологии:** Dart, Teledart, Isar
|
|
||||||
|
|
||||||
### 🎮 Веб-игры и WebView Bridge (`games/`)
|
|
||||||
Система веб-игр с безопасной коммуникацией через WebView:
|
|
||||||
- **Host приложение** - Flutter приложение-контейнер
|
|
||||||
- **Web приложения** - Flutter Web игры (bus_word_game, web_app1)
|
|
||||||
- **Bridge Core** - система безопасной коммуникации
|
|
||||||
- **Payloads** - типизированные сообщения между приложениями
|
|
||||||
|
|
||||||
**Архитектура:**
|
|
||||||
- Изолированные payload'ы для каждого приложения
|
|
||||||
- JavaScript bridge для WebView коммуникации
|
|
||||||
- Типобезопасная обработка сообщений
|
|
||||||
- Поддержка сложных сценариев (авторизация, quiz, нативные диалоги)
|
|
||||||
|
|
||||||
**Технологии:** Flutter Web, WebView, JavaScript Bridge, Melos
|
|
||||||
|
|
||||||
## 🚀 Быстрый старт
|
|
||||||
|
|
||||||
### Мобильное приложение
|
|
||||||
```bash
|
```bash
|
||||||
cd mnemo_cards
|
# Установка зависимостей
|
||||||
flutter pub get
|
flutter pub get
|
||||||
flutter run
|
|
||||||
```
|
|
||||||
|
|
||||||
### Веб-приложение
|
# Запуск веб версии
|
||||||
```bash
|
cd mnemo_cards_web_v2
|
||||||
cd mnemo_cards_web
|
|
||||||
flutter pub get
|
|
||||||
flutter run -d chrome
|
flutter run -d chrome
|
||||||
```
|
|
||||||
|
|
||||||
### Backend сервер
|
# Запуск backend
|
||||||
```bash
|
|
||||||
cd mnemo_cards_backend
|
cd mnemo_cards_backend
|
||||||
dart pub get
|
dart run bin/server.dart
|
||||||
dart run
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### Telegram бот
|
### Деплой
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd mnemo_cards_telegram_bot
|
# Проверка готовности к деплою
|
||||||
dart pub get
|
tools/scripts/check_deploy_ready.sh
|
||||||
dart run
|
|
||||||
|
# Локальное тестирование CI/CD
|
||||||
|
tools/scripts/test_ci_locally.sh
|
||||||
|
|
||||||
|
# Запуск деплоя
|
||||||
|
git push origin main
|
||||||
```
|
```
|
||||||
|
|
||||||
### Веб-игры
|
## Документация
|
||||||
```bash
|
|
||||||
cd games
|
|
||||||
melos bootstrap
|
|
||||||
cd apps/host_app
|
|
||||||
flutter run
|
|
||||||
```
|
|
||||||
|
|
||||||
## 🔗 Зависимости между компонентами
|
- [CI/CD Setup](tools/docs/CI_CD_SETUP.md) - настройка автоматического деплоя
|
||||||
|
- [Web App](mnemo_cards_web_v2/README.md) - документация веб версии
|
||||||
|
- [Backend](mnemo_cards_backend/README.md) - документация backend
|
||||||
|
|
||||||
|
## Структура tools/
|
||||||
|
|
||||||
```
|
```
|
||||||
mnemo_cards
|
tools/
|
||||||
├── mnemo_cards_common (DTO)
|
├── ci/ # CI/CD workflows для Forgejo
|
||||||
├── games/mnemo_cards_web_bridge (WebView интеграция)
|
├── deploy/ # Скрипты деплоя
|
||||||
└── Firebase/Backend API
|
│ ├── backend-build_app.sh # Сборка backend
|
||||||
|
│ └── web-app/ # Скрипты деплоя веб приложения
|
||||||
mnemo_cards_web
|
├── docs/ # Документация
|
||||||
├── mnemo_cards_common (DTO)
|
└── scripts/ # Вспомогательные скрипты
|
||||||
├── mnemo_cards_frontend_common (общие компоненты)
|
├── check_deploy_ready.sh # Проверка готовности деплоя
|
||||||
├── games/payloads_shared (общие типы)
|
└── test_ci_locally.sh # Локальное тестирование CI/CD
|
||||||
└── Firebase/Backend API
|
|
||||||
|
|
||||||
mnemo_cards_backend
|
|
||||||
├── mnemo_cards_common (общие DTO)
|
|
||||||
├── mnemo_cards_common_backend (backend утилиты)
|
|
||||||
└── Isar Database
|
|
||||||
|
|
||||||
mnemo_cards_telegram_bot
|
|
||||||
├── mnemo_cards_common_backend
|
|
||||||
└── Backend API
|
|
||||||
|
|
||||||
games/
|
|
||||||
├── bridge_core (WebView коммуникация)
|
|
||||||
├── payloads_shared (общие типы)
|
|
||||||
└── apps/ (веб-приложения)
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## 📋 Основные функции
|
|
||||||
|
|
||||||
### Мобильное приложение
|
|
||||||
- 📚 Изучение языков через карточки
|
|
||||||
- 🎮 Интеграция с веб-играми
|
|
||||||
- 💳 Система покупок и подписок
|
|
||||||
- 📊 Аналитика и статистика
|
|
||||||
- 🔔 Push уведомления
|
|
||||||
- 🌐 Telegram Web App поддержка
|
|
||||||
|
|
||||||
### Веб-приложение
|
|
||||||
- 📚 Изучение языков через карточки в браузере
|
|
||||||
- 🎮 Интеграция с веб-играми
|
|
||||||
- 💳 Система покупок и подписок
|
|
||||||
- 📊 Аналитика и статистика
|
|
||||||
- 🔄 Синхронизация с мобильным приложением
|
|
||||||
- 📱 PWA поддержка для установки на устройство
|
|
||||||
|
|
||||||
### Backend
|
|
||||||
- 🔐 Аутентификация и авторизация
|
|
||||||
- 💾 Управление данными пользователей
|
|
||||||
- 💰 Обработка платежей
|
|
||||||
- 📈 Аналитика и метрики
|
|
||||||
- 🔄 Периодические задачи
|
|
||||||
- 📚 API для мобильного приложения
|
|
||||||
|
|
||||||
### Telegram бот
|
|
||||||
- 👨💼 Административные функции
|
|
||||||
- 📱 Распространение APK
|
|
||||||
- 👥 Управление пользователями
|
|
||||||
- 📊 Мониторинг системы
|
|
||||||
|
|
||||||
### Веб-игры
|
|
||||||
- 🎯 Интерактивные игры для изучения языков
|
|
||||||
- 🔗 Безопасная интеграция с мобильным приложением
|
|
||||||
- 📊 Отслеживание прогресса
|
|
||||||
- 🎨 Современный UI/UX
|
|
||||||
|
|
||||||
## 🛠️ Технологический стек
|
|
||||||
|
|
||||||
- **Frontend:** Flutter, Flutter Web
|
|
||||||
- **Backend:** Dart, Shelf, Isar
|
|
||||||
- **База данных:** Isar (локальная), Firestore (облачная)
|
|
||||||
- **Аутентификация:** Firebase Auth, Google Sign-In
|
|
||||||
- **Платежи:** YooKassa, In-App Purchase
|
|
||||||
- **Аналитика:** Firebase Analytics, Crashlytics
|
|
||||||
- **Реклама:** Yandex Mobile Ads
|
|
||||||
- **Уведомления:** Firebase Messaging, Local Notifications
|
|
||||||
- **Коммуникация:** WebView Bridge, REST API
|
|
||||||
- **Мониторинг:** Telegram Bot
|
|
||||||
|
|
||||||
## 📱 Поддерживаемые платформы
|
|
||||||
|
|
||||||
- **iOS** - нативное приложение
|
|
||||||
- **Android** - нативное приложение
|
|
||||||
- **Web** - Flutter Web приложение и игры
|
|
||||||
- **Telegram** - Web App интеграция
|
|
||||||
|
|
||||||
## 🔒 Безопасность
|
|
||||||
|
|
||||||
- Шифрование данных
|
|
||||||
- Безопасная WebView коммуникация
|
|
||||||
- Защита от root/jailbreak
|
|
||||||
- Валидация платежей
|
|
||||||
- Изоляция payload'ов в веб-играх
|
|
||||||
|
|
||||||
## 📄 Лицензия
|
|
||||||
|
|
||||||
Проект является приватным и не предназначен для публикации.
|
|
||||||
|
|
|
||||||
7678
mnemo_cards/coverage/lcov.info
Normal file
7678
mnemo_cards/coverage/lcov.info
Normal file
File diff suppressed because it is too large
Load diff
1
test_ci_locally.sh
Symbolic link
1
test_ci_locally.sh
Symbolic link
|
|
@ -0,0 +1 @@
|
||||||
|
tools/scripts/test_ci_locally.sh
|
||||||
30
tools/.gitignore
vendored
Normal file
30
tools/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,30 @@
|
||||||
|
# Build artifacts
|
||||||
|
*.exe
|
||||||
|
*.so
|
||||||
|
*.dylib
|
||||||
|
build/
|
||||||
|
.dart_tool/
|
||||||
|
|
||||||
|
# Logs
|
||||||
|
*.log
|
||||||
|
logs/
|
||||||
|
|
||||||
|
# Temporary files
|
||||||
|
*.tmp
|
||||||
|
*.bak
|
||||||
|
*.swp
|
||||||
|
|
||||||
|
# OS files
|
||||||
|
.DS_Store
|
||||||
|
Thumbs.db
|
||||||
|
|
||||||
|
# IDE files
|
||||||
|
.vscode/
|
||||||
|
.idea/
|
||||||
|
*.iml
|
||||||
|
|
||||||
|
# SSH keys (never commit!)
|
||||||
|
*.pem
|
||||||
|
*.key
|
||||||
|
id_*
|
||||||
|
ssh-*
|
||||||
78
tools/README.md
Normal file
78
tools/README.md
Normal file
|
|
@ -0,0 +1,78 @@
|
||||||
|
# tools - Development & Deployment Tools
|
||||||
|
|
||||||
|
Инструменты для разработки, тестирования и развертывания проекта Mnemo Cards.
|
||||||
|
|
||||||
|
## Структура
|
||||||
|
|
||||||
|
```
|
||||||
|
tools/
|
||||||
|
├── ci/ # CI/CD workflows для Forgejo Actions
|
||||||
|
│ ├── ci-main.yml # Главный pipeline
|
||||||
|
│ ├── ci-backend.yml # Backend CI
|
||||||
|
│ ├── ci-web.yml # Web app CI
|
||||||
|
│ ├── ci-mobile.yml # Mobile app CI
|
||||||
|
│ ├── cd-deploy.yml # Deployment
|
||||||
|
│ ├── code-quality.yml # Quality checks
|
||||||
|
│ ├── release.yml # Auto releases
|
||||||
|
│ └── agent.yml # AI agent
|
||||||
|
├── deploy/ # Deployment scripts
|
||||||
|
│ ├── backend-build_app.sh # Backend build & deploy
|
||||||
|
│ └── web-app/ # Web app deployment
|
||||||
|
│ ├── config.sh # Configuration
|
||||||
|
│ ├── deploy.sh # Main deploy script
|
||||||
|
│ └── nginx.conf # Nginx config
|
||||||
|
├── docs/ # Documentation
|
||||||
|
│ └── CI_CD_SETUP.md # CI/CD setup guide
|
||||||
|
└── scripts/ # Utility scripts
|
||||||
|
├── check_deploy_ready.sh # Pre-deploy checks
|
||||||
|
└── test_ci_locally.sh # Local CI/CD testing
|
||||||
|
```
|
||||||
|
|
||||||
|
## Быстрый старт
|
||||||
|
|
||||||
|
### Проверка готовности к деплою
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./scripts/check_deploy_ready.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### Локальное тестирование CI/CD
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./scripts/test_ci_locally.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### Настройка CI/CD
|
||||||
|
|
||||||
|
См. [CI/CD Setup Guide](docs/CI_CD_SETUP.md)
|
||||||
|
|
||||||
|
## CI/CD Workflow
|
||||||
|
|
||||||
|
1. **Code Quality** - линтинг, тесты, безопасность
|
||||||
|
2. **Build** - параллельная сборка всех компонентов
|
||||||
|
3. **Deploy** - автоматическое развертывание на сервера
|
||||||
|
|
||||||
|
### Компоненты
|
||||||
|
|
||||||
|
- **Backend** (Dart) → `api.memo-cards.online`
|
||||||
|
- **Web App** (Flutter) → `memo-cards.online`
|
||||||
|
- **Mobile App** (Flutter) → GitHub releases
|
||||||
|
|
||||||
|
## Требования
|
||||||
|
|
||||||
|
### Локальная разработка
|
||||||
|
- Flutter SDK
|
||||||
|
- Dart SDK
|
||||||
|
- Git
|
||||||
|
|
||||||
|
### Деплой
|
||||||
|
- SSH доступ к серверу `147.45.152.129`
|
||||||
|
- DNS: `memo-cards.online`, `api.memo-cards.online`
|
||||||
|
- Forgejo с настроенными secrets
|
||||||
|
|
||||||
|
## Документация
|
||||||
|
|
||||||
|
- [CI/CD Setup](docs/CI_CD_SETUP.md) - полное руководство по настройке
|
||||||
|
- [Deploy Scripts](deploy/README.md) - скрипты деплоя
|
||||||
|
- [CI Workflows](ci/README.md) - CI/CD pipelines
|
||||||
|
- [Scripts](scripts/README.md) - вспомогательные скрипты
|
||||||
76
tools/ci/README.md
Normal file
76
tools/ci/README.md
Normal file
|
|
@ -0,0 +1,76 @@
|
||||||
|
# CI/CD Workflows
|
||||||
|
|
||||||
|
Forgejo Actions workflows для автоматической сборки, тестирования и развертывания проекта.
|
||||||
|
|
||||||
|
## Быстрый старт
|
||||||
|
|
||||||
|
1. **Проверьте готовность:**
|
||||||
|
```bash
|
||||||
|
../../scripts/check_deploy_ready.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Настройте секреты в Forgejo:**
|
||||||
|
```
|
||||||
|
DEPLOY_SSH_PRIVATE_KEY # SSH ключ для деплоя
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Протестируйте локально:**
|
||||||
|
```bash
|
||||||
|
../../scripts/test_ci_locally.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
4. **Запустите деплой:**
|
||||||
|
```bash
|
||||||
|
git push origin main
|
||||||
|
```
|
||||||
|
|
||||||
|
## Workflows
|
||||||
|
|
||||||
|
- `ci-main.yml` - Главный pipeline (координирует все остальные)
|
||||||
|
- `ci-backend.yml` - CI для backend (Dart)
|
||||||
|
- `ci-web.yml` - CI для веб приложения (Flutter Web)
|
||||||
|
- `ci-mobile.yml` - CI для мобильного приложения (Flutter)
|
||||||
|
- `cd-deploy.yml` - CD для развертывания на сервер
|
||||||
|
- `code-quality.yml` - Контроль качества кода
|
||||||
|
- `release.yml` - Автоматические релизы
|
||||||
|
- `agent.yml` - AI-агент для автоматической генерации кода
|
||||||
|
|
||||||
|
## Процесс CI/CD
|
||||||
|
|
||||||
|
### 1. Code Quality Gate
|
||||||
|
- Проверка линтинга для всех проектов
|
||||||
|
- Запуск тестов с покрытием
|
||||||
|
- Сканирование на наличие секретов
|
||||||
|
- Проверка зависимостей на уязвимости
|
||||||
|
|
||||||
|
### 2. Сборка компонентов
|
||||||
|
- **Backend**: Компиляция в нативный бинарный файл
|
||||||
|
- **Web App**: Сборка Flutter web приложения
|
||||||
|
- **Mobile App**: Сборка APK для Android и app для iOS
|
||||||
|
|
||||||
|
### 3. Развертывание
|
||||||
|
- **Backend**: Автоматическое обновление сервиса на `api.memo-cards.online`
|
||||||
|
- **Web App**: Rsync на веб сервер `memo-cards.online` + перезагрузка Nginx
|
||||||
|
- **Mobile App**: Создание GitHub релиза с APK
|
||||||
|
|
||||||
|
## Секреты Forgejo
|
||||||
|
|
||||||
|
```bash
|
||||||
|
DEPLOY_SSH_PRIVATE_KEY # SSH ключ для доступа к серверу 147.45.152.129
|
||||||
|
```
|
||||||
|
|
||||||
|
## Ручной запуск
|
||||||
|
|
||||||
|
### Backend деплой
|
||||||
|
```bash
|
||||||
|
../../deploy/backend-build_app.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### Web app деплой
|
||||||
|
```bash
|
||||||
|
../../deploy/web-app/deploy.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
См. [CI_CD_SETUP.md](../../docs/CI_CD_SETUP.md) для подробной диагностики проблем.
|
||||||
|
|
@ -8,21 +8,21 @@ on:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
code-quality:
|
code-quality:
|
||||||
uses: ./.forgejo/workflows/code-quality.yml
|
uses: ./code-quality.yml
|
||||||
|
|
||||||
backend-ci:
|
backend-ci:
|
||||||
needs: code-quality
|
needs: code-quality
|
||||||
uses: ./.forgejo/workflows/ci-backend.yml
|
uses: ./ci-backend.yml
|
||||||
|
|
||||||
web-ci:
|
web-ci:
|
||||||
needs: code-quality
|
needs: code-quality
|
||||||
uses: ./.forgejo/workflows/ci-web.yml
|
uses: ./ci-web.yml
|
||||||
|
|
||||||
mobile-ci:
|
mobile-ci:
|
||||||
needs: code-quality
|
needs: code-quality
|
||||||
uses: ./.forgejo/workflows/ci-mobile.yml
|
uses: ./ci-mobile.yml
|
||||||
|
|
||||||
deploy:
|
deploy:
|
||||||
needs: [backend-ci, web-ci, mobile-ci]
|
needs: [backend-ci, web-ci, mobile-ci]
|
||||||
if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/master'
|
if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/master'
|
||||||
uses: ./.forgejo/workflows/cd-deploy.yml
|
uses: ./cd-deploy.yml
|
||||||
79
tools/deploy/README.md
Normal file
79
tools/deploy/README.md
Normal file
|
|
@ -0,0 +1,79 @@
|
||||||
|
# Deploy Scripts
|
||||||
|
|
||||||
|
Скрипты для развертывания компонентов проекта на сервера.
|
||||||
|
|
||||||
|
## Структура
|
||||||
|
|
||||||
|
```
|
||||||
|
deploy/
|
||||||
|
├── backend-build_app.sh # Сборка и деплой backend
|
||||||
|
└── web-app/ # Скрипты деплоя веб приложения
|
||||||
|
├── config.sh # Конфигурация деплоя
|
||||||
|
├── deploy.sh # Основной скрипт деплоя
|
||||||
|
├── nginx.conf # Nginx конфигурация
|
||||||
|
└── setup-*.sh # Дополнительные setup скрипты
|
||||||
|
```
|
||||||
|
|
||||||
|
## Использование
|
||||||
|
|
||||||
|
### Backend
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Сборка и деплой backend на сервер
|
||||||
|
./backend-build_app.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### Web App
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Переход в директорию web-app
|
||||||
|
cd web-app
|
||||||
|
|
||||||
|
# Деплой веб приложения
|
||||||
|
./deploy.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
## Конфигурация
|
||||||
|
|
||||||
|
### Переменные окружения
|
||||||
|
|
||||||
|
Основные настройки в `web-app/config.sh`:
|
||||||
|
|
||||||
|
- `SERVER_IP` - IP сервера (147.45.152.129)
|
||||||
|
- `DOMAIN` - домен веб приложения (memo-cards.online)
|
||||||
|
- `API_BASE_URL` - URL API (https://api.memo-cards.online:8081)
|
||||||
|
|
||||||
|
### SSH доступ
|
||||||
|
|
||||||
|
Необходим SSH ключ для доступа к серверу. Ключ должен быть добавлен:
|
||||||
|
|
||||||
|
1. В Forgejo secrets: `DEPLOY_SSH_PRIVATE_KEY`
|
||||||
|
2. На сервере в `~/.ssh/authorized_keys`
|
||||||
|
|
||||||
|
## Процесс деплоя
|
||||||
|
|
||||||
|
### Backend
|
||||||
|
1. Компиляция Dart кода в бинарный файл
|
||||||
|
2. Копирование на сервер
|
||||||
|
3. Обновление systemd сервиса
|
||||||
|
4. Перезапуск сервиса
|
||||||
|
5. Получение SSL сертификата (Let's Encrypt)
|
||||||
|
|
||||||
|
### Web App
|
||||||
|
1. Сборка Flutter Web приложения
|
||||||
|
2. Копирование файлов на сервер (rsync)
|
||||||
|
3. Обновление Nginx конфигурации
|
||||||
|
4. Перезапуск Nginx
|
||||||
|
5. Получение SSL сертификата (Let's Encrypt)
|
||||||
|
|
||||||
|
## SSL сертификаты
|
||||||
|
|
||||||
|
Автоматически получаются сертификаты Let's Encrypt для:
|
||||||
|
- `memo-cards.online` (web app)
|
||||||
|
- `api.memo-cards.online` (backend API)
|
||||||
|
|
||||||
|
## Безопасность
|
||||||
|
|
||||||
|
- Используется SSH ключ для аутентификации
|
||||||
|
- Nginx конфигурация включает security headers
|
||||||
|
- CORS правильно настроен между доменами
|
||||||
70
tools/deploy/web-app/VSCODE_README.md
Normal file
70
tools/deploy/web-app/VSCODE_README.md
Normal file
|
|
@ -0,0 +1,70 @@
|
||||||
|
# VSCode Server Setup
|
||||||
|
|
||||||
|
VSCode (code-server) успешно установлен на сервере и доступен по адресу:
|
||||||
|
|
||||||
|
**URL:** https://vscode.mnemo-cards.online
|
||||||
|
|
||||||
|
## Учетные данные для входа
|
||||||
|
|
||||||
|
- **Username:** vscode
|
||||||
|
- **Password:** AGktOidxrah1KVC0
|
||||||
|
|
||||||
|
## Доступ
|
||||||
|
|
||||||
|
- ✅ Доступен только по домену vscode.mnemo-cards.online
|
||||||
|
- ❌ Заблокирован доступ по IP адресу сервера
|
||||||
|
- 🔒 Защищен SSL сертификатом от Let's Encrypt
|
||||||
|
|
||||||
|
## Служба
|
||||||
|
|
||||||
|
Code-server запущен как systemd сервис и автоматически запускается при перезагрузке сервера.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверить статус
|
||||||
|
sudo systemctl status code-server
|
||||||
|
|
||||||
|
# Перезапустить
|
||||||
|
sudo systemctl restart code-server
|
||||||
|
|
||||||
|
# Остановить
|
||||||
|
sudo systemctl stop code-server
|
||||||
|
```
|
||||||
|
|
||||||
|
## Конфигурация
|
||||||
|
|
||||||
|
- Порт: 8080 (локально, проксируется через nginx)
|
||||||
|
- Пользователь: vscode
|
||||||
|
- Конфигурационный файл: `/home/vscode/.config/code-server/config.yaml`
|
||||||
|
|
||||||
|
## Рабочая директория
|
||||||
|
|
||||||
|
- **Домашняя директория:** `/home/vscode`
|
||||||
|
- **Репозиторий:** `/home/vscode/cards` (символическая ссылка: `/root/cards`)
|
||||||
|
- **Файлы конфигурации:** `/home/vscode/.config/code-server/`
|
||||||
|
|
||||||
|
## Безопасность
|
||||||
|
|
||||||
|
- 🔐 **Аутентификация:** Сильный пароль (16 символов)
|
||||||
|
- 🔒 **SSL/TLS:** Полностью шифрованное HTTPS соединение с сертификатом Let's Encrypt
|
||||||
|
- 🚫 **Доступ по IP:** Заблокирован - только по домену vscode.mnemo-cards.online
|
||||||
|
- 🛡️ **Rate Limiting:**
|
||||||
|
- Логин: максимум 5 попыток в минуту
|
||||||
|
- Общие запросы: максимум 30 запросов в минуту с burst до 10
|
||||||
|
- 🔨 **Fail2Ban:** Автоматическая блокировка IP при подозрительной активности
|
||||||
|
- 3 неудачные попытки логина → бан на 1 час
|
||||||
|
- DDoS защита: 100 запросов в минуту → бан на 10 минут
|
||||||
|
- 👤 **Пользователь:** Отдельный пользователь vscode без sudo прав
|
||||||
|
- 📁 **Файловая система:** Полный доступ к своему репозиторию
|
||||||
|
- 🔄 **Автообновление:** SSL сертификаты обновляются автоматически
|
||||||
|
|
||||||
|
## Обновление сертификатов
|
||||||
|
|
||||||
|
SSL сертификаты автоматически обновляются через cron job certbot.
|
||||||
|
|
||||||
|
## Устранение неполадок
|
||||||
|
|
||||||
|
Если возникли проблемы с доступом:
|
||||||
|
|
||||||
|
1. Проверьте статус code-server: `sudo systemctl status code-server`
|
||||||
|
2. Проверьте nginx конфигурацию: `sudo nginx -t`
|
||||||
|
3. Проверьте логи: `sudo journalctl -u code-server -f`
|
||||||
185
tools/deploy/web-app/setup-vscode-domain.sh
Executable file
185
tools/deploy/web-app/setup-vscode-domain.sh
Executable file
|
|
@ -0,0 +1,185 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Setup script for VSCode (code-server) domain (vscode.mnemo-cards.online)
|
||||||
|
# Usage: ./setup-vscode-domain.sh
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Load configuration
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
source "$SCRIPT_DIR/config.sh"
|
||||||
|
|
||||||
|
echo "🚀 Setting up VSCode (code-server) domain: vscode.mnemo-cards.online..."
|
||||||
|
|
||||||
|
# Colors for output
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
|
print_status() {
|
||||||
|
echo -e "${GREEN}[INFO]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
print_warning() {
|
||||||
|
echo -e "${YELLOW}[WARNING]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
print_error() {
|
||||||
|
echo -e "${RED}[ERROR]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
print_success() {
|
||||||
|
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
print_info() {
|
||||||
|
echo -e "${BLUE}[INFO]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Upload nginx config for VSCode
|
||||||
|
print_status "Uploading VSCode nginx configuration..."
|
||||||
|
scp "$SCRIPT_DIR/vscode-nginx.conf" "$SERVER_USER@$SERVER_IP:/tmp/vscode-nginx.conf"
|
||||||
|
|
||||||
|
print_status "Setting up VSCode domain on server..."
|
||||||
|
# Execute setup commands on server
|
||||||
|
ssh "$SERVER_USER@$SERVER_IP" << EOF
|
||||||
|
set -e
|
||||||
|
|
||||||
|
echo "Setting up VSCode (code-server) domain configuration..."
|
||||||
|
|
||||||
|
# Install code-server if not already installed
|
||||||
|
if ! command -v code-server &> /dev/null; then
|
||||||
|
echo "Installing code-server..."
|
||||||
|
|
||||||
|
# Update package list
|
||||||
|
apt update
|
||||||
|
|
||||||
|
# Install required dependencies
|
||||||
|
apt install -y curl wget gnupg2 software-properties-common apt-transport-https ca-certificates
|
||||||
|
|
||||||
|
# Add code-server repository
|
||||||
|
curl -fsSL https://code-server.dev/install.sh | sh
|
||||||
|
|
||||||
|
echo "✅ code-server installed successfully"
|
||||||
|
else
|
||||||
|
echo "✅ code-server is already installed"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Create code-server user if it doesn't exist
|
||||||
|
if ! id -u vscode &>/dev/null; then
|
||||||
|
echo "Creating vscode user..."
|
||||||
|
useradd -m -s /bin/bash vscode
|
||||||
|
echo "vscode:vscode123!" | chpasswd
|
||||||
|
usermod -aG sudo vscode
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Create code-server configuration directory
|
||||||
|
mkdir -p /home/vscode/.config/code-server
|
||||||
|
|
||||||
|
# Create code-server config file
|
||||||
|
cat > /home/vscode/.config/code-server/config.yaml << 'CODE_SERVER_CONFIG_EOF'
|
||||||
|
bind-addr: 127.0.0.1:8080
|
||||||
|
auth: password
|
||||||
|
password: vscode123!
|
||||||
|
cert: false
|
||||||
|
CODE_SERVER_CONFIG_EOF
|
||||||
|
|
||||||
|
# Set proper ownership
|
||||||
|
chown -R vscode:vscode /home/vscode/.config
|
||||||
|
|
||||||
|
# Create systemd service for code-server
|
||||||
|
cat > /etc/systemd/system/code-server.service << 'SYSTEMD_EOF'
|
||||||
|
[Unit]
|
||||||
|
Description=code-server
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=vscode
|
||||||
|
WorkingDirectory=/home/vscode
|
||||||
|
ExecStart=/usr/bin/code-server --config /home/vscode/.config/code-server/config.yaml
|
||||||
|
Restart=always
|
||||||
|
RestartSec=10
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
SYSTEMD_EOF
|
||||||
|
|
||||||
|
# Enable and start code-server service
|
||||||
|
systemctl daemon-reload
|
||||||
|
systemctl enable code-server
|
||||||
|
systemctl start code-server
|
||||||
|
|
||||||
|
# Wait a moment for service to start
|
||||||
|
sleep 5
|
||||||
|
|
||||||
|
# Check if service is running
|
||||||
|
if systemctl is-active --quiet code-server; then
|
||||||
|
echo "✅ code-server service started successfully"
|
||||||
|
else
|
||||||
|
echo "❌ Failed to start code-server service"
|
||||||
|
systemctl status code-server
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Install SSL certificate for vscode.mnemo-cards.online
|
||||||
|
if [ ! -d "/etc/letsencrypt/live/vscode.mnemo-cards.online" ]; then
|
||||||
|
echo "🔐 Getting Let's Encrypt SSL certificate for vscode.mnemo-cards.online..."
|
||||||
|
|
||||||
|
# Stop nginx temporarily for certificate issuance
|
||||||
|
systemctl stop nginx 2>/dev/null || true
|
||||||
|
|
||||||
|
if certbot certonly --standalone -d vscode.mnemo-cards.online --non-interactive --agree-tos --email admin@memo-cards.online; then
|
||||||
|
echo "✅ Let's Encrypt certificate obtained successfully for vscode.mnemo-cards.online!"
|
||||||
|
else
|
||||||
|
echo "❌ Failed to get Let's Encrypt certificate. Generating self-signed certificate..."
|
||||||
|
if [ ! -f "/etc/ssl/certs/nginx-selfsigned-vscode.crt" ]; then
|
||||||
|
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
|
||||||
|
-keyout /etc/ssl/private/nginx-selfsigned-vscode.key \
|
||||||
|
-out /etc/ssl/certs/nginx-selfsigned-vscode.crt \
|
||||||
|
-subj "/C=RU/ST=Moscow/L=Moscow/O=MnemoCards/OU=IT/CN=vscode.mnemo-cards.online"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Start nginx again
|
||||||
|
systemctl start nginx 2>/dev/null || true
|
||||||
|
else
|
||||||
|
echo "✅ Let's Encrypt certificate already exists for vscode.mnemo-cards.online"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Configure nginx for VSCode
|
||||||
|
echo "Configuring nginx for VSCode..."
|
||||||
|
|
||||||
|
# Copy VSCode nginx configuration
|
||||||
|
cp /tmp/vscode-nginx.conf /etc/nginx/sites-available/vscode
|
||||||
|
|
||||||
|
# Enable VSCode site
|
||||||
|
ln -sf /etc/nginx/sites-available/vscode /etc/nginx/sites-enabled/vscode
|
||||||
|
|
||||||
|
# Test nginx configuration
|
||||||
|
nginx -t
|
||||||
|
|
||||||
|
# Restart nginx
|
||||||
|
systemctl restart nginx
|
||||||
|
systemctl enable nginx
|
||||||
|
|
||||||
|
# Setup cron for certificate renewal (if not already configured)
|
||||||
|
if ! crontab -l | grep -q "vscode.mnemo-cards.online"; then
|
||||||
|
echo "Setting up cron job for VSCode certificate renewal..."
|
||||||
|
(crontab -l ; echo "0 12 * * * certbot renew --quiet --cert-name vscode.mnemo-cards.online") | crontab -
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "VSCode domain setup completed successfully!"
|
||||||
|
echo "VSCode is now available at: https://vscode.mnemo-cards.online"
|
||||||
|
echo "Username: vscode"
|
||||||
|
echo "Password: vscode123!"
|
||||||
|
echo "Access by IP address is blocked"
|
||||||
|
EOF
|
||||||
|
|
||||||
|
print_success "VSCode domain setup completed successfully! 🎉"
|
||||||
|
print_success "VSCode is now available at: https://vscode.mnemo-cards.online"
|
||||||
|
print_info "Username: vscode"
|
||||||
|
print_info "Password: vscode123!"
|
||||||
|
print_info "Make sure DNS is configured: vscode.mnemo-cards.online -> $SERVER_IP"
|
||||||
99
tools/deploy/web-app/vscode-nginx.conf
Normal file
99
tools/deploy/web-app/vscode-nginx.conf
Normal file
|
|
@ -0,0 +1,99 @@
|
||||||
|
# Note: Default server blocks are defined in forgejo configuration
|
||||||
|
# This configuration only handles vscode.mnemo-cards.online domain
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
server_name vscode.mnemo-cards.online;
|
||||||
|
|
||||||
|
# Redirect HTTP to HTTPS
|
||||||
|
return 301 https://$server_name$request_uri;
|
||||||
|
}
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 443 ssl http2;
|
||||||
|
server_name vscode.mnemo-cards.online;
|
||||||
|
|
||||||
|
# SSL configuration - Let's Encrypt
|
||||||
|
ssl_certificate /etc/letsencrypt/live/vscode.mnemo-cards.online/fullchain.pem;
|
||||||
|
ssl_certificate_key /etc/letsencrypt/live/vscode.mnemo-cards.online/privkey.pem;
|
||||||
|
|
||||||
|
# Fallback to self-signed certificates if Let's Encrypt fails
|
||||||
|
# ssl_certificate /etc/ssl/certs/nginx-selfsigned-vscode.crt;
|
||||||
|
# ssl_certificate_key /etc/ssl/private/nginx-selfsigned-vscode.key;
|
||||||
|
ssl_protocols TLSv1.2 TLSv1.3;
|
||||||
|
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384;
|
||||||
|
ssl_prefer_server_ciphers off;
|
||||||
|
|
||||||
|
# Security headers
|
||||||
|
add_header X-Frame-Options "SAMEORIGIN" always;
|
||||||
|
add_header X-XSS-Protection "1; mode=block" always;
|
||||||
|
add_header X-Content-Type-Options "nosniff" always;
|
||||||
|
add_header Referrer-Policy "no-referrer-when-downgrade" always;
|
||||||
|
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
|
||||||
|
|
||||||
|
# Special rate limiting for login attempts
|
||||||
|
location /login {
|
||||||
|
# Strict rate limiting for login
|
||||||
|
limit_req zone=vscode_login burst=2 nodelay;
|
||||||
|
limit_req_status 429;
|
||||||
|
|
||||||
|
proxy_pass http://localhost:8080;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
|
||||||
|
# WebSocket support for VSCode
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Connection "upgrade";
|
||||||
|
|
||||||
|
# Timeout settings
|
||||||
|
proxy_connect_timeout 60s;
|
||||||
|
proxy_send_timeout 60s;
|
||||||
|
proxy_read_timeout 60s;
|
||||||
|
|
||||||
|
# Buffer settings
|
||||||
|
proxy_buffering off;
|
||||||
|
proxy_request_buffering off;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Proxy to code-server running on port 8080
|
||||||
|
location / {
|
||||||
|
# Apply rate limiting
|
||||||
|
limit_req zone=vscode_general burst=10 nodelay;
|
||||||
|
limit_req_status 429;
|
||||||
|
|
||||||
|
proxy_pass http://localhost:8080;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
|
||||||
|
# WebSocket support for VSCode
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Connection "upgrade";
|
||||||
|
|
||||||
|
# Timeout settings
|
||||||
|
proxy_connect_timeout 60s;
|
||||||
|
proxy_send_timeout 60s;
|
||||||
|
proxy_read_timeout 60s;
|
||||||
|
|
||||||
|
# Buffer settings
|
||||||
|
proxy_buffering off;
|
||||||
|
proxy_request_buffering off;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Gzip compression
|
||||||
|
gzip on;
|
||||||
|
gzip_vary on;
|
||||||
|
gzip_min_length 1024;
|
||||||
|
gzip_proxied expired no-cache no-store private auth;
|
||||||
|
gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml+rss application/javascript;
|
||||||
|
|
||||||
|
# Security - deny access to hidden files
|
||||||
|
location ~ /\. {
|
||||||
|
deny all;
|
||||||
|
}
|
||||||
|
}
|
||||||
307
tools/docs/CI_CD_SETUP.md
Normal file
307
tools/docs/CI_CD_SETUP.md
Normal file
|
|
@ -0,0 +1,307 @@
|
||||||
|
# Настройка CI/CD для проекта Mnemo Cards
|
||||||
|
|
||||||
|
Этот документ описывает настройку автоматической сборки, тестирования и развертывания проекта в Forgejo.
|
||||||
|
|
||||||
|
## Архитектура CI/CD
|
||||||
|
|
||||||
|
Проект использует многоуровневую архитектуру CI/CD с разделением на отдельные компоненты:
|
||||||
|
|
||||||
|
- **Backend** (Dart) - серверная часть
|
||||||
|
- **Web App** (Flutter Web) - веб версия приложения
|
||||||
|
- **Mobile App** (Flutter) - мобильное приложение для Android/iOS
|
||||||
|
- **Common Libraries** - общие пакеты
|
||||||
|
|
||||||
|
## Структура Workflow
|
||||||
|
|
||||||
|
```
|
||||||
|
tools/ci/
|
||||||
|
├── ci-main.yml # Главный координирующий workflow
|
||||||
|
├── ci-backend.yml # CI для backend
|
||||||
|
├── ci-web.yml # CI для веб приложения
|
||||||
|
├── ci-mobile.yml # CI для мобильного приложения
|
||||||
|
├── cd-deploy.yml # CD для развертывания
|
||||||
|
├── code-quality.yml # Контроль качества кода
|
||||||
|
├── release.yml # Автоматические релизы
|
||||||
|
└── agent.yml # AI-агент для автоматической генерации кода
|
||||||
|
```
|
||||||
|
|
||||||
|
## Требуемые Secrets
|
||||||
|
|
||||||
|
Для работы CI/CD необходимо настроить следующие секреты в Forgejo:
|
||||||
|
|
||||||
|
### SSH доступ для развертывания
|
||||||
|
```
|
||||||
|
DEPLOY_SSH_PRIVATE_KEY # Приватный SSH ключ для доступа к серверу 147.45.152.129
|
||||||
|
```
|
||||||
|
|
||||||
|
### API ключи (опционально)
|
||||||
|
```
|
||||||
|
OPENAI_API_KEY # Для AI-агента
|
||||||
|
```
|
||||||
|
|
||||||
|
## Настройка серверов
|
||||||
|
|
||||||
|
### Единый сервер (147.45.152.129)
|
||||||
|
- **API Backend** (api.memo-cards.online): Dart SDK, systemd сервис `mnemo_cards_server.service`
|
||||||
|
- **Web App** (memo-cards.online): Nginx, Flutter Web приложение
|
||||||
|
- **SSL**: Let's Encrypt сертификаты для обоих доменов
|
||||||
|
- **CORS**: Правильно настроен между доменами, COEP/COOP headers отключены для совместимости
|
||||||
|
- Доступ по SSH для деплоя
|
||||||
|
|
||||||
|
## Процесс CI/CD
|
||||||
|
|
||||||
|
### 1. Code Quality Gate
|
||||||
|
- Проверка линтинга для всех проектов
|
||||||
|
- Запуск тестов с покрытием
|
||||||
|
- Сканирование на наличие секретов
|
||||||
|
- Проверка зависимостей на уязвимости
|
||||||
|
|
||||||
|
### 2. Сборка компонентов
|
||||||
|
- **Backend**: Компиляция в нативный бинарный файл
|
||||||
|
- **Web App**: Сборка Flutter web приложения
|
||||||
|
- **Mobile App**: Сборка APK для Android и app для iOS
|
||||||
|
|
||||||
|
### 3. Развертывание
|
||||||
|
- **Backend**: Автоматическое обновление сервиса
|
||||||
|
- **Web App**: Rsync на веб сервер + перезагрузка Nginx
|
||||||
|
- **Mobile App**: Создание GitHub релиза с APK
|
||||||
|
|
||||||
|
## 🚀 Быстрый старт деплоя
|
||||||
|
|
||||||
|
### ✅ Чек-лист готовности
|
||||||
|
|
||||||
|
- [ ] **SSH ключ сгенерирован и добавлен на сервер**
|
||||||
|
- [ ] **DNS домены настроены** (`memo-cards.online`, `api.memo-cards.online`, `code.memo-cards.online`)
|
||||||
|
- [ ] **Forgejo secrets настроены** (`DEPLOY_SSH_PRIVATE_KEY`)
|
||||||
|
- [ ] **Код готов к деплою** (все тесты проходят)
|
||||||
|
|
||||||
|
### 🎯 Запуск в 3 шага
|
||||||
|
|
||||||
|
1. **Подготовка:**
|
||||||
|
```bash
|
||||||
|
# Генерация и настройка SSH ключа
|
||||||
|
ssh-keygen -t ed25519 -C "forgejo-deploy@memo-cards.online" -f ~/.ssh/forgejo_deploy
|
||||||
|
ssh-copy-id -i ~/.ssh/forgejo_deploy.pub root@147.45.152.129
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Настройка Forgejo:**
|
||||||
|
- Перейти в Settings → Secrets
|
||||||
|
- Добавить `DEPLOY_SSH_PRIVATE_KEY` с содержимым `~/.ssh/forgejo_deploy`
|
||||||
|
|
||||||
|
3. **Запуск:**
|
||||||
|
```bash
|
||||||
|
git push origin main # Автоматический запуск CI/CD
|
||||||
|
```
|
||||||
|
|
||||||
|
## Запуск CI/CD
|
||||||
|
|
||||||
|
### 🔧 Предварительная настройка
|
||||||
|
|
||||||
|
#### 1. Настройка SSH доступа
|
||||||
|
```bash
|
||||||
|
# Генерация SSH ключа (если нет)
|
||||||
|
ssh-keygen -t ed25519 -C "forgejo-deploy@mnemo-cards.online" -f ~/.ssh/forgejo_deploy
|
||||||
|
|
||||||
|
# Копирование публичного ключа на сервер
|
||||||
|
ssh-copy-id -i ~/.ssh/forgejo_deploy.pub root@147.45.152.129
|
||||||
|
|
||||||
|
# Добавление приватного ключа в Forgejo secrets
|
||||||
|
# Settings → Secrets → DEPLOY_SSH_PRIVATE_KEY
|
||||||
|
cat ~/.ssh/forgejo_deploy
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 2. Настройка DNS доменов
|
||||||
|
Убедитесь, что DNS записи настроены:
|
||||||
|
- `memo-cards.online` → `147.45.152.129`
|
||||||
|
- `api.memo-cards.online` → `147.45.152.129`
|
||||||
|
- `code.memo-cards.online` → `147.45.152.129` (для Forgejo)
|
||||||
|
|
||||||
|
#### 3. Проверка доступа к серверу
|
||||||
|
```bash
|
||||||
|
# Тест SSH подключения
|
||||||
|
ssh -i ~/.ssh/forgejo_deploy root@147.45.152.129 "echo 'SSH works!'"
|
||||||
|
|
||||||
|
# Проверка что Dart установлен
|
||||||
|
ssh root@147.45.152.129 "dart --version"
|
||||||
|
|
||||||
|
# Проверка что Nginx установлен
|
||||||
|
ssh root@147.45.152.129 "nginx -v"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 🚀 Запуск деплоя
|
||||||
|
|
||||||
|
#### Автоматический запуск
|
||||||
|
CI/CD запускается автоматически при:
|
||||||
|
- Push в ветки `main`/`master`
|
||||||
|
- Создании Pull Request
|
||||||
|
- Создании тега релиза (`v*.*.*`)
|
||||||
|
|
||||||
|
#### Ручной запуск
|
||||||
|
1. Перейдите в раздел **Actions** в Forgejo
|
||||||
|
2. Выберите workflow **"Main CI Pipeline"**
|
||||||
|
3. Нажмите **"Run workflow"**
|
||||||
|
|
||||||
|
#### Ручной деплой (альтернатива)
|
||||||
|
```bash
|
||||||
|
# Деплой backend
|
||||||
|
tools/deploy/backend-build_app.sh
|
||||||
|
|
||||||
|
# Деплой web app
|
||||||
|
cd mnemo_cards_web_v2
|
||||||
|
tools/deploy/web-app/deploy.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
## Мониторинг и логи
|
||||||
|
|
||||||
|
### Просмотр результатов
|
||||||
|
- Результаты тестов: `coverage/lcov.info`
|
||||||
|
- Логи сборки: В разделе Actions каждого workflow
|
||||||
|
- Артефакты сборки: Скачиваются из Actions
|
||||||
|
|
||||||
|
### Уведомления
|
||||||
|
При успешном/неуспешном завершении можно настроить уведомления через:
|
||||||
|
- Email
|
||||||
|
- Webhooks
|
||||||
|
- Forgejo notifications
|
||||||
|
|
||||||
|
## Создание релиза
|
||||||
|
|
||||||
|
### Автоматический релиз
|
||||||
|
1. Создайте git tag: `git tag v1.2.3 && git push origin v1.2.3`
|
||||||
|
2. Workflow автоматически:
|
||||||
|
- Создаст GitHub release
|
||||||
|
- Обновит версии в pubspec.yaml файлах
|
||||||
|
- Опубликует APK и другие артефакты
|
||||||
|
|
||||||
|
### Ручной релиз
|
||||||
|
Используйте существующие скрипты:
|
||||||
|
```bash
|
||||||
|
./mnemo_cards_backend/build_app.sh # Деплой backend
|
||||||
|
./mnemo_cards_web_v2/deploy/deploy.sh # Деплой web app
|
||||||
|
```
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### 🚨 Проблемы с деплоем
|
||||||
|
|
||||||
|
#### SSH подключение не работает
|
||||||
|
```bash
|
||||||
|
# Проверка SSH ключа локально
|
||||||
|
ssh -i ~/.ssh/forgejo_deploy root@147.45.152.129 "echo 'Connection OK'"
|
||||||
|
|
||||||
|
# Проверка что ключ добавлен в known_hosts
|
||||||
|
ssh-keyscan -H 147.45.152.129 >> ~/.ssh/known_hosts
|
||||||
|
|
||||||
|
# В Forgejo secrets должен быть полный приватный ключ
|
||||||
|
cat ~/.ssh/forgejo_deploy
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Backend деплой падает
|
||||||
|
```bash
|
||||||
|
# Проверка что Dart установлен на сервере
|
||||||
|
ssh root@147.45.152.129 "which dart && dart --version"
|
||||||
|
|
||||||
|
# Ручной запуск build скрипта
|
||||||
|
tools/deploy/backend-build_app.sh
|
||||||
|
|
||||||
|
# Проверка статуса сервиса
|
||||||
|
ssh root@147.45.152.129 "systemctl status mnemo_cards_server"
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Web app деплой падает
|
||||||
|
```bash
|
||||||
|
# Проверка что Nginx установлен
|
||||||
|
ssh root@147.45.152.129 "which nginx && nginx -v"
|
||||||
|
|
||||||
|
# Ручной запуск deploy скрипта
|
||||||
|
cd mnemo_cards_web_v2
|
||||||
|
tools/deploy/web-app/deploy.sh
|
||||||
|
|
||||||
|
# Проверка Nginx конфигурации
|
||||||
|
ssh root@147.45.152.129 "nginx -t"
|
||||||
|
```
|
||||||
|
|
||||||
|
#### SSL сертификаты не работают
|
||||||
|
```bash
|
||||||
|
# Проверка Let's Encrypt сертификатов
|
||||||
|
ssh root@147.45.152.129 "ls -la /etc/letsencrypt/live/"
|
||||||
|
|
||||||
|
# Ручное получение сертификатов
|
||||||
|
ssh root@147.45.152.129 "certbot certonly --standalone -d memo-cards.online -d api.memo-cards.online --email admin@memo-cards.online"
|
||||||
|
```
|
||||||
|
|
||||||
|
#### DNS проблемы
|
||||||
|
```bash
|
||||||
|
# Проверка DNS разрешения
|
||||||
|
nslookup memo-cards.online
|
||||||
|
nslookup api.memo-cards.online
|
||||||
|
nslookup code.memo-cards.online
|
||||||
|
|
||||||
|
# Проверка доступности портов
|
||||||
|
telnet 147.45.152.129 80
|
||||||
|
telnet 147.45.152.129 443
|
||||||
|
telnet 147.45.152.129 8080
|
||||||
|
telnet 147.45.152.129 8081
|
||||||
|
```
|
||||||
|
|
||||||
|
### Проблемы с зависимостями
|
||||||
|
```bash
|
||||||
|
# Очистка кэша
|
||||||
|
flutter clean
|
||||||
|
flutter pub cache repair
|
||||||
|
```
|
||||||
|
|
||||||
|
### Проблемы с SSH
|
||||||
|
```bash
|
||||||
|
# Проверка SSH ключа
|
||||||
|
ssh -T git@code.memo-cards.online
|
||||||
|
|
||||||
|
# Проверка доступа к серверам
|
||||||
|
ssh -i ~/.ssh/forgejo_deploy root@147.45.152.129
|
||||||
|
```
|
||||||
|
|
||||||
|
### Проблемы с тестами
|
||||||
|
```bash
|
||||||
|
# Запуск тестов локально
|
||||||
|
cd mnemo_cards_web_v2
|
||||||
|
flutter test --coverage
|
||||||
|
|
||||||
|
# Просмотр покрытия
|
||||||
|
genhtml coverage/lcov.info -o coverage/html
|
||||||
|
open coverage/html/index.html
|
||||||
|
```
|
||||||
|
|
||||||
|
## Безопасность
|
||||||
|
|
||||||
|
### Защита секретов
|
||||||
|
- Никогда не коммитьте реальные ключи в код
|
||||||
|
- Используйте отдельные ключи для каждого окружения
|
||||||
|
- Регулярно ротируйте SSH ключи
|
||||||
|
|
||||||
|
### Code Quality Gates
|
||||||
|
- Минимальное покрытие тестами: 80%
|
||||||
|
- Обязательный проход линтера
|
||||||
|
- Сканирование на уязвимости в зависимостях
|
||||||
|
|
||||||
|
## Расширение CI/CD
|
||||||
|
|
||||||
|
### Добавление нового компонента
|
||||||
|
1. Создайте новый workflow файл в `.forgejo/workflows/`
|
||||||
|
2. Добавьте ссылку в `ci-main.yml`
|
||||||
|
3. Настройте необходимые секреты
|
||||||
|
|
||||||
|
### Кастомные проверки
|
||||||
|
Добавьте в `code-quality.yml`:
|
||||||
|
```yaml
|
||||||
|
- name: Custom check
|
||||||
|
run: |
|
||||||
|
# Ваша логика проверки
|
||||||
|
```
|
||||||
|
|
||||||
|
## Контакты
|
||||||
|
|
||||||
|
При проблемах с CI/CD:
|
||||||
|
1. Проверьте логи в Actions
|
||||||
|
2. Убедитесь, что все секреты настроены
|
||||||
|
3. Проверьте доступ к серверам
|
||||||
|
4. Создайте issue в репозитории
|
||||||
61
tools/scripts/README.md
Normal file
61
tools/scripts/README.md
Normal file
|
|
@ -0,0 +1,61 @@
|
||||||
|
# Development Scripts
|
||||||
|
|
||||||
|
Вспомогательные скрипты для разработки и тестирования.
|
||||||
|
|
||||||
|
## Скрипты
|
||||||
|
|
||||||
|
### `check_deploy_ready.sh`
|
||||||
|
|
||||||
|
Проверяет готовность проекта к деплою:
|
||||||
|
|
||||||
|
- Наличие SSH ключей
|
||||||
|
- Доступность сервера
|
||||||
|
- Установленное ПО (Dart, Nginx)
|
||||||
|
- DNS разрешение доменов
|
||||||
|
- Локальные CI/CD тесты
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./check_deploy_ready.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### `test_ci_locally.sh`
|
||||||
|
|
||||||
|
Запускает локальное тестирование CI/CD pipeline:
|
||||||
|
|
||||||
|
- Проверка зависимостей
|
||||||
|
- Линтинг кода
|
||||||
|
- Запуск тестов
|
||||||
|
- Проверка CORS конфигурации
|
||||||
|
- Валидация workflow файлов
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./test_ci_locally.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
## Использование
|
||||||
|
|
||||||
|
### Перед деплоем
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Всегда проверяйте готовность перед деплоем
|
||||||
|
./check_deploy_ready.sh
|
||||||
|
|
||||||
|
# И тестируйте CI/CD локально
|
||||||
|
./test_ci_locally.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### В CI/CD pipeline
|
||||||
|
|
||||||
|
Эти скрипты автоматически запускаются в Forgejo Actions, но могут быть запущены и локально для отладки.
|
||||||
|
|
||||||
|
## Выходные коды
|
||||||
|
|
||||||
|
- `0` - Успешное выполнение
|
||||||
|
- `1` - Ошибка выполнения
|
||||||
|
|
||||||
|
## Логи
|
||||||
|
|
||||||
|
Скрипты выводят цветные логи:
|
||||||
|
- 🟢 `[OK]` - успешные проверки
|
||||||
|
- 🟡 `[WARN]` - предупреждения
|
||||||
|
- 🔴 `[ERROR]` - ошибки
|
||||||
109
tools/scripts/check_deploy_ready.sh
Executable file
109
tools/scripts/check_deploy_ready.sh
Executable file
|
|
@ -0,0 +1,109 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Script to check if deployment is ready
|
||||||
|
# Run this before attempting deployment
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Change to project root
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd)"
|
||||||
|
cd "$PROJECT_ROOT"
|
||||||
|
|
||||||
|
echo "🔍 Checking deployment readiness..."
|
||||||
|
|
||||||
|
# Colors
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
NC='\033[0m'
|
||||||
|
|
||||||
|
SERVER_IP="147.45.152.129"
|
||||||
|
SSH_KEY="${SSH_DEPLOY_KEY:-$HOME/.ssh/forgejo_deploy}"
|
||||||
|
|
||||||
|
print_status() {
|
||||||
|
echo -e "${GREEN}[OK]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
print_warning() {
|
||||||
|
echo -e "${YELLOW}[WARN]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
print_error() {
|
||||||
|
echo -e "${RED}[ERROR]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
print_info() {
|
||||||
|
echo -e "${BLUE}[INFO]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check 1: SSH key exists
|
||||||
|
echo "1. Checking SSH key..."
|
||||||
|
if [ -f "$SSH_KEY" ]; then
|
||||||
|
print_status "SSH private key found at $SSH_KEY"
|
||||||
|
else
|
||||||
|
print_error "SSH private key not found at $SSH_KEY"
|
||||||
|
echo " Generate with: ssh-keygen -t ed25519 -C 'forgejo-deploy@memo-cards.online' -f $SSH_KEY"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check 2: SSH connection
|
||||||
|
echo "2. Checking SSH connection..."
|
||||||
|
if ssh -o ConnectTimeout=10 -o BatchMode=yes -i "$SSH_KEY" root@$SERVER_IP "echo 'SSH OK'" 2>/dev/null; then
|
||||||
|
print_status "SSH connection to server successful"
|
||||||
|
else
|
||||||
|
print_error "Cannot connect to server via SSH"
|
||||||
|
echo " Make sure the public key is added to root@$SERVER_IP:~/.ssh/authorized_keys"
|
||||||
|
echo " Run: ssh-copy-id -i $SSH_KEY.pub root@$SERVER_IP"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check 3: Required software on server
|
||||||
|
echo "3. Checking server software..."
|
||||||
|
if ssh -i "$SSH_KEY" root@$SERVER_IP "which dart nginx" >/dev/null 2>&1; then
|
||||||
|
print_status "Dart and Nginx are installed on server"
|
||||||
|
else
|
||||||
|
print_error "Dart or Nginx not found on server"
|
||||||
|
echo " Install with: apt update && apt install -y dart nginx"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check 4: DNS resolution
|
||||||
|
echo "4. Checking DNS resolution..."
|
||||||
|
for domain in "memo-cards.online" "api.memo-cards.online" "code.memo-cards.online"; do
|
||||||
|
if nslookup "$domain" 2>/dev/null | grep -q "$SERVER_IP"; then
|
||||||
|
print_status "DNS for $domain resolves to $SERVER_IP"
|
||||||
|
else
|
||||||
|
print_warning "DNS for $domain may not be configured correctly"
|
||||||
|
echo " Expected: $domain -> $SERVER_IP"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Check 5: Network connectivity
|
||||||
|
echo "5. Checking network connectivity..."
|
||||||
|
for port in 22 80 443 8080 8081; do
|
||||||
|
if nc -z -w5 $SERVER_IP $port 2>/dev/null; then
|
||||||
|
print_status "Port $port is accessible"
|
||||||
|
else
|
||||||
|
print_warning "Port $port is not accessible"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Check 6: Local tests
|
||||||
|
echo "6. Running local CI/CD tests..."
|
||||||
|
if ./test_ci_locally.sh 2>&1 | grep -q "SUCCESS.*CORS configuration check completed"; then
|
||||||
|
print_status "Local CI/CD tests passed"
|
||||||
|
else
|
||||||
|
print_warning "Local CI/CD tests failed - check output above"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Summary
|
||||||
|
echo ""
|
||||||
|
print_info "=== DEPLOYMENT READINESS SUMMARY ==="
|
||||||
|
print_info "Server IP: $SERVER_IP"
|
||||||
|
print_info "SSH Key: $SSH_KEY"
|
||||||
|
print_info ""
|
||||||
|
print_info "If all checks passed, you can proceed with deployment!"
|
||||||
|
print_info "Run: git push origin main"
|
||||||
|
echo ""
|
||||||
214
tools/scripts/test_ci_locally.sh
Executable file
214
tools/scripts/test_ci_locally.sh
Executable file
|
|
@ -0,0 +1,214 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Script for local testing of CI/CD pipeline
|
||||||
|
# Run this before pushing to ensure everything works
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Change to project root
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd)"
|
||||||
|
cd "$PROJECT_ROOT"
|
||||||
|
|
||||||
|
echo "🚀 Testing CI/CD pipeline locally..."
|
||||||
|
|
||||||
|
# Colors for output
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
|
print_status() {
|
||||||
|
echo -e "${GREEN}[INFO]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
print_warning() {
|
||||||
|
echo -e "${YELLOW}[WARNING]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
print_error() {
|
||||||
|
echo -e "${RED}[ERROR]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
print_success() {
|
||||||
|
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to check if command exists
|
||||||
|
command_exists() {
|
||||||
|
command -v "$1" >/dev/null 2>&1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check prerequisites
|
||||||
|
print_status "Checking prerequisites..."
|
||||||
|
|
||||||
|
if ! command_exists flutter; then
|
||||||
|
print_error "Flutter not found. Please install Flutter SDK."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command_exists dart; then
|
||||||
|
print_error "Dart not found. Please install Dart SDK."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
print_success "Prerequisites check passed"
|
||||||
|
|
||||||
|
# Test backend
|
||||||
|
print_status "Testing backend..."
|
||||||
|
cd mnemo_cards_backend
|
||||||
|
|
||||||
|
if [ -f "pubspec.yaml" ]; then
|
||||||
|
print_status "Installing backend dependencies..."
|
||||||
|
dart pub get
|
||||||
|
|
||||||
|
print_status "Running backend code generation..."
|
||||||
|
dart run build_runner build --delete-conflicting-outputs || true
|
||||||
|
|
||||||
|
print_status "Running backend lints..."
|
||||||
|
dart analyze lib/ || print_warning "Backend linting failed"
|
||||||
|
dart format --set-exit-if-changed lib/ || print_warning "Backend formatting check failed"
|
||||||
|
|
||||||
|
print_status "Running backend tests..."
|
||||||
|
dart test --coverage || print_warning "Backend tests failed"
|
||||||
|
|
||||||
|
print_success "Backend tests completed"
|
||||||
|
else
|
||||||
|
print_warning "Backend pubspec.yaml not found, skipping..."
|
||||||
|
fi
|
||||||
|
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
# Test web app
|
||||||
|
print_status "Testing web app..."
|
||||||
|
cd mnemo_cards_web_v2
|
||||||
|
|
||||||
|
if [ -f "pubspec.yaml" ]; then
|
||||||
|
print_status "Installing web app dependencies..."
|
||||||
|
flutter pub get
|
||||||
|
|
||||||
|
print_status "Running web app code generation..."
|
||||||
|
flutter pub run build_runner build --delete-conflicting-outputs || true
|
||||||
|
|
||||||
|
print_status "Running web app lints..."
|
||||||
|
flutter analyze lib/ || print_warning "Web app linting failed"
|
||||||
|
flutter format --set-exit-if-changed lib/ || print_warning "Web app formatting check failed"
|
||||||
|
|
||||||
|
print_status "Running web app tests..."
|
||||||
|
flutter test --coverage || print_warning "Web app tests failed"
|
||||||
|
|
||||||
|
print_success "Web app tests completed"
|
||||||
|
else
|
||||||
|
print_warning "Web app pubspec.yaml not found, skipping..."
|
||||||
|
fi
|
||||||
|
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
# # Test mobile app
|
||||||
|
# print_status "Testing mobile app..."
|
||||||
|
# cd mnemo_cards
|
||||||
|
|
||||||
|
# if [ -f "pubspec.yaml" ]; then
|
||||||
|
# print_status "Installing mobile app dependencies..."
|
||||||
|
# flutter pub get
|
||||||
|
|
||||||
|
# print_status "Running mobile app code generation..."
|
||||||
|
# flutter pub run build_runner build --delete-conflicting-outputs || true
|
||||||
|
|
||||||
|
# print_status "Running mobile app lints..."
|
||||||
|
# flutter analyze lib/ || print_warning "Mobile app linting failed"
|
||||||
|
# flutter format --set-exit-if-changed lib/ || print_warning "Mobile app formatting check failed"
|
||||||
|
|
||||||
|
# print_status "Running mobile app tests..."
|
||||||
|
# flutter test --coverage || print_warning "Mobile app tests failed"
|
||||||
|
|
||||||
|
# print_success "Mobile app tests completed"
|
||||||
|
# else
|
||||||
|
# print_warning "Mobile app pubspec.yaml not found, skipping..."
|
||||||
|
# fi
|
||||||
|
|
||||||
|
# cd ..
|
||||||
|
|
||||||
|
# Test common packages
|
||||||
|
print_status "Testing common packages..."
|
||||||
|
|
||||||
|
common_projects=("mnemo_cards_common" "mnemo_cards_common_backend" "mnemo_cards_frontend_common")
|
||||||
|
|
||||||
|
for project in "${common_projects[@]}"; do
|
||||||
|
if [ -d "$project" ]; then
|
||||||
|
print_status "Testing $project..."
|
||||||
|
cd $project
|
||||||
|
|
||||||
|
if [ -f "pubspec.yaml" ]; then
|
||||||
|
flutter pub get || dart pub get || print_warning "Failed to get dependencies for $project"
|
||||||
|
flutter analyze lib/ 2>/dev/null || dart analyze lib/ 2>/dev/null || print_warning "Linting failed for $project"
|
||||||
|
fi
|
||||||
|
|
||||||
|
cd ..
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
print_success "Common packages tests completed"
|
||||||
|
|
||||||
|
# Test CORS configuration
|
||||||
|
print_status "Testing CORS configuration..."
|
||||||
|
|
||||||
|
# Check backend CORS config
|
||||||
|
if [ -f "mnemo_cards_backend/lib/api/mnemo_shelf.dart" ]; then
|
||||||
|
if grep -q "Access-Control-Allow-Origin.*\*" "mnemo_cards_backend/lib/api/mnemo_shelf.dart"; then
|
||||||
|
print_success "Backend CORS configured correctly (allows all origins)"
|
||||||
|
else
|
||||||
|
print_warning "Backend CORS configuration may be too restrictive"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check web app nginx config for conflicting headers
|
||||||
|
if [ -f "mnemo_cards_web_v2/deploy/nginx.conf" ]; then
|
||||||
|
if grep -q "^[[:space:]]*add_header Cross-Origin-Embedder-Policy.*require-corp" "mnemo_cards_web_v2/deploy/nginx.conf" || grep -q "^[[:space:]]*add_header Cross-Origin-Opener-Policy.*same-origin" "mnemo_cards_web_v2/deploy/nginx.conf"; then
|
||||||
|
print_warning "Web app nginx has active COEP/COOP headers that may conflict with CORS"
|
||||||
|
else
|
||||||
|
print_success "Web app nginx CORS configuration looks good (COEP/COOP headers disabled)"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
print_success "CORS configuration check completed"
|
||||||
|
|
||||||
|
# Check for uncommitted changes
|
||||||
|
print_status "Checking for uncommitted changes..."
|
||||||
|
if [ -n "$(git status --porcelain)" ]; then
|
||||||
|
print_warning "You have uncommitted changes:"
|
||||||
|
git status --short
|
||||||
|
print_warning "Please commit or stash them before pushing"
|
||||||
|
else
|
||||||
|
print_success "No uncommitted changes"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check workflow files
|
||||||
|
print_status "Validating workflow files..."
|
||||||
|
if [ -d ".forgejo/workflows" ]; then
|
||||||
|
for workflow in .forgejo/workflows/*.yml; do
|
||||||
|
if [ -f "$workflow" ]; then
|
||||||
|
print_status "Validating $workflow..."
|
||||||
|
# Basic YAML syntax check
|
||||||
|
if command_exists yamllint; then
|
||||||
|
yamllint "$workflow" || print_warning "YAML syntax issue in $workflow"
|
||||||
|
else
|
||||||
|
python3 -c "import yaml; yaml.safe_load(open('$workflow'))" || print_warning "YAML syntax issue in $workflow"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
print_success "Workflow validation completed"
|
||||||
|
else
|
||||||
|
print_warning "No .forgejo/workflows directory found"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Summary
|
||||||
|
print_success "Local CI/CD testing completed!"
|
||||||
|
print_status "If all tests passed, you can safely push your changes."
|
||||||
|
print_status "Don't forget to:"
|
||||||
|
echo " 1. Set up secrets in Forgejo if not done yet"
|
||||||
|
echo " 2. Test deployment scripts locally if possible"
|
||||||
|
echo " 3. Check that all required servers are accessible"
|
||||||
|
|
||||||
|
exit 0
|
||||||
Loading…
Reference in a new issue