Files
tehnobox/DEPLOY.md
ssww23 f2f4e2cdd7
Some checks are pending
Deploy / deploy (push) Waiting to run
2
2026-03-17 02:13:35 +03:00

231 lines
7.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Деплой Tehnobox
В репозитории подготовлены production-артефакты:
- `scripts/deploy.sh` - полный деплой в текущем checkout.
- `scripts/update-from-github.sh` - `git pull` + production-деплой.
- `deploy/nginx/tehnobox.http.conf` - HTTP-конфиг для первого запуска и выпуска сертификата.
- `deploy/nginx/tehnobox.conf` - финальный HTTPS-конфиг для Nginx.
- `.github/workflows/deploy.yml` - автодеплой по SSH из GitHub Actions.
## 1. Что должно быть на сервере
- PHP 8.2+ с расширениями `bcmath`, `ctype`, `curl`, `fileinfo`, `intl`, `mbstring`, `openssl`, `pdo_pgsql`, `tokenizer`, `xml`, `zip`
- Composer 2.x
- Node.js 20+ и npm
- PostgreSQL 14+
- Nginx + PHP-FPM
- Certbot
- Git
Если деплой будет обновляться из GitHub, проект на сервере должен быть именно `git clone`, а не архивом без `.git`.
## 2. Первый запуск на сервере
```bash
cd /var/www
git clone git@github.com:YOUR_ACCOUNT/tehnobox.git
cd tehnobox
cp .env.example .env
# заполните .env и переключите его на production значения
php artisan key:generate --force
bash scripts/deploy.sh
```
Production-порт для сайта здесь не `3000`: проект рассчитан на `Nginx + PHP-FPM`, то есть внешний трафик идёт через `80/443`. Если `Gitea` уже работает на `3000`, это не конфликтует с сайтом.
Опционально добавить демо-данные:
```bash
php artisan db:seed --class=ShopCatalogSeeder
```
## 3. Production `.env`
Базой остаётся обычный `.env.example`, отдельный production-файл не нужен. После копирования в `.env` минимально проверьте:
```dotenv
APP_ENV=production
APP_DEBUG=false
APP_URL=https://tehnobox.shop
DB_CONNECTION=pgsql
DB_HOST=127.0.0.1
DB_PORT=5432
DB_DATABASE=tehnobox
DB_USERNAME=tehnobox
DB_PASSWORD=secret
SESSION_DRIVER=database
CACHE_STORE=database
QUEUE_CONNECTION=database
MAIL_MAILER=smtp
MAIL_HOST=127.0.0.1
MAIL_PORT=587
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_FROM_ADDRESS="sales@example.com"
SHOP_CONTACT_PHONE="+7 900 000 00 00"
SHOP_CONTACT_EMAIL="support@example.com"
SHOP_TELEGRAM_BOT_TOKEN=
SHOP_TELEGRAM_CHAT_ID=
```
Отдельный queue worker и cron сейчас не обязательны: в коде нет фоновых jobs или scheduler-задач. Если они появятся позже, для воркера уже подготовлен безопасный `php artisan queue:restart` в deploy-скрипте.
## 4. Что делает `scripts/deploy.sh`
Скрипт:
1. Переводит приложение в maintenance mode.
2. Выполняет `composer install --no-dev`.
3. Выполняет `npm ci` и `npm run build`.
4. Проверяет `storage:link`.
5. Выполняет `composer run deploy`.
6. Делает `php artisan queue:restart`, если воркеры запущены.
7. Возвращает приложение в online.
Запуск:
```bash
bash scripts/deploy.sh
```
## 5. Обновление с GitHub на сервере
После обычного `git clone` обновление становится одной командой:
```bash
bash scripts/update-from-github.sh main
```
Скрипт:
- останавливается, если есть локальные изменения в tracked-файлах;
- делает `git fetch --prune`;
- переключается на нужную ветку;
- выполняет `git pull --ff-only`;
- запускает production-деплой.
По умолчанию ветка `main`, но можно передать другую:
```bash
bash scripts/update-from-github.sh release
```
## 6. Nginx
В репозитории два шаблона:
- `deploy/nginx/tehnobox.http.conf` - стартовый HTTP-конфиг для первого запуска и `/.well-known/acme-challenge/`
- `deploy/nginx/tehnobox.conf` - основной HTTPS-конфиг с редиректом `80 -> 443`
До выпуска сертификата включите именно HTTP-шаблон:
```bash
sudo cp deploy/nginx/tehnobox.http.conf /etc/nginx/sites-available/tehnobox.conf
sudo ln -s /etc/nginx/sites-available/tehnobox.conf /etc/nginx/sites-enabled/tehnobox.conf
sudo nginx -t
sudo systemctl reload nginx
```
Что нужно проверить в шаблонах:
- `server_name`
- `root`
- путь в `fastcgi_pass` под ваш PHP-FPM socket
Корень сайта должен смотреть в `public/`, не в корень проекта.
## 7. HTTPS и сертификат
1. Убедитесь, что домен уже указывает на сервер и порт `80` открыт.
2. В `.env` укажите `APP_URL=https://tehnobox.shop`.
3. Выпустите сертификат через `certbot`:
```bash
sudo certbot certonly --webroot -w /var/www/tehnobox/public -d tehnobox.shop -d www.tehnobox.shop
```
4. После успешного выпуска переключите nginx на HTTPS-шаблон:
```bash
sudo cp deploy/nginx/tehnobox.conf /etc/nginx/sites-available/tehnobox.conf
sudo nginx -t
sudo systemctl reload nginx
```
5. Обновите Laravel-кеши после смены `APP_URL`:
```bash
composer run deploy
```
Что нужно проверить в `deploy/nginx/tehnobox.conf`:
- `server_name`
- `fastcgi_pass`
- путь в `ssl_certificate`
- путь в `ssl_certificate_key`
После этого сайт должен открываться по `https://`, а `http://` будет перекидываться на защищённую версию.
Если вы предпочитаете, чтобы `certbot` сам правил nginx, можно вместо `certonly --webroot` использовать:
```bash
sudo certbot --nginx -d tehnobox.shop -d www.tehnobox.shop
```
Но для предсказуемого деплоя удобнее оставить конфиг под контролем репозитория и использовать `certonly`.
## 8. Автообновление из GitHub Actions
В репозитории добавлен workflow `.github/workflows/deploy.yml`.
Он:
- запускается на push в `main`;
- умеет ручной `workflow_dispatch`;
- подключается по SSH на сервер;
- вызывает `bash scripts/update-from-github.sh <branch>`.
Нужные GitHub Secrets:
- `DEPLOY_HOST`
- `DEPLOY_PORT`
- `DEPLOY_USER`
- `DEPLOY_PATH`
- `DEPLOY_SSH_KEY`
- `DEPLOY_KNOWN_HOSTS`
`DEPLOY_PATH` должен указывать на директорию проекта на сервере, например `/var/www/tehnobox`.
`DEPLOY_KNOWN_HOSTS` можно получить так:
```bash
ssh-keyscan -H your-server-hostname
```
## 9. Проверка после деплоя
```bash
php artisan about
php artisan migrate:status
php artisan route:list
```
Проверьте страницы:
- `https://tehnobox.shop`
- `/`
- `/catalog`
- `/cart`
- `/favorites`
- `/compare`
- `/login`
- `/admin/login`