docs
TYPO3 v14
Getting started  /  Installation in classic mode

04b — Installation in classic mode

Classic mode is TYPO3 without Composer: you download the TYPO3 source as an archive, unpack the extensions into a folder, and switch them on in the backend. No composer.json, no vendor/bin, no dependency resolution — and no command line needed for the parts that matter.

This is the path for hosting that gives you FTP and a database and nothing else. It works with TYPO3 v14, and both the theme and its dependencies are available as plain archives.

i
If the hosting offers SSH and Composer, take 03b — Installation without DDEV instead. Classic mode works, but nothing tells you when a dependency is missing or too old, and every update is a manual file operation.

What you need

PHP8.2 or newer, with pdo_mysql, gd, intl, zip
DatabaseMySQL 8 or MariaDB 10.6+, and a user who may create tables
Web serverApache with .htaccess honoured, or nginx with TYPO3's configuration
Image processingImageMagick or GraphicsMagick command line tools — see 03b
Diskabout 300 MB for TYPO3, the extensions and the demo media

The four archives

Everything is a download. Nothing is resolved for you, so collect these first:

ArchiveWhere fromSize
typo3_src-14.3.5.tar.gzget.typo3.org29 MB
bootstrap_package 16.0.0extensions.typo3.org → Download ZIP2 MB
container 3.2.2extensions.typo3.org → Download ZIP115 KB
yavi-lucerne.ziplicence.yavithemes.com → Konto → Downloads57 MB

Both TER extensions declare support for TYPO3 v14 (bootstrap_package up to 14.4.99, container up to 14.99.99). Take the ZIP, not the T3X: T3X is an old packing format that only the extension manager can unpack.

1. Unpack TYPO3

bash
tar xzf typo3_src-14.3.5.tar.gz
mv typo3_src-14.3.5 my-site
cd my-site
mkdir -p typo3conf/ext fileadmin typo3temp var

The source archive is self-contained — it brings its own vendor/ folder with every PHP library TYPO3 needs. That is the whole point of classic mode.

The document root is the project folder itself. There is no public/. Point the vhost at my-site/, not at a subfolder — this is the single biggest difference to a Composer installation, and it changes every path below.

2. Unpack the extensions

Four folders go into typo3conf/ext/:

text
typo3conf/ext/container/
typo3conf/ext/bootstrap_package/
typo3conf/ext/yavi-core/
typo3conf/ext/yavi-lucerne/

The two Yavi folders come straight out of the portal ZIP, from yavi-lucerne/packages/. Do not rename them. Older documentation says the folder name has to be the extension key with underscores; since TYPO3 v14 (Breaking #108310) the key is read from extra.typo3/cms.extension-key in the extension's composer.json, and both packages carry it. A folder called yavi-core is recognised as the extension yavi_core, and the site renders byte for byte the same as with the underscore spelling.

Unpack each TER ZIP so that ext_emconf.php sits directly in the extension folder — not in a subfolder inside it.

3. Run the installer

Through the browser: open your domain, and TYPO3's setup takes over. It asks for the database connection, creates the tables and sets up an administrator.

On the command line the same thing is one call. Note the path to the binary — in classic mode it is inside typo3/sysext/, not in vendor/bin/:

bash
php -d memory_limit=512M typo3/sysext/core/bin/typo3 setup \
    --no-interaction \
    --driver=mysqli \
    --server-type=apache \
    --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="My Site"

--server-type=apache makes the installer write a 14 KB .htaccess into the project root. You want it: it carries the rewrite rules, the cache headers and the deny rules that keep typo3conf/ out of reach. Use other for nginx and take the server configuration from TYPO3's own documentation.

The result is typo3conf/system/settings.php — the classic-mode equivalent of config/system/settings.php.

i
memory_limit matters on the command line. With the usual 128 MB, cache:flush dies inside TcaSchemaFactory while building the schema. Raise it in php.ini or prefix each command as shown.

4. Switch the extensions on

Open the backend at /typo3/, log in, and go to Admin Tools → Extensions. Activate in this order, because each depends on the one before it:

text
1. container
2. bootstrap_package
3. yavi_core
4. yavi_lucerne

That is all — the extension manager writes typo3conf/PackageStates.php and regenerates the class loading information in one step.

!
There is no CLI command for this. TYPO3 v14's core ships extension:list and extension:setup, but nothing that activates an extension; that command used to come from typo3_console, which is a Composer-mode tool. If you script the installation, use the same API the module uses — PackageManager::activatePackage() — and then run php typo3/sysext/core/bin/typo3 dumpautoload. Editing typo3conf/PackageStates.php by hand is not enough. The file only records which packages are active; the PSR-4 map lives separately in typo3conf/autoload/, and nothing in the bootstrap regenerates it. TYPO3 then aborts with `` Expected to find class "B13\Container\…\RecordContextMenuItemProvider" in file "…/typo3conf/ext/container/Classes/…" while importing services from resource "../Classes/*", but it was not found! ` even though the file and the class are exactly where the message says. The fix is dumpautoload`.

Then perform the database migrations:

bash
php -d memory_limit=512M typo3/sysext/core/bin/typo3 extension:setup
php -d memory_limit=512M typo3/sysext/core/bin/typo3 cache:flush

extension:setup adds the theme's columns to tt_content and creates the eight item tables, and copies Initialisation/Files/ into fileadmin/yavi_lucerne/ (405 files, 24 MB). In the backend the same work is done by Admin Tools → Maintenance → Analyze Database Structure.

5. Decide on the demo content

5a. With the demo content

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

Or through phpMyAdmin, which every hoster provides — the file is 208 KB packed, well within any upload limit.

i
The dump contains DROP TABLE IF EXISTS for every table, be_users included. That is intended: it ships without any accounts, and you create yours in step 7. It also means the import replaces the whole database.

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

bash
cp -R typo3conf/ext/yavi-lucerne/Initialisation/Files/. fileadmin/

This is a flat copy — the result is fileadmin/dummy-media/…, not fileadmin/yavi-lucerne/dummy-media/…. The copy that extension:setup made into fileadmin/yavi_lucerne/ is a second, separate one and is not what the demo uses.

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.

6. The site configuration

In classic mode site configurations live in typo3conf/sites/, not in config/sites/.

bash
mkdir -p typo3conf/sites/mysite
cp -R typo3conf/ext/yavi-lucerne/Initialisation/Site/yavilucerne/. typo3conf/sites/mysite/

That copies three files, and the theme needs all three:

FileWhat it carries
config.yamlbase, languages, and the dependencies — the Sets
page.tsconfigpage TSconfig: backend layouts, the RTE preset, TCEFORM/TCEMAIN, and the content element definitions
settings.yamlthe theme's settings, including the uids of the topbar, the sticky bar and the five footer columns, and the licence key

TYPO3 reads page.tsconfig and settings.yaml out of the site folder by itself — there is nothing to include anywhere. If you create the site in the backend instead of copying the folder, you get a config.yaml and nothing else: the frontend then renders, which makes it look finished, while the backend is missing its layouts, its RTE configuration and the theme's content elements. Copy the other two files in by hand in that case.

Then edit typo3conf/sites/mysite/config.yaml:

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

The language base values are relative to the site base, so they stay / and /de/ whatever the domain is.

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

bash
php -d memory_limit=512M init-static-elements.php mysite
php -d memory_limit=512M typo3/sysext/core/bin/typo3 cache:flush

Copy init-static-elements.php and .tarballs/ out of the portal ZIP into the project root first. The script detects the layout itself and works in both modes. 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.

With the demo, do not run the helper — the dump already carries those records, and settings.yaml already points at them.

Either way, check that the root page has a backend layout: Page properties → Appearance → Backend Layout (this page only) and (subpages of this page), both set to Yavi Core - Default. Without it the page has no columns to put content into and the frontend renders an empty frame, with nothing reporting a problem. The demo and the helper set it for you; a root page you created yourself does not have it. See 05 — Setting up the first site.

7. Create your backend user

Only after importing the demo. Step 3 created an account, but the dump in 5a drops be_users and ships without accounts of its own, so that account is gone.

bash
php -d memory_limit=512M typo3/sysext/core/bin/typo3 backend:user:create \
    --username=admin --password='choose-a-strong-one' \
    --email=you@example.com --admin --no-interaction

Give --no-interaction in its long form. Without it the command creates the user and then waits for an answer that never comes.

8. Web server configuration

Apache needs to honour the .htaccess TYPO3 wrote:

apache
<Directory "/path/to/my-site">
    Options FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>

AllowOverride All is not optional, and a hand-written rewrite rule is not a substitute. The obvious one,

apache
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [QSA,L]

silently breaks the backend: /typo3/ is a real directory on disk, so the condition excludes it, the request never reaches index.php, and Apache answers 404 — while the frontend works perfectly and gives you no hint. TYPO3's own .htaccess handles the case correctly.

Writable by the web server user:

text
typo3conf/sites/<id>/settings.yaml   the backend module saves here
typo3conf/system/                    settings.php
typo3temp/                           caches, compiled CSS, processed images
fileadmin/                           uploads
var/

9. Check

bash
php -d memory_limit=512M typo3/sysext/core/bin/typo3 extension:list | grep -E 'yavi|bootstrap|container'

Four lines, all 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. The backend is at /typo3/.

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


Every path that differs from Composer mode

Composer modeclassic mode
Document rootpublic/the project folder
CLI binaryvendor/bin/typo3typo3/sysext/core/bin/typo3
Extensionsvendor/, symlinked from packages/typo3conf/ext/
Settingsconfig/system/settings.phptypo3conf/system/settings.php
Site configurationsconfig/sites/typo3conf/sites/
Caches and logsvar/typo3temp/var/
Activating an extensioncomposer requirethe extension manager, or PackageManager + dumpautoload
Which packages are activethe lock filetypo3conf/PackageStates.php

Updating

  1. Back up the database and the project folder.
  2. TYPO3 itself: unpack the new source archive next to the old one, then move typo3conf/, fileadmin/, typo3temp/ and var/ over — or unpack over the installation and delete the old typo3/ and vendor/ folders first.
  3. The framework: delete typo3conf/ext/yavi-core, then unpack the new version. Do not unpack over the old one — files the new version removed would stay behind. Leave typo3conf/ext/yavi-lucerne untouched: the theme is yours, and an update must not overwrite your SCSS and templates.
  4. php typo3/sysext/core/bin/typo3 dumpautoload
  5. php typo3/sysext/core/bin/typo3 extension:setup
  6. php typo3/sysext/core/bin/typo3 cache:flush

Step 4 is the one that is easy to forget and hard to diagnose: without it, new PHP classes are invisible and TYPO3 reports them as missing from files that obviously contain them.

What classic mode does not give you

LimitationEffect
No dependency resolutionA wrong bootstrap_package or container version fails at runtime, not at install time. Check the version constraints on the TER page yourself.
No autoloader regenerationEvery file change that adds a class needs dumpautoload.
Manual security updatesTYPO3 and both TER extensions have to be watched and replaced by hand.