Manual

Quick start and structure

Starting the appliance, project structure, persistent data and installing extensions.

Quick start

cp .env.example .env      # change the passwords!
docker compose up -d --build

All common browsers resolve *.localhost to 127.0.0.1 automatically. If a tool cannot resolve the name, add 127.0.0.1 typo3-v14.localhost to /etc/hosts.

The admin is a system maintainer and therefore also has access to the admin tools (Install Tool).

Project structure

├── Dockerfile                  stage app (PHP-FPM + TYPO3), stage web (nginx)
├── docker-compose.yml          web, php, db, elasticsearch, scheduler
├── docker-compose.override.yml local tweak: id.dev.sonia.de → Docker host
├── composer.json               TYPO3 packages – add extensions here
├── BACKUP.sh / RESTORE.sh      backup as .tar.gz / restore
├── CREATE_SHELL_ARCHIVE_BACKUP.sh  backup as self-extracting .sh
├── packages/
│   ├── oidc_backend/           Keycloak roles → backend groups/admin, user name
│   └── site_package/           frontend: templates, language switch, search, content
└── config/
    ├── certs/                  additional CA certificates (*.crt), e.g. Ostfalia RZ Root CA
    ├── nginx/default.conf      TYPO3 server block (document root public/, deny rules, caching)
    ├── php/typo3.ini           PHP/OPcache settings
    ├── php/fpm-pool.conf       FPM pool (clear_env = no, ping endpoint)
    ├── mariadb/typo3.cnf       utf8mb4 + InnoDB tuning
    └── typo3/
        ├── entrypoint.sh       wait for DB, first installation, extension:setup
        ├── healthcheck.sh      health check of the php container
        └── additional.php      configuration from environment variables

The config/ folder holds the project’s configuration files. Do not confuse it with TYPO3’s folder of the same name inside the container.

Persistent data (Docker volumes)

VolumeContent
db-datadatabase
typo3-configconfig/system/settings.php, config/sites/
typo3-fileadminuploads (public/fileadmin), mounted read-only in nginx
typo3-temppublic/typo3temp (generated assets), mounted read-only in nginx
typo3-varlogs, caches, sessions, language packs
es-datasearch index; rebuilt from the database and therefore not part of the backup

The code (vendor/, public/_assets) is part of both images (php and nginx). Updates and new extensions therefore always reach the containers through a rebuild.

Installing extensions and updating TYPO3

# add an extension (local PHP+Composer or inside the container)
docker compose run --rm --no-deps --entrypoint "" -v "$PWD:/app" -w /app php \
    composer require georgringer/news --no-install

docker compose up -d --build

On every start, typo3 extension:setup (database schema) and cache:flush run automatically. Commit composer.lock to the repository so that every build gets the same package versions.

Own extensions and site packages go into packages/<name>/ and are added with composer require vendor/name:@dev.