The Kirby Demo Manager powers the Kirby demo at https://trykirby.com.
- Create a template repo. The contents of that repository will be set up for each demo user. You can customize the build and demo creation processes with a
.hooks.phpfile at the root of your template repo. Our own template repo is the Kirby Demokit. - Clone the
demo-managerrepository to a directory that can be accessed by your web server. - Install the Composer dependencies with
composer install. - Create an empty
datadirectory inside thedemo-managerand create aconfig.phpfile within it. You can find all configuration options in the source code. The bare minimum are the following options:<?php return [ 'indexResponse' => 'https://example.com/try', 'statusResponse' => 'https://example.com/try/{{ type }}:{{ status }}', 'templateUrl' => 'https://github.com/ghost/example-repo/archive/{{ buildId }}.zip#example-repo-{{ buildId }}' ];
- Point your web server at the Demo Manager's
publicdirectory and ensure that the web server takes each subfolder into account as well by respecting the instances'index.phpfiles. For Apache setups this is a given due to.htaccess, other servers may need custom config (see our example nginx config). - Set up the following cronjobs:
bin/demo_cleanup(recommendation: every 10 minutes)bin/demo_prepare(recommendation: every minute, only in production)bin/demo_stats --csv >> /your/path/to/stats.csv(optional, at a custom interval; alternatively you can request the/statsURL manually or with an external tool)
If no template exists, the Demo Manager will automatically build the template in the next request.
You can manually rebuild the template with the bin/demo_build command. The command accepts an optional command line argument with the build ID (otherwise the build ID is randomly generated). The build ID is passed to the build hooks of the template and can e.g. be used to populate assets in a CDN.
If your template repo is hosted on GitHub, you can automate the template build by creating a push webhook to the URL https://demo.example.com/build with the webhookSecret you have configured in the data/config.php. During webhook builds, the build ID is set to the current commit hash.
The Kirby Demo Manager does not ship with any user interface or site frontend.
To create a new demo instance, make the user send a POST request to the root of your installation. On the Kirby website we use a simple <form action="https://trykirby.com" method="POST"> for this.
The configured index response (URL or closure) is used to respond to requests to the root of your demo installation.
The configured status response (URL or closure) is used for all kinds of status information. The following combinations of type and status are currently in use:
error:referrer(if the creation request came from an invalid referrer)error:overload(if too many active demo instances exist)error:rate-limit(if the IP address of the visitor has created too many instances)error:not-found(for requests to instances that don't exist or have been deleted)error:unexpected(for fatal errors in the Demo Manager code)
Additional status responses can be created from instances of your demo template. E.g. our Demokit sends a status:deleted status response/redirect when the user has manually deleted their instance.
- The template ZIP is fetched and unpacked. Afterwards it is pre-processed using its optional included build script. The resulting template directory is stored as
data/templateand copied to every demo instance. - All demo instances are kept in a SQLite database in
data/instances.sqlite. This allows to keep an overview of all active and prepared instances and the connected IP address hash and expiry time for each active instance. - "Preparing" an instance means to copy it to the
publicfolder ahead of its actual creation by a user. This increases creation performance as a prepared instance can quickly be activated by simply updating the database entry. - A
data/.lockfile is used to prevent simultaneous template builds and instance creations. - The actual demo instances are fully independent from the Demo Manager and are expected to be served directly by the web server as subfolder installations (however they can of course load the code of the Demo Manager to access data such as their connected IP address hash and expiry time). Requests to deleted instances need to fall back to the Demo Manager's
index.phpat the root of thepublicfolder.
http://www.opensource.org/licenses/mit-license.php
Lukas Bestle https://getkirby.com