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

Задача: поднять Laravel на хостинге TimeWeb и вкрутить CI/CD через GitHub Actions.

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

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

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

        
          
          client@vh2**:~/site.tld$ php -vPHP 5.6.37 (cli) (built: Jul 24 2018 00:54:11)
          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');"
          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
          /opt/php73/bin/php composer.phar create-project laravel/laravel

        
        
          
        
      

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

        
          
          /opt/php73/bin/php artisan optimize
          /opt/php73/bin/php artisan optimize

        
        
          
        
      

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

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

        
        
          
        
      

GitHub Actions

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

        
          
          # .github/workflows/timeweb-deploy.ymlname: Deployment site.tldon:  push:    branches:      - mainjobs:  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 }}
          # .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.

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