Edit: /opt/canhelp/DEPLOY.md (3871B)
# Деплой мобильного приложения
## Триггеры CI/CD
Оба pipeline запускаются автоматически при создании git-тега вида `v*`:
```bash
# Поднять версию в pubspec.yaml, затем:
git add apps/mobile/pubspec.yaml
git commit -m "chore: bump version to 1.0.0+1"
git tag v1.0.0
git push origin main --tags
```
Или вручную через GitHub → Actions → выбрать workflow → Run workflow.
---
## GitHub Secrets (Settings → Secrets → Actions)
### Общие
| Secret | Описание |
|--------|----------|
| `PRODUCTION_API_URL` | `https://api.canhelp.gr` |
| `GOOGLE_CLIENT_ID` | Web OAuth 2.0 Client ID |
| `GOOGLE_IOS_CLIENT_ID` | iOS OAuth 2.0 Client ID |
### iOS
| Secret | Как получить |
|--------|-------------|
| `IOS_CERTIFICATE_BASE64` | `base64 -i Certificates.p12 \| pbcopy` |
| `IOS_CERTIFICATE_PASSWORD` | Пароль от .p12 |
| `KEYCHAIN_PASSWORD` | Любой случайный пароль для временного keychain |
| `IOS_PROVISIONING_PROFILE_BASE64` | `base64 -i profile.mobileprovision \| pbcopy` |
| `APP_STORE_CONNECT_API_KEY_ID` | App Store Connect → Users → Keys → Key ID |
| `APP_STORE_CONNECT_API_KEY_ISSUER_ID` | Issuer ID (на той же странице) |
| `APP_STORE_CONNECT_API_KEY_CONTENT` | Содержимое .p8 файла (без переносов строк) |
### Важно для Push на iOS / TestFlight
- Для доставки push в TestFlight недостаточно только FCM ключей.
- Нужно, чтобы в Firebase Console был загружен Apple APNs Auth Key (.p8) для iOS-приложения `gr.canhelp.app`.
- В Apple Developer для App ID должны быть включены Push Notifications, а release provisioning profile должен содержать `aps-environment=production`.
- Если push-токен появляется, но уведомления не приходят, обычно проблема именно в связке APNs ↔ Firebase, а не в коде Flutter.
### Android
| Secret | Как получить |
|--------|-------------|
| `ANDROID_KEYSTORE_BASE64` | `base64 -i canhelp-release.jks \| pbcopy` |
| `ANDROID_KEYSTORE_PASSWORD` | Пароль keystore |
| `ANDROID_KEY_ALIAS` | Alias ключа |
| `ANDROID_KEY_PASSWORD` | Пароль ключа |
| `PLAY_STORE_JSON_KEY` | Содержимое JSON-ключа сервисного аккаунта Google Play |
---
## Локальный запуск (без CI)
```bash
# iOS → TestFlight
cd apps/mobile/ios
bundle exec fastlane beta
# Android → Play Store Internal
cd apps/mobile/android
# Положить play-store-key.json в android/fastlane/
bundle exec fastlane internal
```
---
## SEO: обновление sitemap в поиске
После деплоя сайта можно принудительно отправить sitemap в поисковики:
```bash
cd /Users/exalted/git/CanHelp
npm run seo:submit-sitemap
```
Поддерживаются переменные окружения:
- `SITEMAP_URL` (по умолчанию `https://canhelp.gr/sitemap.xml`)
- `PING_BING` (`1`/`0`, по умолчанию `1`)
- `GSC_SITE` (например, `sc-domain:canhelp.gr` или URL-prefix свойство)
- `GSC_ACCESS_TOKEN` (OAuth access token c scope `https://www.googleapis.com/auth/webmasters`)
Если `GSC_SITE` и `GSC_ACCESS_TOKEN` не заданы, отправка в Google Search Console пропускается, но ping в Bing выполняется.
---
## Что куда летит
| Workflow | Файл | Куда |
|----------|------|------|
| `mobile-ios.yml` | `.ipa` | TestFlight (Apple) |
| `mobile-android.yml` | `.aab` | Play Store Internal Track |