This commit is contained in:
228
DEPLOY.md
Normal file
228
DEPLOY.md
Normal file
@@ -0,0 +1,228 @@
|
||||
# Деплой PC Shop
|
||||
|
||||
В репозитории подготовлены production-артефакты:
|
||||
|
||||
- `scripts/deploy.sh` - полный деплой в текущем checkout.
|
||||
- `scripts/update-from-github.sh` - `git pull` + production-деплой.
|
||||
- `deploy/nginx/pc-shop.http.conf` - HTTP-конфиг для первого запуска и выпуска сертификата.
|
||||
- `deploy/nginx/pc-shop.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/pc-shop.git
|
||||
cd pc-shop
|
||||
|
||||
cp .env.example .env
|
||||
# заполните .env и переключите его на production значения
|
||||
|
||||
php artisan key:generate --force
|
||||
bash scripts/deploy.sh
|
||||
```
|
||||
|
||||
Опционально добавить демо-данные:
|
||||
|
||||
```bash
|
||||
php artisan db:seed --class=ShopCatalogSeeder
|
||||
```
|
||||
|
||||
## 3. Production `.env`
|
||||
|
||||
Базой остаётся обычный `.env.example`, отдельный production-файл не нужен. После копирования в `.env` минимально проверьте:
|
||||
|
||||
```dotenv
|
||||
APP_ENV=production
|
||||
APP_DEBUG=false
|
||||
APP_URL=https://shop.example.com
|
||||
|
||||
DB_CONNECTION=pgsql
|
||||
DB_HOST=127.0.0.1
|
||||
DB_PORT=5432
|
||||
DB_DATABASE=pc-shop
|
||||
DB_USERNAME=pc_shop
|
||||
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/pc-shop.http.conf` - стартовый HTTP-конфиг для первого запуска и `/.well-known/acme-challenge/`
|
||||
- `deploy/nginx/pc-shop.conf` - основной HTTPS-конфиг с редиректом `80 -> 443`
|
||||
|
||||
До выпуска сертификата включите именно HTTP-шаблон:
|
||||
|
||||
```bash
|
||||
sudo cp deploy/nginx/pc-shop.http.conf /etc/nginx/sites-available/pc-shop.conf
|
||||
sudo ln -s /etc/nginx/sites-available/pc-shop.conf /etc/nginx/sites-enabled/pc-shop.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://shop.example.com`.
|
||||
3. Выпустите сертификат через `certbot`:
|
||||
|
||||
```bash
|
||||
sudo certbot certonly --webroot -w /var/www/pc-shop/public -d shop.example.com -d www.shop.example.com
|
||||
```
|
||||
|
||||
4. После успешного выпуска переключите nginx на HTTPS-шаблон:
|
||||
|
||||
```bash
|
||||
sudo cp deploy/nginx/pc-shop.conf /etc/nginx/sites-available/pc-shop.conf
|
||||
sudo nginx -t
|
||||
sudo systemctl reload nginx
|
||||
```
|
||||
|
||||
5. Обновите Laravel-кеши после смены `APP_URL`:
|
||||
|
||||
```bash
|
||||
composer run deploy
|
||||
```
|
||||
|
||||
Что нужно проверить в `deploy/nginx/pc-shop.conf`:
|
||||
|
||||
- `server_name`
|
||||
- `fastcgi_pass`
|
||||
- путь в `ssl_certificate`
|
||||
- путь в `ssl_certificate_key`
|
||||
|
||||
После этого сайт должен открываться по `https://`, а `http://` будет перекидываться на защищённую версию.
|
||||
|
||||
Если вы предпочитаете, чтобы `certbot` сам правил nginx, можно вместо `certonly --webroot` использовать:
|
||||
|
||||
```bash
|
||||
sudo certbot --nginx -d shop.example.com -d www.shop.example.com
|
||||
```
|
||||
|
||||
Но для предсказуемого деплоя удобнее оставить конфиг под контролем репозитория и использовать `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/pc-shop`.
|
||||
|
||||
`DEPLOY_KNOWN_HOSTS` можно получить так:
|
||||
|
||||
```bash
|
||||
ssh-keyscan -H your-server-hostname
|
||||
```
|
||||
|
||||
## 9. Проверка после деплоя
|
||||
|
||||
```bash
|
||||
php artisan about
|
||||
php artisan migrate:status
|
||||
php artisan route:list
|
||||
```
|
||||
|
||||
Проверьте страницы:
|
||||
|
||||
- `https://shop.example.com`
|
||||
- `/`
|
||||
- `/catalog`
|
||||
- `/cart`
|
||||
- `/favorites`
|
||||
- `/compare`
|
||||
- `/login`
|
||||
- `/admin/login`
|
||||
Reference in New Issue
Block a user