.. _deployment:
Architecture
============
Pulp's architecture has three components to it: a REST API, a content serving application, and the
tasking system. Each component can be horizontally scaled for both high availability and/or
additional capacity for that part of the architecture.
.. image:: /static/architecture.png
:align: center
REST API
--------
Pulp's REST API is a Django application that runs under any WSGI server. It serves the following
things:
* The REST API hosted at ``/pulp/api/v3/``
* The browse-able documentation at ``/pulp/api/v3/docs/``
* Any viewsets or views provided by plugins
* Static content used by Django, e.g. images used by the browse-able API. This is not Pulp content.
.. note::
A simple, but limited way to run the REST API as a standalone service using the built-in Django
runserver. The ``pulpcore-manager`` command is ``manage.py`` configured with the
``DJANGO_SETTINGS_MODULE="pulpcore.app.settings"``. Run the simple webserver with::
$ pulpcore-manager runserver 24817
The REST API can be deployed with any any WSGI webserver like a normal Django application. See the
`Django deployment docs `_ for more
information.
Content Serving Application
---------------------------
An aiohttp.server based application that serves content to clients. The content could be
:term:`Artifacts` already downloaded and saved in Pulp, or
:term:`on-demand content units`. When serving
:term:`on-demand content units` the downloading also happens from within this
component as well.
.. note::
Pulp installs a script that lets you run the content serving app as a standalone service as
follows:::
$ pulp-content
The content serving application can be deployed like any aiohttp.server application. See the
`aiohttp Deployment docs `_ for more
information.
Distributed Tasking System
--------------------------
Pulp's tasking system consists of a single ``pulpcore-worker`` component consequently, and can be
scaled by increasing the number of worker processes to provide more concurrency. Each worker can
handle one task at a time, and idle workers will lookup waiting and ready tasks in a distributed
manner. If no ready tasks were found a worker enters a sleep state to be notified, once new tasks
are available or resources are released. Workers auto-name and are auto-discovered, so they can be
started and stopped without notifying Pulp.
.. note::
Pulp serializes tasks that are unsafe to run in parallel, e.g. a sync and publish operation on
the same repo should not run in parallel. Generally tasks are serialized at the "resource" level, so
if you start *N* workers you can process *N* repo sync/modify/publish operations concurrently.
All necessary information about tasks is stored in Pulp's Postgres database as a single source of
truth. In case your tasking system get's jammed, there is a guide to help :ref:debugging_tasks.
Static Content
--------------
When browsing the REST API or the browsable documentation with a web browser, for a good experience,
you'll need static content to be served.
In Development
^^^^^^^^^^^^^^
If using the built-in Django webserver and your settings.yaml has ``DEBUG: True`` then static
content is automatically served for you.
In Production
^^^^^^^^^^^^^
Collect all of the static content into place using the ``collectstatic`` command. The
``pulpcore-manager`` command is ``manage.py`` configured with the
``DJANGO_SETTINGS_MODULE="pulpcore.app.settings"``. Run ``collectstatic`` as follows::
$ pulpcore-manager collectstatic