Usage

WSGI, Celery and CLI applications for Invenio flavours.

Invenio-App provides the default Flask, WSGI, Celery and CLI applications which is needed in order to run Invenio. All which is needed to run your Inveno instance is to provide a base configuration should via the invenio_config.module entry point.

Setting up your instance

Your base configuration e.g. defines the default language, name of your site as well as the data model you are using. Usually this base configuration is put in Python module inside a package. For instance like this (assuming your instance is called mysite)

# mysite/config.py

BABEL_DEFAULT_LANGUAGE = 'en'
BABEL_DEFAULT_TIMEZONE = 'Europe/Zurich'
# ...

In order to tell the Invenio-App applications to load your base module, you should set the config module import path in the invenio_config.module entry point group like the example below:

# setup.py
setup(
    # ...
    entry_points={
        'invenio_config.module': [
            'mysite = mysite.config',
        ],
    }
)

The entry point 'mysite = mysite.config' defines an entry point named mysite pointing to the Python module mysite.config (i.e. the config module above).

After you edited setup.py, you should always remember to install your Python package again, as otherwise the newly added entry points won’t be picked up.

Applications

CLI

The command-line interface application is named invenio and you use it to e.g. run a development server or initialize the database:

$ invenio --help
Usage: invenio [OPTIONS] COMMAND [ARGS]...

  Command Line Interface for Invenio.

...

Celery

In order to start a Celery worker for Invenio, you need to point Celery to the Invenio Celery application (invenio_app.celery) in the following manner:

$ celery worker --app invenio_app.celery --loglevel INFO

WSGI

Python web applications are usually run by a WSGI server such as Gunicorn, UWSGI or mod_wsgi for Apache. Similar to Celery, you need to point the WSGI servers to the Invenio WSGI application.

Here is e.g. an example with Gunicorn:

$ pip install gunicorn
$ gunicorn invenio_app.wsgi

Invenio-App provides three different WSGI applications depending on your needs:

  • invenio_app.wsgi: Combined UI + REST API application with the REST API mounted under /api.
  • invenio_app.wsgi_ui: UI-only application.
  • invenio_app.wsgi_rest: REST API-only application.

The individual UI and REST API applications are useful if you want to run the UI and API on different servers or domains (e.g. www.example.org and api.example.org), whereas the combined application is useful if you want to run everything on the same server (e.g. www.example.org and www.example.org/api/).

Deployment

Deploying the applications in a production environment among other things involve:

  • daemonizing the applications
  • setting instance specific configuration (e.g. database hostname)
  • securing your instance

Daemonizing the applications

In a production system you would usually need to daemonize the WSGI and Celery application. A full guide on doing this is outside the scope of this documentation, but usually it involves setting up e.g. Supervisord or another process management tool to manage the automatic starting/stopping ot the application.

For a full guide on how to deploy Invenio, please see the general Invenio documentation.

Instance configuration

The instance configuration defines e.g. hostnames of your database server and other values which change depending on where you are running the applications (e.g. local development machine vs. production system). In comparison the base configuration is the same no matter where you run the application (e.g. site name).

The instance configuration can be provided either in <instance-path>/invenio.cfg or via environment variables prefixed with INVENIO_, e.g.:

$ export INVENIO_SQLALCHEMY_DATABASE_URI = ...

The instance path is defined by the environment variable INVENIO_INSTANCE_PATH or if not set defaults to <sys.prefix>/var/instance/ where <sys.prefix> is your Python root prefix (e.g. /usr/)

Securing your instance

The Invenio documentation explains in details how to secure an Invenio instance. It is important to note that if you deploy your Invenio instance with at least one reverse proxy in front of it, then you will have to set the configuration variable WSGI_PROXIES accordingly to correctly handle the X-Forwarded-* headers.

Templates and static files

You can add templates and static files in the following folders respectively:

  • <instance-path>/templates/
  • <instance-path>/static/

This should only be done for small number of templates/files, as it is usually better to provide them via an installabled Python package. Do take care not to overwrite any existing Invenio files.