# Руководство по деплою 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` |