Initial commit
Some checks failed
Deploy / deploy (push) Has been cancelled

This commit is contained in:
ssww23
2026-03-10 00:55:37 +03:00
parent fc0f28d830
commit 93a655235a
155 changed files with 24768 additions and 0 deletions

228
DEPLOY.md Normal file
View 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`