Deployment ========== According to the current configuration for production, in order to deploy the Control Tower platform, we have to have access to the following resources: * A server or cloud platform able to run **Docker containers**. * An external service to store **statics**, compatible with Amazon S3. * A service for sending **transactional emails** (like Mailgun, Sendgrid...). * A **HTTP proxy**, like nginx. Optional but recommended: * An external **PostgreSQL** database. * An external **Redis** server. .. note:: The PostgreSQL and Redis server can be created using Docker containers, but is recommended to use external services. .. image:: /_static/architecture.png Docker Repositories ------------------- Assuming we have the registry server credentials in the ``$REGISTRY_PASSWORD`` and ``$REGISTRY_USER`` environment variables, the first thing we have to do is login in the registry server. .. code-block:: bash echo $REGISTRY_PASSWORD | docker login registry.dekaside.com -u $REGISTRY_USER --password-stdin Once is this performed, we can pull all the docker images. Backend services ---------------- The Control Tower backend is composed by the following services: * **Sync HTTP server**, using `gunicorn `_ over Django, for handle the RESTful API requests. * **Async HTTP server**, using `daphne `_ over Django-Channels, for handle WebSockets and realtime notifications. * A **worker** for running background tasks, like sending emails, using Celery. The system can be configured using several approaches, but in the end, all these services can be executed using the same Docker image, only changing the command to run. **Example** First, we can pull the backend docker image: .. code-block:: bash docker pull registry.dekaside.com/controltower/controltower-backend:latest To run the sync HTTP server, assuming all the :ref:`environment variables ` are in the ``.env`` file: .. code-block:: bash docker run --rm --env-file .env -p 5000:5000 controltower-backend ./start To run the async HTTP server, assuming all the :ref:`environment variables ` are in the ``.env`` file: .. code-block:: bash docker run --rm --env-file .env -p 5001:5001 controltower-backend ./start-channels To run the worker, assuming all the :ref:`environment variables ` are in the ``.env`` file: .. code-block:: bash docker run --rm --env-file .env controltower-backend ./start-celeryworker .. note:: Other service can be executed using the same Docker image, named ``celerybeat``. This service is used as scheduled task launcher, but for Control Tower it isn't needed. Frontend services ----------------- The Control Tower frontend is composed by the following service: * Frontend server (with `Nuxt `_), for rendering the frontend application. **Example** First, we can pull the backend docker image: .. code-block:: bash docker pull registry.dekaside.com/controltower/controltower-frontend:latest Then, we can execute the Nuxt server, setting the :ref:`environment variables ` in the command: .. code-block:: bash docker run --rm -e NODE_ENV=production -e NUXT_HOST=0.0.0.0 -p 3000:3000 controltower-frontend ./start