Files
tehnobox/DEPLOY.md
ssww23 93a655235a
Some checks failed
Deploy / deploy (push) Has been cancelled
Initial commit
2026-03-10 00:55:37 +03:00

7.0 KiB
Raw Blame History

Деплой 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. Первый запуск на сервере

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

Опционально добавить демо-данные:

php artisan db:seed --class=ShopCatalogSeeder

3. Production .env

Базой остаётся обычный .env.example, отдельный production-файл не нужен. После копирования в .env минимально проверьте:

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 scripts/deploy.sh

5. Обновление с GitHub на сервере

После обычного git clone обновление становится одной командой:

bash scripts/update-from-github.sh main

Скрипт:

  • останавливается, если есть локальные изменения в tracked-файлах;
  • делает git fetch --prune;
  • переключается на нужную ветку;
  • выполняет git pull --ff-only;
  • запускает production-деплой.

По умолчанию ветка main, но можно передать другую:

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-шаблон:

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:
sudo certbot certonly --webroot -w /var/www/pc-shop/public -d shop.example.com -d www.shop.example.com
  1. После успешного выпуска переключите nginx на HTTPS-шаблон:
sudo cp deploy/nginx/pc-shop.conf /etc/nginx/sites-available/pc-shop.conf
sudo nginx -t
sudo systemctl reload nginx
  1. Обновите Laravel-кеши после смены APP_URL:
composer run deploy

Что нужно проверить в deploy/nginx/pc-shop.conf:

  • server_name
  • fastcgi_pass
  • путь в ssl_certificate
  • путь в ssl_certificate_key

После этого сайт должен открываться по https://, а http:// будет перекидываться на защищённую версию.

Если вы предпочитаете, чтобы certbot сам правил nginx, можно вместо certonly --webroot использовать:

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 можно получить так:

ssh-keyscan -H your-server-hostname

9. Проверка после деплоя

php artisan about
php artisan migrate:status
php artisan route:list

Проверьте страницы:

  • https://shop.example.com
  • /
  • /catalog
  • /cart
  • /favorites
  • /compare
  • /login
  • /admin/login