# Деплой 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 `. Нужные 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`