Развертывание системы TYPO3

В данном руководстве описаны шаги, необходимые для ручного развертывания TYPO3, обеспечения безопасности установки и ее готовности к использованию в производственных условиях. Также описывается ряд средств автоматизации, позволяющих упростить процесс развертывания.

Существует несколько различных способов развертывания TYPO3. Один из наиболее простых вариантов - вручную скопировать файлы и базу данных с локальной машины на живой сервер, при необходимости скорректировав конфигурацию.

Общие этапы развертывания

  • Построение локального окружения (установка всего необходимого для работы сайта).
  • Выполните команду composer install --no-dev для установки без зависимостей от разработки.
  • Копирование файлов на рабочий сервер.
  • Копирование базы данных на рабочий сервер.
  • Очистка кэшей.

Производственные настройки

Для обеспечения безопасной установки TYPO3 на рабочем сервере необходимо задать следующие параметры:

  • Admin Tools > Settings > Configuration Presets Для того чтобы не выводить данные отладки на экран, необходимо выбрать предустановку "Live".
  • На рабочих серверах следует использовать HTTPS, а для $GLOBALS['TYPO3_CONF_VARS']['BE']['lockSSL'] должно быть установлено значение true.
  • Обеспечьте применение HSTS (Strict-Transport-Security header) в конфигурации веб-серверов.
  • Переменная среды TYPO3_CONTEXT должна быть установлена на основной контекст Production (можно проверить справа вверху во внутреннем интерфейсе TYPO3 Application Information). Она должна использоваться для выбора соответствующего базового варианта для целевой системы в Конфигурации сайта.
  • Настройте TYPO3 logging framework на регистрацию сообщений высокой степени серьезности, включая и выше WARNING или ERROR, и продолжайте ротацию файлов журнала, хранящихся в var/log.
  • Убедитесь в том, что разрешения на файлы правильно установлены на живой системе.

Автоматизация процесса развертывания

Типичная установка для развертывания веб-приложений состоит из трех различных частей:

  • Локальная среда (для разработки).
  • Среда сборки (для воспроизводимых сборок). Это может быть контролируемая локальная среда или удаленный сервер непрерывной интеграции (например, Gitlab CI или Github Actions).
  • Живое (производственное) окружение.

Чтобы перевести приложение из локальной среды в производственную систему, рекомендуется использовать инструмент развертывания и/или решение непрерывной интеграции. Это гарантирует развертывание лишь кода с контролем версий и воспроизводимость сборок. В идеале развертывание нового релиза должно быть атомарной операцией и не приводить к простою. При возникновении ошибок на любом из этапов развертывания или тестирования большинство средств развертывания инициирует автоматический "откат", предотвращающий выпуск ошибочной сборки.

Одной из широко используемых стратегий является подход "переключение симлинков":

При такой стратегии веб-сервер обслуживает файлы с виртуального пути releases/current/public, который состоит из симлинка releases/current, указывающего на последнюю версию развертывания ("релиз"). Этот симлинк переключается после успешной подготовки нового релиза. В последней версии представлены симлинки на папки, которые должны быть общими для всех релизов (обычно их называют "общие папки" - shared folders).

Обычно база данных разделяется между релизами, а мастера обновления и обновления схем запускаются автоматически до или вскоре после запуска нового релиза.

Это примерная структура каталогов установки TYPO3 с "переключением симлинков":

├── shared/
│    ├── fileadmin/
│    └── var/
│        ├── var/charset/
│        ├── var/lock/
│        ├── var/log/
│        └── var/session/
├── releases/
│    ├── current -> ./release1 (symlink to current release)
│    └── release1/
│        ├── public/ (webserver root, via releases/current/public)
│        │   ├── typo3conf/
│        │   ├── fileadmin -> ../../../shared/fileadmin/ (symlink)
│        │   └── index.php
│        ├── var/
│        |   ├── var/build/
│        |   ├── var/cache/
│        |   ├── var/charset -> ../../../shared/var/charset/ (symlink)
│        |   ├── var/labels/
│        |   ├── var/lock -> ../../../shared/var/lock/ (symlink)
│        |   ├── var/log -> ../../../shared/var/log/ (symlink)
│        |   └── var/session -> ../../../shared/var/session/ (symlink)
│        ├── vendor/
│        ├── composer.json
│        └── composer.lock
Copied!

Файлы в директории shared являются общими для разных версий сайта. В каталоге releases представлена информация о коде TYPO3, который будет меняться от версии к версии.

При использовании средств развертывания такая структура каталогов обычно создается автоматически.

В следующем разделе представлены примеры различных средств развертывания и способы их настройки для использования TYPO3:

TYPO3 Surf это средство развертывания, написанное на языке PHP.

 /.surf/MyDeployment.php
<?php
/** @var \TYPO3\Surf\Domain\Model\Deployment $deployment */

$node = new \TYPO3\Surf\Domain\Model\Node('my.node.com');
$node
    ->setHostname($node->getName())
    ->setOption('username', 'myuser')
    ->setOption('phpBinaryPathAndFilename', '/usr/local/bin/php_cli');

$application = new \TYPO3\Surf\Application\TYPO3\CMS();
$application
    ->setDeploymentPath('/httpdocs')
    ->setOption('baseUrl', 'https://my.node.com/')
    ->setOption('webDirectory', 'public')
    ->setOption('symlinkDataFolders', ['fileadmin'])
    ->setOption('repositoryUrl', 'file://' . dirname(__DIR__))
    ->setOption('keepReleases', 3)
    ->setOption('composerCommandPath', 'composer')
    ->setOption('rsyncExcludes', [
        '.ddev',
        '.git',
        $application->getOption('webDirectory') . '/fileadmin',
        'packages/**.sass'
    ])
    ->setOption(TYPO3\Surf\Task\TYPO3\CMS\FlushCachesTask::class . '[arguments]', [])
    ->addSymlink($application->getOption('webDirectory') . '/config/system/settings.php', '../../../../shared/Configuration/settings.php')
    ->addNode($node);

    $deployment
        ->addApplication($application)
        ->onInitialize(
            function () use ($deployment, $application) {
                $deployment->getWorkflow()
                    ->beforeTask(\TYPO3\Surf\Task\TYPO3\CMS\SetUpExtensionsTask::class, \TYPO3\Surf\Task\TYPO3\CMS\CompareDatabaseTask::class, $application)
                    ->beforeStage('transfer', \TYPO3\Surf\Task\Php\WebOpcacheResetCreateScriptTask::class, $application)
                    ->afterStage('switch', \TYPO3\Surf\Task\Php\WebOpcacheResetExecuteTask::class, $application)
                    // CreatePackageStatesTask is done by post-autoload-dump script and can be removed
                    // https://github.com/TYPO3/TYPO3.CMS.BaseDistribution/blob/9.x/composer.json#L38
                    ->removeTask(\TYPO3\Surf\Task\TYPO3\CMS\CreatePackageStatesTask::class, $application)
                    ->removeTask(\TYPO3\Surf\Task\TYPO3\CMS\CopyConfigurationTask::class, $application);
            }
        );
Copied!

Deployer представляет собой альтернативное средство развертывания написанное на языке PHP. Полное описание того, как запустить deployer для TYPO3 можно найти на сайте https://t3terminal.com/blog/typo3-deploy/

<?php

namespace Deployer;

require_once(__DIR__ . '/vendor/sourcebroker/deployer-loader/autoload.php');
new \SourceBroker\DeployerExtendedTypo3\Loader();

set('repository', 'git@github.com:youraccount/yourproject.git');
set('bin/php', '/home/www/example-project-directory/.bin/php');
set('web_path', 'public/');

host('live')
    ->hostname('production.example.org')
    ->user('deploy')
    ->set('branch', 'main')
    ->set('public_urls', ['https://production.example.org'])
    ->set('deploy_path', '/home/www/example-project-directory/live');
Copied!

Еще одно средство развертывания PHP-приложений, написанных на PHP: https://www.magephp.com

.mage.yml
magephp:
  log_dir: ./.mage/logs
  composer:
    path: composer
  exclude:
    - ./.ddev
    - ./.git
    - ./.mage
    - ./public/fileadmin
    - ./public/typo3temp
    - ./var
    - ./.mage.yml
    - ./composer.json
    - ./composer.lock
    - ./LICENSE
    - ./README.md
  environments:
    main:
      user: ssh-user
      from: ./
      host_path: /srv/vhosts/target-path/site/mage
      releases: 3
      hosts:
        - production.example.org
      pre-deploy:
        - exec: { cmd: "composer install --no-dev --no-progress --optimize-autoloader"}
      on-deploy:
        - fs/link: { from: "../../../../shared/public/fileadmin", to: "public/fileadmin" }
        - fs/link: { from: "../../../../shared/public/typo3temp", to: "public/typo3temp" }
        - fs/link: { from: "../../../shared/var", to: "var" }
      on-release:
      post-release:
        - exec: { cmd: './bin/typo3 backend:lock', timeout: 9000  }
        - exec: { cmd: './bin/typo3cms database:updateschema *.add,*.change', timeout: 9000  }
        - exec: { cmd: './bin/typo3cms cache:flush', timeout: 9000  }
        - exec: { cmd: './bin/typo3 upgrade:run', timeout: 9000  }
        - exec: { cmd: './bin/typo3 backend:unlock', timeout: 9000  }
      post-deploy:
Copied!