229 lines
7.0 KiB
Markdown
229 lines
7.0 KiB
Markdown
# Деплой 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`
|