Laravel на виртуальном хостинге (shared hosting) TimeWeb

{% import 'macros/index.njk' as macro with context %}

{{ macro.task ('поднять Laravel на хостинге TimeWeb и вкрутить CI/CD через GitHub Actions.') }}

Так случилось, что хостинг клиента — виртуальный (shared) на TimeWeb. Тариф ничем не выделяется.

Внутри есть SSH, БД, вообще всё, что нужно и задача в целом, реальная и решаемая.

В терминале версия PHP5.6:

client@vh2**:~/site.tld$ php -v
PHP 5.6.37 (cli) (built: Jul 24 2018 00:54:11)

А нужна минимум PHP7.3. В настройках каждого сайта в личном кабинете хостера можно указать требуемую версию PHP, но вот терминалу на это плевать.

Установка Composer и Laravel

В терминале можно указать путь к исполняемому пакету с нужной версией PHP. Laravel ставится через Composer, его надо скачать и положить рядом.

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
...
php -r "unlink('composer-setup.php');"

В корне появился composer.phar. Ставим Laravel, выбирая нужную версию PHP:

/opt/php73/bin/php composer.phar create-project laravel/laravel

Устанавливается без каких-либо проблем. Важно знать, что к artisan обращаться надо также:

/opt/php73/bin/php artisan optimize

У проектов в таймвебе паблик-директория — ./public_html. А Laravel торчит наружу из ./public в корне файловой структуры. Чтобы это просто завести на таймвебе — можно обойтись симлинком:

ln -s ~/site.tld/public ~/site.tld/public_html

GitHub Actions

В Marketplace GitHub Actions есть уже куча пакетов для Laravel. Моя задача была простой и я обошёлся rsync-deployments:

# .github/workflows/timeweb-deploy.yml

name: Deployment site.tld

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest
    if: "!contains(github.event.head_commit.message, 'skip ci')"

    steps:
      - name: Загрузка актуальной кодовой базы
        uses: actions/checkout@v2
      - uses: actions/setup-node@v2
        with:
          node-version: "14"
      - name: Создаёт .env-файл
        run: echo "${{ secrets.ENV_PRODUCTION }}" > ".env"
      # Install Сomposer
      - name: Установка Сomposer-зависимостей
        run: composer install --optimize-autoloader --no-dev
      # Artisan cli commands
      - name: Трудится, artisan
        run: |
          php artisan clear-compiled
          php artisan optimize
          php artisan migrate
      # Install NPM
      - name: Установка NPM-зависимостей и сборка статики
        run: |
          npm ci
          npm run prod
      # Deploy
      - name: Публикация проекта site.tld
        uses: burnett01/rsync-deployments@4.1
        with:
          switches: -az --delete --exclude-from="rsync-excludes.txt"
          path: .
          remote_path: ${{ secrets.SERVER_PATH }}
          remote_host: ${{ secrets.SERVER_IP }}
          remote_user: ${{ secrets.SERVER_USER }}
          remote_key: ${{ secrets.SSH_KEY_PRIVATE }}

Все параметры, как и .env-конфиг для production-окружения, будут взяты из Actions secrets.

Ссылки на справочный центр таймвеба