Apache ====== 1. Install Packages ------------------- PostgreSQL is installed from its upstream repos to get a more recent version. .. code-block:: shell apt install -y lsb-release wget curl gnupg wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor > /usr/share/keyrings/pgdg-archive-keyring.gpg echo "deb [signed-by=/usr/share/keyrings/pgdg-archive-keyring.gpg] https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list apt update apt install -y --install-recommends postgresql-16 libpq-dev apache2 libapache2-mod-proxy-uwsgi libapache2-mod-xsendfile libxslt1-dev libxml2-dev libffi-dev libpcre2-dev libyaml-dev libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev libncurses5-dev libncursesw5-dev xz-utils liblzma-dev uuid-dev build-essential redis-server git libpango1.0-dev If you use Debian, run this command: .. code-block:: shell apt install -y libjpeg62-turbo-dev If you use Ubuntu, run this instead: .. code-block:: shell apt install -y libjpeg-turbo8-dev Afterwards, make sure the services you just installed are running: .. code-block:: shell systemctl start postgresql.service redis-server.service 2. Create a Database -------------------- Let's create a user and database for indico and enable the necessary Postgres extensions (which can only be done by the Postgres superuser). .. code-block:: shell su - postgres -c 'createuser indico' su - postgres -c 'createdb -O indico indico' su - postgres -c 'psql indico -c "CREATE EXTENSION unaccent; CREATE EXTENSION pg_trgm;"' .. important:: Do not forget to setup a cronjob that creates regular database backups once you start using Indico in production! 3. Configure uWSGI & Apache --------------------------- The default uWSGI and Apache configuration files should work fine in most cases. .. code-block:: shell cat > /etc/uwsgi-indico.ini <<'EOF' [uwsgi] uid = indico gid = www-data umask = 027 processes = 4 enable-threads = true chmod-socket = 770 chown-socket = indico:www-data socket = /opt/indico/web/uwsgi.sock stats = /opt/indico/web/uwsgi-stats.sock protocol = uwsgi master = true auto-procname = true procname-prefix-spaced = indico disable-logging = true single-interpreter = true touch-reload = /opt/indico/web/indico.wsgi wsgi-file = /opt/indico/web/indico.wsgi virtualenv = /opt/indico/.venv vacuum = true buffer-size = 20480 memory-report = true max-requests = 2500 harakiri = 900 harakiri-verbose = true reload-on-rss = 2048 evil-reload-on-rss = 8192 EOF We also need a systemd unit to start uWSGI. .. code-block:: shell cat > /etc/systemd/system/indico-uwsgi.service <<'EOF' [Unit] Description=Indico uWSGI After=network.target [Service] ExecStart=/opt/indico/.venv/bin/uwsgi --ini /etc/uwsgi-indico.ini ExecReload=/bin/kill -HUP $MAINPID Restart=always SyslogIdentifier=indico-uwsgi User=indico Group=www-data UMask=0027 Type=notify NotifyAccess=all KillMode=mixed KillSignal=SIGQUIT TimeoutStopSec=300 [Install] WantedBy=multi-user.target EOF .. note:: Replace ``YOURHOSTNAME`` in the next files with the hostname on which your Indico instance should be available, e.g. ``indico.yourdomain.com`` .. code-block:: shell cat > /etc/apache2/sites-available/indico-sslredir.conf <<'EOF' ServerName YOURHOSTNAME RewriteEngine On RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L] EOF cat > /etc/apache2/sites-available/indico.conf <<'EOF' ServerName YOURHOSTNAME DocumentRoot "/var/empty/apache" Protocols h2 http/1.1 SSLEngine on SSLCertificateFile /etc/ssl/indico/indico.crt SSLCertificateKeyFile /etc/ssl/indico/indico.key SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1 SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384 SSLHonorCipherOrder off SSLSessionTickets off XSendFile on XSendFilePath /opt/indico CustomLog /opt/indico/log/apache/access.log combined ErrorLog /opt/indico/log/apache/error.log LogLevel error ServerSignature Off Redirect 301 / https://YOURHOSTNAME/ AliasMatch "^/(images|fonts)(.*)/(.+?)(__v[0-9a-f]+)?\.([^.]+)$" "/opt/indico/web/static/$1$2/$3.$5" AliasMatch "^/(css|dist|images|fonts)/(.*)$" "/opt/indico/web/static/$1/$2" Alias /robots.txt /opt/indico/web/static/robots.txt SetEnv UWSGI_SCHEME https ProxyPass / unix:/opt/indico/web/uwsgi.sock|uwsgi://localhost/ AllowOverride None Require all granted EOF Now enable the necessary modules and the indico site in apache: .. code-block:: shell a2enmod proxy_uwsgi rewrite ssl xsendfile a2dissite 000-default a2ensite indico indico-sslredir 4. Create a TLS Certificate --------------------------- First, create the folders for the certificate/key and set restrictive permissions on them: .. code-block:: shell mkdir /etc/ssl/indico chown root:root /etc/ssl/indico/ chmod 700 /etc/ssl/indico If you are just trying out Indico you can simply use a self-signed certificate (your browser will show a warning which you will have to confirm when accessing your Indico instance for the first time). .. note:: Do not forget to replace ``YOURHOSTNAME`` with the same value you used above .. code-block:: shell openssl req -x509 -nodes -newkey rsa:4096 -subj /CN=YOURHOSTNAME -keyout /etc/ssl/indico/indico.key -out /etc/ssl/indico/indico.crt While a self-signed certificate works for testing, it is not suitable for a production system. You can either buy a certificate from any commercial certification authority or get a free one from `Let's Encrypt`_. .. note:: There's an optional step later in this guide to get a certificate from Let's Encrypt. We can't do it right now since the Apache config references a directory yet to be created, which prevents Apache from starting. 5. Install Indico ----------------- Celery runs as a background daemon. Add a systemd unit file for it: .. code-block:: shell cat > /etc/systemd/system/indico-celery.service <<'EOF' [Unit] Description=Indico Celery After=network.target [Service] ExecStart=/opt/indico/.venv/bin/indico celery worker -B Restart=always SyslogIdentifier=indico-celery User=indico Group=www-data UMask=0027 Type=simple KillMode=mixed TimeoutStopSec=300 [Install] WantedBy=multi-user.target EOF systemctl daemon-reload Now create a user that will be used to run Indico and switch to it: .. code-block:: shell useradd -rm -g www-data -d /opt/indico -s /bin/bash indico su - indico The first thing to do is installing pyenv - we use it to install the latest Python version as not all Linux distributions include it and like this Indico can benefit from the latest Python features. .. code-block:: shell curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash cat >> ~/.bashrc <<'EOF' export PATH="/opt/indico/.pyenv/bin:$PATH" eval "$(pyenv init --path)" eval "$(pyenv init -)" EOF source ~/.bashrc You are now ready to install Python 3.12: .. code-block:: shell pyenv install 3.12 pyenv global 3.12 This may take a while since pyenv needs to compile the specified Python version. Once done, you may want to use ``python -V`` to confirm that you are indeed using the version you just installed. You are now ready to install Indico: .. code-block:: shell python -m venv --upgrade-deps --prompt indico ~/.venv source ~/.venv/bin/activate echo 'source ~/.venv/bin/activate' >> ~/.bashrc pip install setuptools wheel pip install uwsgi pip install indico 6. Configure Indico ------------------- Once Indico is installed, you can run the configuration wizard. You can keep the defaults for most options, but make sure to use ``https://YOURHOSTNAME`` when prompted for the Indico URL. Also specify valid email addresses when asked and enter a valid SMTP server Indico can use to send emails. When asked for the default timezone make sure this is the main time zone used in your Indico instance. .. code-block:: shell indico setup wizard Now finish setting up the directory structure and permissions: .. code-block:: shell mkdir ~/log/apache chmod go-rwx ~/* ~/.[^.]* chmod 710 ~/ ~/archive ~/cache ~/log ~/tmp chmod 750 ~/web ~/.venv chmod g+w ~/log/apache echo -e "\nSTATIC_FILE_METHOD = 'xsendfile'" >> ~/etc/indico.conf 7. Create database schema ------------------------- Finally, you can create the database schema and switch back to *root*: .. code-block:: shell indico db prepare exit 8. Launch Indico ---------------- You can now start Indico and set it up to start automatically when the server is rebooted: .. code-block:: shell systemctl restart apache2.service indico-celery.service indico-uwsgi.service systemctl enable apache2.service postgresql.service redis-server.service indico-celery.service indico-uwsgi.service 9. Optional: Get a Certificate from Let's Encrypt ------------------------------------------------- To avoid ugly TLS warnings in your browsers, the easiest option is to get a free certificate from Let's Encrypt. We also enable the cronjob to renew it automatically: .. code-block:: shell apt install -y certbot python3-certbot-apache certbot --apache --no-redirect --staple-ocsp -d YOURHOSTNAME rm -f /etc/ssl/indico/indico.* systemctl start certbot.timer systemctl enable certbot.timer 10. Create an Indico user ------------------------- Access ``https://YOURHOSTNAME`` in your browser and follow the steps displayed there to create your initial user. 11. Setup LaTeX PDF generation (optional) ----------------------------------------- Follow the :ref:`PDF generation guide ` to setup PDF document generation in Indico. .. _deb-apache-shib: Optional: Shibboleth -------------------- If your organization uses Shibboleth/SAML-based SSO, follow these steps to use it in Indico: 1. Install Shibboleth ^^^^^^^^^^^^^^^^^^^^^ .. code-block:: shell apt install -y libapache2-mod-shib a2enmod shib 2. Configure Shibboleth ^^^^^^^^^^^^^^^^^^^^^^^ This is outside the scope of this documentation and depends on your environment (Shibboleth, SAML, ADFS, etc). Please contact whoever runs your SSO infrastructure if you need assistance. 3. Enable Shibboleth in Apache ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Add the following code to your ``/etc/apache2/sites-available/indico.conf`` right before the ``AliasMatch`` lines: .. code-block:: apache AuthType shibboleth ShibRequestSetting requireSession 1 ShibExportAssertion Off Require valid-user 4. Enable Shibboleth in Indico ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. include:: ../_sso_indico.rst .. _PostgreSQL wiki: https://wiki.postgresql.org/wiki/YUM_Installation#Configure_your_YUM_repository .. _Let's Encrypt: https://letsencrypt.org/