This commit is contained in:
Dmitry 2025-11-20 01:41:54 +03:00
parent cdf6f9aa95
commit 78ae1a557d
14 changed files with 42 additions and 42 deletions

View file

@ -93,7 +93,7 @@ jobs:
run: | run: |
flutter pub get flutter pub get
flutter build web --release \ flutter build web --release \
--dart-define=API_BASE_URL=https://api.memo-cards.online:8444 \ --dart-define=API_BASE_URL=https://api.mnemo-cards.online:8444 \
--dart2js-optimization=O4 --dart2js-optimization=O4
- name: Deploy Web App - name: Deploy Web App

View file

@ -2,7 +2,7 @@
## 2025-11-16 (Evening) - Let's Encrypt SSL Certificate Setup ✅ COMPLETED ## 2025-11-16 (Evening) - Let's Encrypt SSL Certificate Setup ✅ COMPLETED
**Feature:** SSL Certificate Configuration for API Domain (api.memo-cards.online) **Feature:** SSL Certificate Configuration for API Domain (api.mnemo-cards.online)
**Completed Tasks:** **Completed Tasks:**
- ✅ Configured nginx with ACME challenge support for Let's Encrypt - ✅ Configured nginx with ACME challenge support for Let's Encrypt
@ -19,17 +19,17 @@
- **Automation:** Cron job for daily certificate renewal with nginx reload - **Automation:** Cron job for daily certificate renewal with nginx reload
**Configuration Details:** **Configuration Details:**
- **Domain:** api.memo-cards.online - **Domain:** api.mnemo-cards.online
- **Backend Port:** 8081 (corrected from 8443) - **Backend Port:** 8081 (corrected from 8443)
- **Webroot Path:** /var/www/html/.well-known/acme-challenge/ - **Webroot Path:** /var/www/html/.well-known/acme-challenge/
- **Certificate Path:** /etc/letsencrypt/live/api.memo-cards.online/ - **Certificate Path:** /etc/letsencrypt/live/api.mnemo-cards.online/
**Scripts Updated:** **Scripts Updated:**
- `backend-build_app_webroot.sh` - Changed from dual HTTP/HTTPS mode to HTTPS-only mode, added automatic nginx config update - `backend-build_app_webroot.sh` - Changed from dual HTTP/HTTPS mode to HTTPS-only mode, added automatic nginx config update
- `backend-build_app.sh` - Changed from dual HTTP/HTTPS mode to HTTPS-only mode, fixed port configuration, replaced netstat with ss/lsof, added automatic nginx config update - `backend-build_app.sh` - Changed from dual HTTP/HTTPS mode to HTTPS-only mode, fixed port configuration, replaced netstat with ss/lsof, added automatic nginx config update
**Documentation Updated:** **Documentation Updated:**
- `public/open_api.yaml` - Updated server URL from localhost:8080 to https://api.memo-cards.online - `public/open_api.yaml` - Updated server URL from localhost:8080 to https://api.mnemo-cards.online
**Nginx Configuration:** **Nginx Configuration:**
- Updated `/etc/nginx/sites-available/api` for HTTPS-only mode - Updated `/etc/nginx/sites-available/api` for HTTPS-only mode
@ -47,7 +47,7 @@
- `backend-build_app.sh` - Now requests multi-domain certificate with all subdomains - `backend-build_app.sh` - Now requests multi-domain certificate with all subdomains
- Nginx configs updated to use mnemo-cards.online certificate for API - Nginx configs updated to use mnemo-cards.online certificate for API
- Backend service configured to use shared certificate path - Backend service configured to use shared certificate path
- Fixed all domain names from memo-cards to mnemo-cards - Fixed all domain names from mnemo-cards to mnemo-cards
**Next Action:** **Next Action:**
- Run backend-build_app.sh to generate multi-domain certificate - Run backend-build_app.sh to generate multi-domain certificate

View file

@ -12,7 +12,7 @@
## Medium Priority ## Medium Priority
- [ ] Review existing codebase architecture - [ ] Review existing codebase architecture
- [x] **COMPLETED** - Set up Let's Encrypt SSL certificates for api.memo-cards.online with automatic renewal - [x] **COMPLETED** - Set up Let's Encrypt SSL certificates for api.mnemo-cards.online with automatic renewal
- [x] **COMPLETED** - Update nginx configuration for HTTPS-only API (redirect HTTP to HTTPS, proxy to port 8443) - [x] **COMPLETED** - Update nginx configuration for HTTPS-only API (redirect HTTP to HTTPS, proxy to port 8443)
- [x] **COMPLETED** - Changed to multi-domain certificate approach (bypasses DNS subdomain requirements) - [x] **COMPLETED** - Changed to multi-domain certificate approach (bypasses DNS subdomain requirements)
- [ ] Verify HTTPS-only functionality and test API endpoints over SSL - [ ] Verify HTTPS-only functionality and test API endpoints over SSL

View file

@ -19,10 +19,10 @@ sudo cp server_build.exe server.exe
rm server_build.exe rm server_build.exe
# Проверяем наличие Let's Encrypt сертификатов для двойного режима # Проверяем наличие Let's Encrypt сертификатов для двойного режима
if [ -d "/etc/letsencrypt/live/api.memo-cards.online" ]; then if [ -d "/etc/letsencrypt/live/api.mnemo-cards.online" ]; then
echo "✅ Let's Encrypt сертификаты найдены. Запускаем в двойном режиме (HTTP + HTTPS)" echo "✅ Let's Encrypt сертификаты найдены. Запускаем в двойном режиме (HTTP + HTTPS)"
# Обновляем systemd сервис для двойного режима # Обновляем systemd сервис для двойного режима
sudo sed -i 's|ExecStart=/root/mnemo_cards_backend/server.exe.*|ExecStart=/root/mnemo_cards_backend/server.exe --dual --certs /etc/letsencrypt/live/api.memo-cards.online -a 0.0.0.0 -p 8081|' /etc/systemd/system/mnemo_cards_server.service sudo sed -i 's|ExecStart=/root/mnemo_cards_backend/server.exe.*|ExecStart=/root/mnemo_cards_backend/server.exe --dual --certs /etc/letsencrypt/live/api.mnemo-cards.online -a 0.0.0.0 -p 8081|' /etc/systemd/system/mnemo_cards_server.service
else else
echo "⚠️ Let's Encrypt сертификаты не найдены. Пытаемся создать..." echo "⚠️ Let's Encrypt сертификаты не найдены. Пытаемся создать..."
@ -30,16 +30,16 @@ else
sudo systemctl stop mnemo_cards_server 2>/dev/null || true sudo systemctl stop mnemo_cards_server 2>/dev/null || true
# Пытаемся получить Let's Encrypt сертификат # Пытаемся получить Let's Encrypt сертификат
echo "🔐 Получаем Let's Encrypt сертификат для домена api.memo-cards.online..." echo "🔐 Получаем Let's Encrypt сертификат для домена api.mnemo-cards.online..."
if sudo certbot certonly --standalone -d api.memo-cards.online --non-interactive --agree-tos --email admin@api.memo-cards.online; then if sudo certbot certonly --standalone -d api.mnemo-cards.online --non-interactive --agree-tos --email admin@api.mnemo-cards.online; then
echo "✅ Let's Encrypt сертификат успешно создан!" echo "✅ Let's Encrypt сертификат успешно создан!"
echo "🚀 Запускаем в двойном режиме (HTTP + HTTPS)" echo "🚀 Запускаем в двойном режиме (HTTP + HTTPS)"
# Обновляем systemd сервис для двойного режима # Обновляем systemd сервис для двойного режима
sudo sed -i 's|ExecStart=/root/mnemo_cards_backend/server.exe.*|ExecStart=/root/mnemo_cards_backend/server.exe --dual --certs /etc/letsencrypt/live/api.memo-cards.online -a 0.0.0.0 -p 8081|' /etc/systemd/system/mnemo_cards_server.service sudo sed -i 's|ExecStart=/root/mnemo_cards_backend/server.exe.*|ExecStart=/root/mnemo_cards_backend/server.exe --dual --certs /etc/letsencrypt/live/api.mnemo-cards.online -a 0.0.0.0 -p 8081|' /etc/systemd/system/mnemo_cards_server.service
else else
echo "❌ Не удалось создать Let's Encrypt сертификат. Запускаем в HTTP режиме" echo "❌ Не удалось создать Let's Encrypt сертификат. Запускаем в HTTP режиме"
echo "💡 Убедитесь, что:" echo "💡 Убедитесь, что:"
echo " - Домен api.memo-cards.online указывает на этот сервер" echo " - Домен api.mnemo-cards.online указывает на этот сервер"
echo " - Порт 80 доступен извне" echo " - Порт 80 доступен извне"
echo " - Firewall разрешает входящие соединения на порт 80" echo " - Firewall разрешает входящие соединения на порт 80"
# Возвращаем обычный режим # Возвращаем обычный режим

View file

@ -103,7 +103,7 @@ flutter run -d chrome --web-port=8080
3. **Nginx** настроен без конфликтующих COEP/COOP headers ✅ 3. **Nginx** настроен без конфликтующих COEP/COOP headers ✅
Текущая конфигурация позволяет: Текущая конфигурация позволяет:
- ✅ Запросы с `memo-cards.online` на `https://api.mnemo-cards.online` - ✅ Запросы с `mnemo-cards.online` на `https://api.mnemo-cards.online`
- ✅ Все необходимые HTTP методы и headers - ✅ Все необходимые HTTP методы и headers
- ✅ Preflight OPTIONS запросы - ✅ Preflight OPTIONS запросы

View file

@ -6,7 +6,7 @@
mnemo_cards_web_v2/ mnemo_cards_web_v2/
├── deploy.sh # Wrapper script (run this!) ├── deploy.sh # Wrapper script (run this!)
└── deploy/ └── deploy/
├── nginx.conf # Main domain nginx config (memo-cards.online) ├── nginx.conf # Main domain nginx config (mnemo-cards.online)
├── vscode-nginx.conf # VSCode server nginx config ├── vscode-nginx.conf # VSCode server nginx config
├── setup-vscode-domain.sh # VSCode domain setup script ├── setup-vscode-domain.sh # VSCode domain setup script
└── README.md # This file └── README.md # This file
@ -33,7 +33,7 @@ cd mnemo_cards_web_v2
This wrapper script will: This wrapper script will:
1. Use centralized config from `tools/deploy/web-app/config.sh` 1. Use centralized config from `tools/deploy/web-app/config.sh`
2. Build the Flutter web app locally with `-O4` optimization 2. Build the Flutter web app locally with `-O4` optimization
3. Deploy to `memo-cards.online` using `deploy/nginx.conf` 3. Deploy to `mnemo-cards.online` using `deploy/nginx.conf`
### Setup VSCode Server (Optional) ### Setup VSCode Server (Optional)
@ -46,7 +46,7 @@ cd deploy
All deployment settings are in `tools/deploy/web-app/config.sh`: All deployment settings are in `tools/deploy/web-app/config.sh`:
- Server IP: `147.45.152.129` - Server IP: `147.45.152.129`
- Main domain: `memo-cards.online` - Main domain: `mnemo-cards.online`
- API URL: `https://api.mnemo-cards.online` (nginx reverse proxy on port 443) - API URL: `https://api.mnemo-cards.online` (nginx reverse proxy on port 443)
## 📝 Project-Specific Files ## 📝 Project-Specific Files

View file

@ -131,7 +131,7 @@ SYSTEMD_EOF
# Stop nginx temporarily for certificate issuance # Stop nginx temporarily for certificate issuance
systemctl stop nginx 2>/dev/null || true 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 if certbot certonly --standalone -d vscode.mnemo-cards.online --non-interactive --agree-tos --email admin@mnemo-cards.online; then
echo "✅ Let's Encrypt certificate obtained successfully for vscode.mnemo-cards.online!" echo "✅ Let's Encrypt certificate obtained successfully for vscode.mnemo-cards.online!"
else else
echo "❌ Failed to get Let's Encrypt certificate. Generating self-signed certificate..." echo "❌ Failed to get Let's Encrypt certificate. Generating self-signed certificate..."

View file

@ -54,8 +54,8 @@ tools/
### Компоненты ### Компоненты
- **Backend** (Dart) → `api.memo-cards.online` - **Backend** (Dart) → `api.mnemo-cards.online`
- **Web App** (Flutter) → `memo-cards.online` - **Web App** (Flutter) → `mnemo-cards.online`
- **Mobile App** (Flutter) → GitHub releases - **Mobile App** (Flutter) → GitHub releases
## Требования ## Требования
@ -67,7 +67,7 @@ tools/
### Деплой ### Деплой
- SSH доступ к серверу `147.45.152.129` - SSH доступ к серверу `147.45.152.129`
- DNS: `memo-cards.online`, `api.memo-cards.online` - DNS: `mnemo-cards.online`, `api.mnemo-cards.online`
- Forgejo с настроенными secrets - Forgejo с настроенными secrets
## Документация ## Документация

View file

@ -50,8 +50,8 @@ Forgejo Actions workflows для автоматической сборки, те
- **Mobile App**: Сборка APK для Android и app для iOS - **Mobile App**: Сборка APK для Android и app для iOS
### 3. Развертывание ### 3. Развертывание
- **Backend**: Автоматическое обновление сервиса на `api.memo-cards.online` - **Backend**: Автоматическое обновление сервиса на `api.mnemo-cards.online`
- **Web App**: Rsync на веб сервер `memo-cards.online` + перезагрузка Nginx - **Web App**: Rsync на веб сервер `mnemo-cards.online` + перезагрузка Nginx
- **Mobile App**: Создание GitHub релиза с APK - **Mobile App**: Создание GitHub релиза с APK
## Секреты Forgejo ## Секреты Forgejo

View file

@ -68,7 +68,7 @@ jobs:
run: | run: |
cd mnemo_cards_web_v2 cd mnemo_cards_web_v2
flutter pub get flutter pub get
flutter build web --release --dart-define=API_BASE_URL=https://api.memo-cards.online:8444 --dart2js-optimization=O4 flutter build web --release --dart-define=API_BASE_URL=https://api.mnemo-cards.online:8444 --dart2js-optimization=O4
- name: Deploy Web App - name: Deploy Web App
run: | run: |

View file

@ -88,8 +88,8 @@ else
sudo chown -R www-data:www-data /var/www/html sudo chown -R www-data:www-data /var/www/html
# Пытаемся получить Let's Encrypt сертификат через webroot # Пытаемся получить Let's Encrypt сертификат через webroot
echo "🔐 Получаем Let's Encrypt сертификат через webroot для домена api.memo-cards.online..." echo "🔐 Получаем Let's Encrypt сертификат через webroot для домена api.mnemo-cards.online..."
if sudo certbot certonly --webroot -w /var/www/html -d api.memo-cards.online --non-interactive --agree-tos --email admin@api.mnemo-cards.online; then if sudo certbot certonly --webroot -w /var/www/html -d api.mnemo-cards.online --non-interactive --agree-tos --email admin@api.mnemo-cards.online; then
echo "✅ Let's Encrypt сертификат успешно создан через webroot!" echo "✅ Let's Encrypt сертификат успешно создан через webroot!"
echo "🚀 Запускаем в HTTPS-only режиме" echo "🚀 Запускаем в HTTPS-only режиме"
# Обновляем systemd сервис для HTTPS-only режима # Обновляем systemd сервис для HTTPS-only режима
@ -98,7 +98,7 @@ else
echo "❌ Не удалось создать Let's Encrypt сертификат через webroot" echo "❌ Не удалось создать Let's Encrypt сертификат через webroot"
echo "💡 Убедитесь, что:" echo "💡 Убедитесь, что:"
echo " - У вас установлен и запущен веб-сервер (nginx/apache)" echo " - У вас установлен и запущен веб-сервер (nginx/apache)"
echo " - Домен api.memo-cards.online указывает на этот сервер" echo " - Домен api.mnemo-cards.online указывает на этот сервер"
echo " - Директория /var/www/html доступна для записи certbot" echo " - Директория /var/www/html доступна для записи certbot"
echo " - Firewall разрешает входящие соединения на порт 80" echo " - Firewall разрешает входящие соединения на порт 80"
echo " - Веб-сервер правильно настроен для обслуживания .well-known/acme-challenge/" echo " - Веб-сервер правильно настроен для обслуживания .well-known/acme-challenge/"

View file

@ -42,8 +42,8 @@ OPENAI_API_KEY # Для AI-агента
## Настройка серверов ## Настройка серверов
### Единый сервер (147.45.152.129) ### Единый сервер (147.45.152.129)
- **API Backend** (api.memo-cards.online): Dart SDK, systemd сервис `mnemo_cards_server.service` - **API Backend** (api.mnemo-cards.online): Dart SDK, systemd сервис `mnemo_cards_server.service`
- **Web App** (memo-cards.online): Nginx, Flutter Web приложение - **Web App** (mnemo-cards.online): Nginx, Flutter Web приложение
- **SSL**: Let's Encrypt сертификаты для обоих доменов - **SSL**: Let's Encrypt сертификаты для обоих доменов
- **CORS**: Правильно настроен между доменами, COEP/COOP headers отключены для совместимости - **CORS**: Правильно настроен между доменами, COEP/COOP headers отключены для совместимости
- Доступ по SSH для деплоя - Доступ по SSH для деплоя
@ -71,7 +71,7 @@ OPENAI_API_KEY # Для AI-агента
### ✅ Чек-лист готовности ### ✅ Чек-лист готовности
- [ ] **SSH ключ сгенерирован и добавлен на сервер** - [ ] **SSH ключ сгенерирован и добавлен на сервер**
- [ ] **DNS домены настроены** (`memo-cards.online`, `api.memo-cards.online`, `code.memo-cards.online`) - [ ] **DNS домены настроены** (`mnemo-cards.online`, `api.mnemo-cards.online`, `code.mnemo-cards.online`)
- [ ] **Forgejo secrets настроены** (`DEPLOY_SSH_PRIVATE_KEY`) - [ ] **Forgejo secrets настроены** (`DEPLOY_SSH_PRIVATE_KEY`)
- [ ] **Код готов к деплою** (все тесты проходят) - [ ] **Код готов к деплою** (все тесты проходят)
@ -80,7 +80,7 @@ OPENAI_API_KEY # Для AI-агента
1. **Подготовка:** 1. **Подготовка:**
```bash ```bash
# Генерация и настройка SSH ключа # Генерация и настройка SSH ключа
ssh-keygen -t ed25519 -C "forgejo-deploy@memo-cards.online" -f ~/.ssh/forgejo_deploy 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 ssh-copy-id -i ~/.ssh/forgejo_deploy.pub root@147.45.152.129
``` ```
@ -112,9 +112,9 @@ cat ~/.ssh/forgejo_deploy
#### 2. Настройка DNS доменов #### 2. Настройка DNS доменов
Убедитесь, что DNS записи настроены: Убедитесь, что DNS записи настроены:
- `memo-cards.online` → `147.45.152.129` - `mnemo-cards.online` → `147.45.152.129`
- `api.memo-cards.online` → `147.45.152.129` - `api.mnemo-cards.online` → `147.45.152.129`
- `code.memo-cards.online` → `147.45.152.129` (для Forgejo) - `code.mnemo-cards.online` → `147.45.152.129` (для Forgejo)
#### 3. Проверка доступа к серверу #### 3. Проверка доступа к серверу
```bash ```bash
@ -227,15 +227,15 @@ ssh root@147.45.152.129 "nginx -t"
ssh root@147.45.152.129 "ls -la /etc/letsencrypt/live/" 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" ssh root@147.45.152.129 "certbot certonly --standalone -d mnemo-cards.online -d api.mnemo-cards.online --email admin@mnemo-cards.online"
``` ```
#### DNS проблемы #### DNS проблемы
```bash ```bash
# Проверка DNS разрешения # Проверка DNS разрешения
nslookup memo-cards.online nslookup mnemo-cards.online
nslookup api.memo-cards.online nslookup api.mnemo-cards.online
nslookup code.memo-cards.online nslookup code.mnemo-cards.online
# Проверка доступности портов # Проверка доступности портов
telnet 147.45.152.129 80 telnet 147.45.152.129 80
@ -254,7 +254,7 @@ flutter pub cache repair
### Проблемы с SSH ### Проблемы с SSH
```bash ```bash
# Проверка SSH ключа # Проверка SSH ключа
ssh -T git@code.memo-cards.online ssh -T git@code.mnemo-cards.online
# Проверка доступа к серверам # Проверка доступа к серверам
ssh -i ~/.ssh/forgejo_deploy root@147.45.152.129 ssh -i ~/.ssh/forgejo_deploy root@147.45.152.129

View file

@ -44,7 +44,7 @@ if [ -f "$SSH_KEY" ]; then
print_status "SSH private key found at $SSH_KEY" print_status "SSH private key found at $SSH_KEY"
else else
print_error "SSH private key not found at $SSH_KEY" 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" echo " Generate with: ssh-keygen -t ed25519 -C 'forgejo-deploy@mnemo-cards.online' -f $SSH_KEY"
exit 1 exit 1
fi fi
@ -74,7 +74,7 @@ fi
# Check 4: DNS resolution # Check 4: DNS resolution
echo "4. Checking DNS resolution..." echo "4. Checking DNS resolution..."
for domain in "memo-cards.online" "api.memo-cards.online" "code.memo-cards.online"; do for domain in "mnemo-cards.online" "api.mnemo-cards.online" "code.mnemo-cards.online"; do
if nslookup "$domain" 2>/dev/null | grep -q "$SERVER_IP"; then if nslookup "$domain" 2>/dev/null | grep -q "$SERVER_IP"; then
print_status "DNS for $domain resolves to $SERVER_IP" print_status "DNS for $domain resolves to $SERVER_IP"
else else

View file

@ -37,7 +37,7 @@ print_success() {
# Check if key exists # Check if key exists
if [ ! -f "$SSH_KEY" ]; then if [ ! -f "$SSH_KEY" ]; then
print_error "SSH key not found at $SSH_KEY" print_error "SSH key not found at $SSH_KEY"
print_info "Generate it first with: ssh-keygen -t ed25519 -C 'forgejo-deploy@memo-cards.online' -f $SSH_KEY" print_info "Generate it first with: ssh-keygen -t ed25519 -C 'forgejo-deploy@mnemo-cards.online' -f $SSH_KEY"
exit 1 exit 1
fi fi