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
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.
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 installsucceeded and left the tree clean. Bothcomposer.lockandsymfony.lockare committed, so no Flex recipe re-applies and nothing rewrites a tracked file behind you.doctrine:schema:createbuilt four tables:coolms_config_overrides,coolms_inbox,coolms_outbox,coolms_sync_changes.coolms:installexited 1. On purpose — see below.
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.
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.
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.
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.