Running in Production
When moving your API into production some extra steps have to be taken:
Initial Server Setup
For handling asynchronous and background tasks we need to set up a cron entry for regular cleanup as well as supervisor for handling queued tasks.
Set up the following cron job to be executed every 5 minutes:
*/5 * * * * php /srv/api/bin/console dbp:relay:core:cron
Set up the following supervisor job which runs continuously in the background handling various tasks:
php /srv/api/bin/console dbp:relay:core:queue:work my-worker-01
See 'Queued Tasks' for a recommended supervisor configuration.
In case your API runs on multiple servers you also have to provide a central locking backend, see 'Locks' for how to configure it.
Disabling Debug Mode and setting an App Secret
By default debugging and the development configuration is enabled which is not
suitable for production use (security leaks and performance issues). In addition
you need to set APP_SECRET which is used to add entropy to various things and
encrypt cookies etc. You need to make sure that that the following is set in
your .env.local:
# https://symfony.com/doc/current/configuration.html#selecting-the-active-environment
APP_ENV=prod
# https://symfony.com/doc/current/reference/configuration/framework.html#secret
APP_SECRET=<some-random-string>
You can generate a suitable random string via
php -r 'echo bin2hex(random_bytes(20))."\n";'
On Every Deployment
-
composer install --no-dev --classmap-authoritativeto install only non-dev dependencies and optimize the class loader for static sources. -
composer dump-env prodto write out a.env.local.phpfile constructed from the.envfile and the.env.localfile. This avoids parsing the.envfiles in the future. -
php bin/console cache:clearto clear the cache and warm it up again -
(optional)
php bin/console dbp:relay:core:queue:restartin case you have workers running (via supervisor) they need to be stopped, so the next task they execute uses the newly deployed code. -
(optional) Use cachetool to clear the opcache. This is required if you use php-fpm and don't restart it between deployments.