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: |
flutter pub get
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
- name: Deploy Web App

View file

@ -2,7 +2,7 @@
## 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:**
- ✅ Configured nginx with ACME challenge support for Let's Encrypt
@ -19,17 +19,17 @@
- **Automation:** Cron job for daily certificate renewal with nginx reload
**Configuration Details:**
- **Domain:** api.memo-cards.online
- **Domain:** api.mnemo-cards.online
- **Backend Port:** 8081 (corrected from 8443)
- **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:**
- `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
**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:**
- 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
- Nginx configs updated to use mnemo-cards.online certificate for API
- 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:**
- Run backend-build_app.sh to generate multi-domain certificate

View file

@ -12,7 +12,7 @@
## Medium Priority
- [ ] 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** - Changed to multi-domain certificate approach (bypasses DNS subdomain requirements)
- [ ] 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
# Проверяем наличие 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)"
# Обновляем 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
echo "⚠️ Let's Encrypt сертификаты не найдены. Пытаемся создать..."
@ -30,16 +30,16 @@ else
sudo systemctl stop mnemo_cards_server 2>/dev/null || true
# Пытаемся получить Let's Encrypt сертификат
echo "🔐 Получаем Let's Encrypt сертификат для домена api.memo-cards.online..."
if sudo certbot certonly --standalone -d api.memo-cards.online --non-interactive --agree-tos --email admin@api.memo-cards.online; then
echo "🔐 Получаем Let's Encrypt сертификат для домена api.mnemo-cards.online..."
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 "🚀 Запускаем в двойном режиме (HTTP + HTTPS)"
# Обновляем 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
echo "❌ Не удалось создать Let's Encrypt сертификат. Запускаем в HTTP режиме"
echo "💡 Убедитесь, что:"
echo " - Домен api.memo-cards.online указывает на этот сервер"
echo " - Домен api.mnemo-cards.online указывает на этот сервер"
echo " - Порт 80 доступен извне"
echo " - Firewall разрешает входящие соединения на порт 80"
# Возвращаем обычный режим

View file

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

View file

@ -6,7 +6,7 @@
mnemo_cards_web_v2/
├── deploy.sh # Wrapper script (run this!)
└── 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
├── setup-vscode-domain.sh # VSCode domain setup script
└── README.md # This file
@ -33,7 +33,7 @@ cd mnemo_cards_web_v2
This wrapper script will:
1. Use centralized config from `tools/deploy/web-app/config.sh`
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)
@ -46,7 +46,7 @@ cd deploy
All deployment settings are in `tools/deploy/web-app/config.sh`:
- 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)
## 📝 Project-Specific Files

View file

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

View file

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

View file

@ -68,7 +68,7 @@ jobs:
run: |
cd mnemo_cards_web_v2
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
run: |

View file

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

View file

@ -42,8 +42,8 @@ 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 приложение
- **API Backend** (api.mnemo-cards.online): Dart SDK, systemd сервис `mnemo_cards_server.service`
- **Web App** (mnemo-cards.online): Nginx, Flutter Web приложение
- **SSL**: Let's Encrypt сертификаты для обоих доменов
- **CORS**: Правильно настроен между доменами, COEP/COOP headers отключены для совместимости
- Доступ по SSH для деплоя
@ -71,7 +71,7 @@ OPENAI_API_KEY # Для AI-агента
### ✅ Чек-лист готовности
- [ ] **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`)
- [ ] **Код готов к деплою** (все тесты проходят)
@ -80,7 +80,7 @@ OPENAI_API_KEY # Для AI-агента
1. **Подготовка:**
```bash
# Генерация и настройка 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
```
@ -112,9 +112,9 @@ 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)
- `mnemo-cards.online` → `147.45.152.129`
- `api.mnemo-cards.online` → `147.45.152.129`
- `code.mnemo-cards.online` → `147.45.152.129` (для Forgejo)
#### 3. Проверка доступа к серверу
```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 "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 проблемы
```bash
# Проверка DNS разрешения
nslookup memo-cards.online
nslookup api.memo-cards.online
nslookup code.memo-cards.online
nslookup mnemo-cards.online
nslookup api.mnemo-cards.online
nslookup code.mnemo-cards.online
# Проверка доступности портов
telnet 147.45.152.129 80
@ -254,7 +254,7 @@ flutter pub cache repair
### Проблемы с SSH
```bash
# Проверка 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

View file

@ -44,7 +44,7 @@ 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"
echo " Generate with: ssh-keygen -t ed25519 -C 'forgejo-deploy@mnemo-cards.online' -f $SSH_KEY"
exit 1
fi
@ -74,7 +74,7 @@ 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
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
print_status "DNS for $domain resolves to $SERVER_IP"
else

View file

@ -37,7 +37,7 @@ print_success() {
# Check if key exists
if [ ! -f "$SSH_KEY" ]; then
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
fi