- BRAINYCP_DEPLOY_GUIDE.md: complete human deployment guide - AI_DEPLOY_CONTEXT.md: machine-readable deploy instructions for AI agents - sync-production.sh: universal deployment script (full/quick/status/logs/backup) - DEPLOY_PLAN.md: step-by-step deployment plan - DEPLOY_AUDIT_REPORT.md: server audit results - MIGRATION_AUDIT_REPORT.md: MySQL migration complexity analysis - SERVER_AUDIT_REPORT.md: server environment audit - Update README.md with BrainyCP deploy workflow and Git sync instructions Refs: production server 46.175.149.131, domain tenerifeprop.es
310 lines
9.4 KiB
Markdown
310 lines
9.4 KiB
Markdown
# Руководство по деплою TenerifeProp на BrainyCP
|
||
|
||
## Для кого это руководство
|
||
Для разработчиков и DevOps-инженеров, которые будут разворачивать или обновлять проект TenerifeProp на хостинге с панелью BrainyCP.
|
||
|
||
## 1. Предварительные требования
|
||
|
||
### На сервере (что уже должно быть)
|
||
- **BrainyCP** установлена и работает.
|
||
- **Домен** добавлен в панель (`tenerifeprop.es`).
|
||
- **NodeJS** установлен через панель BrainyCP (создаст заглушку на порту, например `3003`).
|
||
- **SSL** активирован (Let's Encrypt через панель).
|
||
- **SSH-доступ** к серверу с правами root.
|
||
- **Git** установлен (`git --version`).
|
||
|
||
### На локальной машине
|
||
- Доступ к репозиторию `git.softuniq.eu/UniqueSoft/TenerifeProp`.
|
||
- SSH-ключ или логин/пароль для доступа к серверу.
|
||
|
||
### Ветки проекта
|
||
```
|
||
origin/dev — основная ветка разработки
|
||
origin/main — ветка релиза
|
||
origin/production — ветка продакшена на BrainyCP (создаётся при первом деплое)
|
||
```
|
||
|
||
## 2. Структура проекта на сервере
|
||
|
||
```
|
||
/home/nero/sites/tenerifeprop.es/
|
||
├── .env # Переменные окружения
|
||
├── src/ # Серверный код
|
||
├── public/ # Статические файлы
|
||
├── data/
|
||
│ └── tenerifeprop.db # SQLite база данных
|
||
├── node_modules/ # Зависимости
|
||
├── package.json
|
||
├── bun.lock
|
||
└── .git/ # Git репозиторий (если клонирован)
|
||
```
|
||
|
||
## 3. Первый деплой (ручной)
|
||
|
||
### Шаг 1: Остановить заглушку BrainyCP
|
||
```bash
|
||
ssh root@46.175.149.131
|
||
systemctl stop nodejs@3003.service
|
||
systemctl disable nodejs@3003.service
|
||
```
|
||
|
||
### Шаг 2: Установить Bun
|
||
```bash
|
||
# Установка Bun в папку пользователя (не трогает системный Node.js)
|
||
curl -fsSL https://bun.sh/install | BUN_INSTALL=/home/nero/.bun bash
|
||
chown -R nero:nero /home/nero/.bun
|
||
```
|
||
|
||
Путь к Bun: `/home/nero/.bun/bin/bun`
|
||
|
||
### Шаг 3: Клонировать репозиторий
|
||
```bash
|
||
cd /home/nero/sites/tenerifeprop.es
|
||
# Очистить заглушку (сохранить .well-known для SSL)
|
||
rm -f index.js app.js app.css
|
||
git clone https://git.softuniq.eu/UniqueSoft/TenerifeProp.git .
|
||
```
|
||
|
||
### Шаг 4: Переключиться на ветку production
|
||
```bash
|
||
git checkout -b production origin/production
|
||
# или если ветки нет:
|
||
git checkout -b production
|
||
```
|
||
|
||
### Шаг 5: Создать `.env`
|
||
```bash
|
||
cat > .env <<'EOF'
|
||
NODE_ENV=production
|
||
PORT=3003
|
||
RESEND_API_KEY=your_key_here
|
||
TELEGRAM_BOT_TOKEN=your_token_here
|
||
TELEGRAM_CHAT_ID=your_chat_id_here
|
||
GITEA_API_URL=https://git.softuniq.eu/api/v1
|
||
GITEA_TOKEN=your_gitea_token
|
||
EOF
|
||
chmod 600 .env
|
||
chown nero:nero .env
|
||
```
|
||
|
||
### Шаг 6: Установить зависимости
|
||
```bash
|
||
/home/nero/.bun/bin/bun install --production
|
||
```
|
||
|
||
### Шаг 7: Настроить systemd
|
||
Создать файл `/etc/systemd/system/tenerifeprop.service`:
|
||
|
||
```ini
|
||
[Unit]
|
||
Description=TenerifeProp Bun Server
|
||
After=network.target
|
||
|
||
[Service]
|
||
Type=simple
|
||
User=nero
|
||
WorkingDirectory=/home/nero/sites/tenerifeprop.es
|
||
Environment=NODE_ENV=production
|
||
Environment=PORT=3003
|
||
EnvironmentFile=/home/nero/sites/tenerifeprop.es/.env
|
||
ExecStart=/home/nero/.bun/bin/bun run src/server/index.ts
|
||
Restart=always
|
||
RestartSec=5
|
||
StandardOutput=journal
|
||
StandardError=journal
|
||
|
||
[Install]
|
||
WantedBy=multi-user.target
|
||
```
|
||
|
||
Активировать:
|
||
```bash
|
||
systemctl daemon-reload
|
||
systemctl enable tenerifeprop.service
|
||
systemctl start tenerifeprop.service
|
||
```
|
||
|
||
### Шаг 8: Проверить работу
|
||
```bash
|
||
# Локальный тест
|
||
curl http://localhost:3003/api/settings
|
||
# Ожидается: {"success":true,"data":{...}}
|
||
|
||
# Публичный тест
|
||
curl https://tenerifeprop.es/api/settings
|
||
|
||
# Логи
|
||
journalctl -u tenerifeprop -f
|
||
```
|
||
|
||
## 4. Обновление проекта (Git-based deploy)
|
||
|
||
### Метод A: Скрипт автообновления (рекомендуется)
|
||
|
||
На сервере есть скрипт `/home/nero/sites/tenerifeprop.es/scripts/deploy.sh`.
|
||
|
||
```bash
|
||
# Обновить из ветки production
|
||
cd /home/nero/sites/tenerifeprop.es
|
||
./scripts/deploy.sh
|
||
```
|
||
|
||
Что делает скрипт:
|
||
1. `git fetch origin`
|
||
2. `git reset --hard origin/production`
|
||
3. `bun install --production`
|
||
4. `chown -R nero:nero .`
|
||
5. `chmod 600 .env`
|
||
6. `systemctl restart tenerifeprop`
|
||
7. Проверка healthcheck
|
||
|
||
### Метод B: Ручное обновление
|
||
|
||
```bash
|
||
ssh root@46.175.149.131
|
||
cd /home/nero/sites/tenerifeprop.es
|
||
|
||
# Переключиться на production
|
||
git checkout production
|
||
git pull origin production
|
||
|
||
# Установить зависимости (если изменились)
|
||
/home/nero/.bun/bin/bun install --production
|
||
|
||
# Права
|
||
chown -R nero:nero .
|
||
chmod 600 .env
|
||
|
||
# Перезапустить
|
||
systemctl restart tenerifeprop
|
||
|
||
# Проверить
|
||
systemctl status tenerifeprop
|
||
curl http://localhost:3003/api/settings
|
||
```
|
||
|
||
## 5. Git workflow для синхронизации
|
||
|
||
### Схема веток
|
||
```
|
||
[dev] → commit, push → PR → [main] → tag → PR → [production] → auto-deploy
|
||
```
|
||
|
||
### Как внести изменения
|
||
|
||
1. **Разработка** (на локальной машине или в Docker):
|
||
```bash
|
||
git checkout dev
|
||
# вносишь изменения
|
||
git add .
|
||
git commit -m "feat: новая фича"
|
||
git push origin dev
|
||
```
|
||
|
||
2. **Релиз** (merge в main):
|
||
```bash
|
||
git checkout main
|
||
git merge dev
|
||
git tag -a v1.1.0 -m "Release v1.1.0"
|
||
git push origin main --tags
|
||
```
|
||
|
||
3. **Деплой** (merge в production):
|
||
```bash
|
||
git checkout production
|
||
git merge main
|
||
git push origin production
|
||
```
|
||
|
||
4. **Авто-деплой** (на сервере):
|
||
- Вебхук Gitea → сервер получает уведомление.
|
||
- Или `git pull` по cron каждые 5 минут.
|
||
- Или запускаешь `./scripts/deploy.sh` вручную.
|
||
|
||
### Webhook (Gitea → сервер)
|
||
|
||
В Gitea (Settings → Webhooks → Add Webhook):
|
||
- URL: `https://tenerifeprop.es/api/admin/deploy`
|
||
- Секретный ключ: настрой в `.env` (`DEPLOY_SECRET`)
|
||
- События: `push`
|
||
|
||
На сервере нужен endpoint `/api/admin/deploy`, который:
|
||
1. Проверяет секретный ключ.
|
||
2. Запускает `git pull origin production`.
|
||
3. Перезапускает сервер.
|
||
|
||
Это усложнение — рекомендуется начать со скрипта.
|
||
|
||
## 6. Резервное копирование базы данных
|
||
|
||
### Дамп БД (на сервере)
|
||
```bash
|
||
cd /home/nero/sites/tenerifeprop.es
|
||
# SQLite — просто копируем файл
|
||
cp data/tenerifeprop.db /backup/tenerifeprop-$(date +%Y%m%d).db
|
||
```
|
||
|
||
### Восстановление
|
||
```bash
|
||
systemctl stop tenerifeprop
|
||
cp /backup/tenerifeprop-20260513.db data/tenerifeprop.db
|
||
chown nero:nero data/tenerifeprop.db
|
||
chmod 644 data/tenerifeprop.db
|
||
systemctl start tenerifeprop
|
||
```
|
||
|
||
## 7. Troubleshooting
|
||
|
||
| Проблема | Решение |
|
||
|----------|---------|
|
||
| Bun не найден | Проверь `ls /home/nero/.bun/bin/bun`. Если нет — переустановить. |
|
||
| Порт 3003 занят | `lsof -i :3003` → найти и убить процесс. Или изменить порт в `.env` и Nginx. |
|
||
| Nginx не проксирует | Проверить конфиг BrainyCP. Сравнить с рабочим сайтом. |
|
||
| Permission denied | `chown -R nero:nero /home/nero/sites/tenerifeprop.es` |
|
||
| SQLite database is locked | Остановить сервер, удалить `*.db-shm` и `*.db-wal`, запустить. |
|
||
| 502 Bad Gateway | Backend не запущен. `systemctl start tenerifeprop`. |
|
||
| Статика 404 | Проверить пути в `public/`. CSS/JS должны быть доступны через Bun. |
|
||
|
||
## 8. Команды для мониторинга
|
||
|
||
```bash
|
||
# Статус сервера
|
||
systemctl status tenerifeprop
|
||
|
||
# Логи реального времени
|
||
journalctl -u tenerifeprop -f
|
||
|
||
# Проверка порта
|
||
ss -tlnp | grep 3003
|
||
lsof -i :3003
|
||
|
||
# Проверка процесса Bun
|
||
ps aux | grep bun
|
||
|
||
# Проверка API
|
||
curl -s http://localhost:3003/api/settings | python -m json.tool
|
||
|
||
# Проверка SSL
|
||
openssl s_client -connect tenerifeprop.es:443 -servername tenerifeprop.es
|
||
|
||
# Ресурсы сервера
|
||
htop
|
||
df -h
|
||
free -h
|
||
```
|
||
|
||
## 9. Контакты и доступы
|
||
|
||
| Параметр | Значение |
|
||
|----------|----------|
|
||
| Сервер | `46.175.149.131` |
|
||
| SSH логин | `root` |
|
||
| Панель | BrainyCP (пользователь `nero`) |
|
||
| Домен | `tenerifeprop.es` |
|
||
| Backend порт | `3003` |
|
||
| Bun путь | `/home/nero/.bun/bin/bun` |
|
||
| Папка сайта | `/home/nero/sites/tenerifeprop.es` |
|
||
| Логи | `journalctl -u tenerifeprop` |
|
||
| База данных | `data/tenerifeprop.db` (SQLite) |
|
||
| GitHub/Gitea | `https://git.softuniq.eu/UniqueSoft/TenerifeProp` |
|