diff --git a/Dockerfile b/Dockerfile index b8538bb890..a18c54e428 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.6 +FROM python:3.8 RUN apt-get update && \ apt-get install -y --no-install-recommends \ @@ -30,7 +30,8 @@ RUN apt-get update && \ mkdir /data && \ useradd -ms /bin/bash -d /pretix -u 15371 pretixuser && \ echo 'pretixuser ALL=(ALL) NOPASSWD:SETENV: /usr/bin/supervisord' >> /etc/sudoers && \ - mkdir /static + mkdir /static && \ + mkdir /etc/supervisord ENV LC_ALL=C.UTF-8 \ DJANGO_SETTINGS_MODULE=production_settings @@ -47,12 +48,13 @@ RUN pip3 install -U \ -r requirements.txt \ -r requirements/memcached.txt \ -r requirements/mysql.txt \ - -r requirements/redis.txt \ - gunicorn && \ + gunicorn django-extensions ipython && \ rm -rf ~/.cache/pip COPY deployment/docker/pretix.bash /usr/local/bin/pretix -COPY deployment/docker/supervisord.conf /etc/supervisord.conf +COPY deployment/docker/supervisord /etc/supervisord +COPY deployment/docker/supervisord.all.conf /etc/supervisord.all.conf +COPY deployment/docker/supervisord.web.conf /etc/supervisord.web.conf COPY deployment/docker/nginx.conf /etc/nginx/nginx.conf COPY deployment/docker/production_settings.py /pretix/src/production_settings.py COPY src /pretix/src diff --git a/deployment/docker/pretix.bash b/deployment/docker/pretix.bash index 47ca5e7eae..e610d9769e 100644 --- a/deployment/docker/pretix.bash +++ b/deployment/docker/pretix.bash @@ -5,6 +5,8 @@ export DATA_DIR=/data/ export HOME=/pretix export NUM_WORKERS=$((2 * $(nproc --all))) +AUTOMIGRATE=${AUTOMIGRATE:-yes} + if [ ! -d /data/logs ]; then mkdir /data/logs; fi @@ -16,10 +18,16 @@ if [ "$1" == "cron" ]; then exec python3 -m pretix runperiodic fi -python3 -m pretix migrate --noinput +if [ "$AUTOMIGRATE" != "skip" ]; then + python3 -m pretix migrate --noinput +fi if [ "$1" == "all" ]; then - exec sudo -E /usr/bin/supervisord -n -c /etc/supervisord.conf + exec sudo -E /usr/bin/supervisord -n -c /etc/supervisord.all.conf +fi + +if [ "$1" == "web" ]; then + exec sudo -E /usr/bin/supervisord -n -c /etc/supervisord.web.conf fi if [ "$1" == "webworker" ]; then @@ -37,10 +45,6 @@ if [ "$1" == "taskworker" ]; then exec celery -A pretix.celery_app worker -l info "$@" fi -if [ "$1" == "shell" ]; then - exec python3 -m pretix shell -fi - if [ "$1" == "upgrade" ]; then exec python3 -m pretix updatestyles fi diff --git a/deployment/docker/supervisord.all.conf b/deployment/docker/supervisord.all.conf new file mode 100644 index 0000000000..8ce2ef5832 --- /dev/null +++ b/deployment/docker/supervisord.all.conf @@ -0,0 +1,2 @@ +[include] +files = /etc/supervisord/*.conf diff --git a/deployment/docker/supervisord.conf b/deployment/docker/supervisord.conf deleted file mode 100644 index c348fd9677..0000000000 --- a/deployment/docker/supervisord.conf +++ /dev/null @@ -1,44 +0,0 @@ -[unix_http_server] -file=/tmp/supervisor.sock - -[supervisord] -logfile=/tmp/supervisord.log -logfile_maxbytes=50MB -logfile_backups=10 -loglevel=info -pidfile=/tmp/supervisord.pid -nodaemon=false -minfds=1024 -minprocs=200 - -[rpcinterface:supervisor] -supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface - -[supervisorctl] -serverurl=unix:///tmp/supervisor.sock - -[program:pretixweb] -command=/usr/local/bin/pretix webworker -autostart=true -autorestart=true -priority=5 -user=pretixuser -environment=HOME=/pretix - -[program:pretixtask] -command=/usr/local/bin/pretix taskworker -autostart=true -autorestart=true -priority=5 -user=pretixuser - -[program:nginx] -command=/usr/sbin/nginx -autostart=true -autorestart=true -priority=10 -stdout_events_enabled=true -stderr_events_enabled=true - -[include] -files = /etc/supervisord-*.conf diff --git a/deployment/docker/supervisord.web.conf b/deployment/docker/supervisord.web.conf new file mode 100644 index 0000000000..eed79b11b3 --- /dev/null +++ b/deployment/docker/supervisord.web.conf @@ -0,0 +1,2 @@ +[include] +files = /etc/supervisord/base.conf /etc/supervisord/nginx.conf /etc/supervisord/pretixweb.conf diff --git a/deployment/docker/supervisord/base.conf b/deployment/docker/supervisord/base.conf new file mode 100644 index 0000000000..86daf761d6 --- /dev/null +++ b/deployment/docker/supervisord/base.conf @@ -0,0 +1,18 @@ +[unix_http_server] +file=/tmp/supervisor.sock + +[supervisord] +logfile=/tmp/supervisord.log +logfile_maxbytes=50MB +logfile_backups=10 +loglevel=info +pidfile=/tmp/supervisord.pid +nodaemon=false +minfds=1024 +minprocs=200 + +[rpcinterface:supervisor] +supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface + +[supervisorctl] +serverurl=unix:///tmp/supervisor.sock diff --git a/deployment/docker/supervisord/nginx.conf b/deployment/docker/supervisord/nginx.conf new file mode 100644 index 0000000000..8262eab6d3 --- /dev/null +++ b/deployment/docker/supervisord/nginx.conf @@ -0,0 +1,7 @@ +[program:nginx] +command=/usr/sbin/nginx +autostart=true +autorestart=true +priority=10 +stdout_events_enabled=true +stderr_events_enabled=true diff --git a/deployment/docker/supervisord/pretixtask.conf b/deployment/docker/supervisord/pretixtask.conf new file mode 100644 index 0000000000..59fe266198 --- /dev/null +++ b/deployment/docker/supervisord/pretixtask.conf @@ -0,0 +1,6 @@ +[program:pretixtask] +command=/usr/local/bin/pretix taskworker +autostart=true +autorestart=true +priority=5 +user=pretixuser diff --git a/deployment/docker/supervisord/pretixweb.conf b/deployment/docker/supervisord/pretixweb.conf new file mode 100644 index 0000000000..498df76378 --- /dev/null +++ b/deployment/docker/supervisord/pretixweb.conf @@ -0,0 +1,7 @@ +[program:pretixweb] +command=/usr/local/bin/pretix webworker +autostart=true +autorestart=true +priority=5 +user=pretixuser +environment=HOME=/pretix diff --git a/doc/admin/installation/docker_smallscale.rst b/doc/admin/installation/docker_smallscale.rst index 11a51b0979..9a1512fb37 100644 --- a/doc/admin/installation/docker_smallscale.rst +++ b/doc/admin/installation/docker_smallscale.rst @@ -284,6 +284,24 @@ Then, go to that directory and build the image:: You can now use that image ``mypretix`` instead of ``pretix/standalone`` in your service file (see above). Be sure to re-build your custom image after you pulled ``pretix/standalone`` if you want to perform an update. +Scaling up +---------- + +If you need to scale to multiple machines, please first read our :ref:`scaling guide `. + +If you run the official docker container on multiple machines, it is recommended to set the environment +variable ``AUTOMIGRATE=skip`` on all containers and run ``docker exec -it pretix.service pretix migrate`` +on one machine after each upgrade manually, otherwise multiple containers might try to upgrade the +database schema at the same time. + +To run only the ``pretix-web`` component of pretix as well as a nginx server serving static files, you +can invoke the container with ``docker run … pretix/standalone:stable web`` (instead of ``all``). + +To run only ``pretix-worker``, you can run ``docker run … pretix/standalone:stable taskworker``. You can +also pass arguments to limit the worker to specific queues or to change the number of concurrent task +workers, e.g. ``docker run … taskworker -Q notifications --concurrency 32``. + + .. _Docker: https://docs.docker.com/engine/installation/linux/debian/ .. _Postfix: https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-postfix-as-a-send-only-smtp-server-on-ubuntu-16-04 .. _nginx: https://botleg.com/stories/https-with-lets-encrypt-and-nginx/