For reference, generating tiles for a quite large panorama (30000x3487 pixels, amounting to 105 Mpixels, storing in JPEG) took 855 MB of RAM using Python 3.5 with Pillow 3.0.0 on a x86_64 Linux system.
Celutz is a fairly standard Django application: refer to the Django documentation for deployment methods. The initial installation for development should look like this:
# Debian jessie with python3, adapt to your OS
apt install build-essential python3-dev libjpeg-dev libtiff5-dev zlib1g-dev libopenjp2-7-dev
virtualenv -p /usr/bin/python3 ~/mycelutzvenv
. ~/mycelutzvenv/bin/activate
pip install -r requirements.txt
To configure the application, don't edit celutz/settings.py
directly, but
instead create a file celutz/local_settings.py
with your local modifications.
Some Django things you should really configure:
SECRET_KEY
ALLOWED_HOSTS
DEBUG
There are also celutz-specific settings:
LOGIN_REQUIRED
: is celutz public or are users required to login first?PANORAMA_TILES_DIR
: where the tiles are, relatively to MEDIA_ROOT
and MEDIA_URL
PANORAMA_MAX_DISTANCE
: maximum distance (in meters) after which reference points are considered to be too far awayMAP_BOUNDS
: if defined, limit the view of the main map to the given rectangle. By default, the view is fitted to display all points. See celutz/settings.py
for an example.Then run the migrations:
python manage.py migrate
And create a superuser:
python manage.py createsuperuser
Lastly, you should collect static files to serve them:
python manage.py collectstatic
Just run the builtin Django server:
./manage.py runserver
Alternatively, you can use gunicorn exactly like in production.
You also need to launch a celery worker (see below).
To run the WSGI server, for instance gunicorn:
gunicorn celutz.wsgi:application
Internally, dj_static
is used to serve static and media files (including tiles).
As an alternative, you may wish to serve media files (everything in media/
)
with your web server directly.
You probably also need to configure your webserver to allow to send very large files in a POST request. An upper limit of 200 MB should be enough, even for very large pictures in raw format.
There is a script, update_prod.sh
, that handles updating an existing
production installation. It install new dependencies and collect static
files.
Tile generation uses Celery, because it is quite a heavy task CPU-wise.
To launch a celery worker, run this in your virtualenv:
celery -c 1 -A celutz.celery worker --loglevel=info
This tells celery to handle at most one task at a time: -c 1
. Indeed,
generating tiles for a single panorama can take quite a lot of RAM.
If you have enough RAM (2GB+) and multiple CPU, you can increase this
parameter to generate tiles for multiple panoramas in parallel.
The default parameters use the Django database as a message queue, to ask a celery woker to generate tiles for a panorama. This is far from efficient, but since there are very few messages, it is not worth the trouble to configure a real message queue such as RabbitMQ.
Gathering reference points can be a bit of a hassle.
Some reference points are provided alongside celutz, in panorama/fixtures
.
To import one set of reference points into the database, run:
python manage.py loaddata refpoints_mycity
Were you previously using the PHP version of celutz? You can import all your
old data! See UPGRADE.md
.