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- Frontend: http://typo3-v14.localhost:8088/
- Backend: http://typo3-v14.localhost:8088/typo3/ (credentials from
TYPO3_ADMIN_USERNAMEandTYPO3_ADMIN_PASSWORD)
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 variablesThe 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)
| Volume | Content |
|---|---|
db-data | database |
typo3-config | config/system/settings.php, config/sites/ |
typo3-fileadmin | uploads (public/fileadmin), mounted read-only in nginx |
typo3-temp | public/typo3temp (generated assets), mounted read-only in nginx |
typo3-var | logs, caches, sessions, language packs |
es-data | search 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 --buildOn 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.