docs
TYPO3 v14
Getting started  /  Installation without DDEV

03b — Installation without DDEV

For a server, a hosting account, or any local stack that is not DDEV. The same package, the same two extensions — but init-yavi.sh is not part of this path. That script drives DDEV from beginning to end; without DDEV it has nothing to talk to.

What follows is the same sequence by hand. It is longer than one command, but every step is one line, and you see what each of them does.

If DDEV is an option, take 03 — Installation with DDEV instead. This chapter exists because the ZIP is a TYPO3 project, and a TYPO3 project does not need containers to run.


What you need

PHP8.2 or newer, CLI and web, with pdo_mysql, gd, intl, zip
Image processingthe ImageMagick or GraphicsMagick command line tools — see below
memory_limit512 MB for the command line. The default 128 MB is not enough — see below
Composer2.x
DatabaseMySQL 8 or MariaDB 10.6+, an empty database and a user who may create tables
Web serverdocument root on public/, PHP handled through FPM or mod_php
i
The command line limit matters more than you would expect. With 128 MB, typo3 cache:flush dies with "Allowed memory size of 134217728 bytes exhausted" inside TcaSchemaFactory — TYPO3 v14 builds the whole schema in memory. DDEV sets memory_limit = -1 and hides this. Either raise it in php.ini or prefix every command with php -d memory_limit=512M.

1. Unpack

bash
unzip yavi-lucerne.zip
cd yavi-lucerne

The .ddev/ folder and init-yavi.sh are unused here. Leaving them in place is harmless; deleting them is fine too.

2. Adjust the environment file

.env ships with DDEV's container values — host db, port 3306, database db. On any other machine they point nowhere. Put your own in:

bash
TYPO3_CONTEXT='Production'
TYPO3_DB_HOST='127.0.0.1'
TYPO3_DB_PORT='3306'
TYPO3_DB_DATABASE='your_database'
TYPO3_DB_USERNAME='your_user'
TYPO3_DB_PASSWORD='your_password'
IMAGEMAGICK_PATH='/usr/bin/'

IMAGEMAGICK_PATH is the directory holding the binary, not the binary itself: /usr/bin/ for ImageMagick 6 (convert), /opt/homebrew/bin/ for a Homebrew install of ImageMagick 7 (magick) or GraphicsMagick (gm). dirname $(which convert magick gm 2>/dev/null | head -1) finds it.

This is about the command line tools, not the PHP extension. TYPO3 scales and crops images by calling those binaries; the gd extension does not replace them.

!
If there is none on the machine, note that TYPO3 does not notice. Its default is ImageMagick in /usr/bin/, so it keeps calling a binary that is not there — the site renders, but nothing is ever scaled or cropped, and fileadmin/_processed_/ stays empty. Either install ImageMagick or GraphicsMagick, or turn processing off deliberately in config/system/settings.php: ``php 'GFX' => [ 'processor_enabled' => false, ], `` Images are then delivered at their original size. Fine for a first look, not for a live site — the theme's image variants depend on processing.

3. Install the dependencies

bash
composer install

This resolves TYPO3 v14 and Bootstrap Package from packagist and links packages/yavi-core and packages/yavi-lucerne in through the path repository declared in composer.json. Nothing needs registering; the extensions come out of the ZIP.

4. Install TYPO3

bash
php -d memory_limit=512M vendor/bin/typo3 setup \
    --no-interaction \
    --driver=mysqli \
    --server-type=other \
    --host=127.0.0.1 --port=3306 \
    --dbname=your_database --username=your_user --password=your_password \
    --admin-username=admin --admin-user-password='choose-a-strong-one' \
    --admin-email=you@example.com \
    --project-name="Your Project"

--server-type decides whether TYPO3 writes an .htaccess: apache for Apache, iis, or other for nginx and everything else. It looks optional — the option carries other as its declared default — but that default only applies in interactive mode. Together with --no-interaction it has to be given, otherwise the command aborts with "Argument #1 ($serverType) must be of type ?string, false given".

Leave out --no-interaction and the command asks for each value instead, --server-type included.

5. Decide on the demo content

Two paths from here. Both end with a working site.

5a. With the demo content

bash
gunzip -c .tarballs/yavi-demo.sql.gz | mysql -h 127.0.0.1 -u your_user -p your_database

Or import the same file through phpMyAdmin or whatever your hoster provides.

!
The dump contains DROP TABLE IF EXISTS for every table, including the be_users table that step 4 just created. That is intended — the dump ships without any accounts, and you create yours in step 8. It also means the import replaces the whole database: never point it at an installation that holds content you want to keep.

Then copy the media, because the dump's file records expect them below fileadmin/:

bash
cp -R packages/yavi-lucerne/Initialisation/Files/. public/fileadmin/

5b. Without the demo content

Skip the import. After step 6 you run one helper that creates a root page and brings in the theme's base structure — topbar, footer, and the pages the footer menu links to. Details in Installing without the demo; it is the same structure the DDEV installer sets up.

6. Activate the extensions

bash
php -d memory_limit=512M vendor/bin/typo3 extension:setup

7. Set up the site configuration

bash
mkdir -p config/sites/<id>
cp -R packages/yavi-lucerne/Initialisation/Site/yavilucerne/. config/sites/<id>/

<id> is a name you choose — it is only the folder name and appears nowhere on the site. The folder holds three files and the theme needs all three: config.yaml for base, languages and the Sets, page.tsconfig for the backend layouts, the RTE preset and the content element definitions, and settings.yaml for the theme's settings and the licence key. TYPO3 reads the latter two out of the site folder on its own.

Then open config/sites/<id>/config.yaml and replace the DDEV parts. The shipped template carries a baseVariants block and %env(DDEV_BASE)% placeholders that stay empty without DDEV:

yaml
base: 'https://example.com/'
# delete the whole baseVariants block
languages:
  -
    base: 'https://example.com/'      # was %env(DDEV_BASE)%
  -
    base: 'https://example.com/de/'   # was %env(DDEV_BASE_DE)%

Without the demo, run the helper now — it needs the site configuration to exist, because it writes into it:

bash
php -d memory_limit=512M init-static-elements.php <id>
php -d memory_limit=512M vendor/bin/typo3 cache:flush

It prints the uids it assigned. The cache flush is not optional: the helper writes settings after TypoScript has already been built, and the topbar and footer stay empty until the next flush.

8. Create your backend user

Do not skip this after importing the demo. Step 4 created an account, but the dump in 5a contains DROP TABLE IF EXISTS be_users and ships without any accounts of its own — so that account is gone, and there is nobody left to log in with. The login form appears as usual and simply rejects every attempt, which sends people looking in the wrong place.

bash
php -d memory_limit=512M vendor/bin/typo3 backend:user:create

9. Point the web server at public/

Document root is public/, not the project folder. The project's own .htaccess is already in place for Apache; for nginx use the configuration from TYPO3's own documentation.

Writable by the web server user:

text
config/sites/<id>/settings.yaml     the backend module saves here
var/                                 caches, logs, sessions
public/typo3temp/                    compiled CSS
public/fileadmin/                    only for self-hosted Google fonts

A quick look with PHP's built-in server

Good enough to see whether the frontend renders. Not good enough for the backend — see below.

bash
php -d memory_limit=512M -S localhost:8099 -t public public/index.php

Given a router script that server stops handing out static files, so images return 404. Either drop the router argument, or use one that passes existing files through:

php
<?php // public/_router.php
$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
if ($path !== '/' && is_file(__DIR__ . urldecode($path))) { return false; }
require __DIR__ . '/index.php';

The backend does not work reliably on it: you log in, the module menu appears on the left, and the area next to it stays empty. Nothing in the browser console explains it — every stylesheet and script answers 200. PHP_CLI_SERVER_WORKERS looks like the fix and is not one; on macOS it fills the log with Failed to poll event and makes matters worse.

Use a real web server for the backend. Which one hardly matters — Apache with mod_proxy_fcgi, nginx with a PHP-FPM pool, Caddy, Valet, Herd, MAMP. TYPO3's own documentation carries current configurations for Apache and nginx.

!
On macOS, be careful where the project lives. The system blocks /usr/sbin/httpd from reading anything under /Volumes/, so a project on an external or network volume answers with 403 and file permissions deny server access in the error log — even though the files belong to you and are perfectly readable. PHP-FPM installed through Homebrew is not restricted this way, which makes the symptom confusing: pages render, but every image and stylesheet under fileadmin/ is refused. Keep the project below your home directory, or grant the web server Full Disk Access.

10. Check

bash
php -d memory_limit=512M vendor/bin/typo3 extension:list | grep yavi

yavi_core and yavi_lucerne, both active. Then open the site. With the demo you land on the finished standard site; without it, on a page with the theme's frame around it.

Continue with 05 — Setting up the first site for the licence key and the first content.


What differs from the DDEV path

DDEVhere
Database connectionwritten by DDEV into config/system/additional.phpyours, in .env
memory_limitunlimitedyours, at least 512 MB for the CLI
trustedHostsPatternset to .* by DDEVTYPO3's default, which matches SERVER_NAME
Base URLs%env(DDEV_BASE)%your own domain, baseVariants removed
Demo importddev import-dbyour database tool
Backend userrecreated by the installerbackend:user:create

The trustedHostsPattern row is worth a look if the site answers "The current host header value does not match the configured trusted hosts pattern". TYPO3 compares the Host header against the web server's SERVER_NAME; where the two differ — a proxy, a container, a hostname alias — set the pattern explicitly in config/system/settings.php.