Alpha — the platform is in development. Docs cover what ships today; anything unbuilt is marked. Get started
-rw-rw-r-- content:content /docs/start/install.dtmpl ● verified against v2.0

Install with Docker

The skeleton is a public repository and the install is five commands. Everything below was run from a clean clone with no credentials available — not assembled from the compose file, and not from what the steps are supposed to do.

git clone https://github.com/coolms/coolms.git
cd coolms
Note

This is a repository, not a release. There is no tag and deliberately no composer create-project line: the skeleton exists so the installation path can be stated from somewhere other than a machine that already has everything.

What comes up#

Three services.

Service For
app PHP-FPM, built from docker/php
nginx the web front end, on 8080
postgres the database

Modules bring their own services when you install them. The CoolMS development tree runs eighteen — Asterisk, LiveKit, coturn, Meilisearch, Gotenberg, Centrifugo and the rest — and every one belongs to a module that is not in the skeleton. Add a service when you add the module that needs it.

postgres specifically, not "a database": CoolMS stores extras as jsonb and the RQL translator emits Postgres-specific SQL.

Note

No database console is in the file, and that is deliberate. A console in something people copy into production is an exposed admin panel, and docker compose exec postgres psql -U coolms is the same access for anyone who already has the machine. The reasoning lives with the other Compose traps in the operations guide.

The five commands#

cp .env.dist .env
docker compose up -d
docker compose exec app composer install
docker compose exec app php bin/console doctrine:schema:create
docker compose exec app php bin/console coolms:install

cp first, before composer install — the order is load-bearing and the skeleton's own README says why.

What each one did on the walk:

  • composer install succeeded and left the tree clean. Both composer.lock and symfony.lock are committed, so no Flex recipe re-applies and nothing rewrites a tracked file behind you.
  • doctrine:schema:create built four tables: coolms_config_overrides, coolms_inbox, coolms_outbox, coolms_sync_changes.
  • coolms:install exited 1. On purpose — see below.
Warning

ext-zip is required and easy to miss. Nothing in the skeleton's own composer.json names it; it arrives through coolms/core-application. The image here provides it, and a hand-built PHP without it fails at composer install with a platform requirement error, before any of the commands above can run. composer why ext-zip in a clone names coolms/core-application as the source.

Note

Use doctrine:schema:create, not migrations:migrate. The latter reports "there are no registered migrations", which is correct rather than broken: no published package ships one.

The command that refuses#

[ERROR] Nothing to install: this application registers no structure
        installers and no module installers.

That exit code is the shortest true statement of what the skeleton is. coolms:install runs what the installed modules contribute, and a distribution shipping no CoolMS module contributes nothing.

It is worth knowing that this used to print two empty sections and [OK] Installation complete. — which is how an installation that did nothing came to look like one that did everything.

Note

It provisions COOLMS_SECRET_MASTER_KEY into your env file before it refuses, and you should back that file up. Everything the secret store seals is undecryptable without it.

What you have, and what you do not#

A booting Symfony application with the platform foundation: the entity and extras engine, the RQL query layer, the DTMPL template engine, the config-override store, the transactional outbox and inbox, and the secret store. Four tables.

Answering, on the walk: / gives 404 — correct, there are no routes and no content — while /api and /api/docs both give 200.

Warning

Measured, not assumed: 0 of the 14 artefacts of a baseline installation. A CoolMS installation produces a site, a theme, users and groups, a VFS tree, navigation, taxonomies, field definitions and workflow definitions. The skeleton reproduces none of them, because the code that does lives in modules that are not packaged yet. The gap is the point of the page, not an omission from it. The comparison is recorded in the skeleton's own docs/measured-against-the-baseline.md, so it moves when the answer does.

Next#

Your first site — installing modules, so that coolms:install has something to run.