diff --git a/docs/admin/01_install.rst b/docs/admin/01_install.rst index 437c161d2dea34d4886119de075f89749ddf73dd..bf39c4072f660b75a26613dfbe2ecfc515e66ae9 100644 --- a/docs/admin/01_install.rst +++ b/docs/admin/01_install.rst @@ -1,150 +1,249 @@ Install AlekSIS =============== -From source ------------ +From PyPI +--------- -In this section we will install AlekSIS with `uWSGI` and `nGINX` on debian +In this section we will install AlekSIS with `uWSGI` and `nGINX` on Debian bullseye. -AlekSIS will store its data in two directories; media and static. The -`media` directory contains everything uploaded by users, e.g. photos of -persons. The `static` folder contains static files from AlekSIS such as -scripts an stylesheets. +Filesystem locations +~~~~~~~~~~~~~~~~~~~~ + +AlekSIS will need and use the following paths: + + * `/etc/aleksis` for configuration files + * `/var/lib/aleksis/media` for file storage (Django media) + * `/var/backups/aleksis` for backups of database and media files + * `/usr/local/share/aleksis/static` for static files + * `/usr/local/share/aleksis/node_modules` for frontend dependencies + +You can change any of the paths as you like. -1. Prerequisites:: +Prerequisites +~~~~~~~~~~~~~ + +For an installation on a dedicated server, the following prerequisites are needed: * Debian 11 + * PostgreSQL + * Redis + * uWSGI + * nginx + * Python 3.9 + * Some system dependencies to build Python modules and manage frontend files + * The aforementioned paths + +Install system packages +~~~~~~~~~~~~~~~~~~~~~~~ + +Install some packages from the Debian package system. + +.. code-block:: shell + + apt install uwsgi \ + uwsgi-plugin-python3 \ + nginx-full \ + python3 \ + python3-dev \ + libldap2-dev \ + libsasl2-dev \ + yarnpkg \ + python3-virtualenv \ + chromium \ + redis-server \ + postgresql + +Create PostgreSQL user and database +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Generate a secure password for the database, then create the user and database. + +.. code-block:: shell + + sudo -u postgres createuser -l aleksis - + sudo -u postgres createdb -O aleksis aleksis + +When asked, use the password generated above. + +Create the directories for storage +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: shell -1. Prepare system + mkdir -p /etc/aleksis \ + /usr/share/aleksis/{static,node_modules} \ + /var/lib/aleksis/media \ + /var/backups/aleksis - * Install system dependencies:: +Create AlekSIS configuration file +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - $ apt install uwsgi uwsgi-plugin-python3 nginx-full python3.9 python3.9-dev libldap2-dev libsasl2-dev yarnpkg python3-virtualenv chromium redis-server +AlekSIS is configured in files in `/etc/aleksis`. Create a basic configuration file +for the environment defined above by opening `/etc/aleksis/aleksis.toml` with your +favourite text editor and adding the following configuration. - * Create and activate virtual environment:: +.. code-block:: toml - $ mkdir -p /srv/www/aleksis - $ mkdir -p /srv/www/aleksis/data/{static,media} - $ cd /srv/www/aleksis - $ python3 -m venv - $ source /srv/www/aleksis/venv/bin/activate - $ pip install poetry + static = { root = "/usr/local/share/aleksis/static", url = "/static/" } + media = { root = "/var/lib/aleksis/media", url = "/media/" } + node_modules = { root = "/usr/local/share/aleksis/node_modules" } + secret_key = "SomeRandomValue" - * Install and configure PostgreSQL:: + [http] + allowed_hosts = ["aleksis.example.com"] - $ apt install postgresql-13 - $ sudo -u postgres createuser -l aleksis - - $ sudo -u postgres createdb -O aleksis aleksis + [database] + host = "localhost" + name = "aleksis" + username = "aleksis" + password = "password_generated_above" - * Configure uWSGI:: + [backup] + location = "/var/backups/aleksis" - $ editor /etc/uwsgi/apps-available/aleksis.ini + [auth.superuser] + username = "admin" + password = "admin" + email = "root@localhost" - [uwsgi] - vhost = true - plugins = python3 - master = true - enable-threads = true - processes = 20 - wsgi-file = /usr/src/AlekSIS/aleksis/core/wsgi.py - virtualenv = /srv/www/aleksis/venv - chdir = /usr/src/AlekSIS - lazy = true - lazy-apps = true - attach-daemon = celery -A aleksis.core worker --concurrency=4 - attach-daemon = celery -A aleksis.core beat +Install AlekSIS itself +~~~~~~~~~~~~~~~~~~~~~~ - $ ln -s /etc/uwsgi/apps-available/aleksis.ini /etc/uwsgi/apps-enabled/aleksis.ini - $ service uwsgi restart +To install AlekSIS now, and run all post-install tasks, run the following commands. +They will pull the AlekSIS standard distribution from `PyPI`_ and install it to the +system-wide `dist-packages` of Python. Afterwards, it will download frontend dependencies +from `yarnpkg`, collect static files, and migrate the database to the final schema. - * Get SSL ssl certificate +.. code-block:: shell - * https://certbot.eff.org/instructions + pip3 install aleksis + aleksis-admin yarn install + aleksis-admin collectstatic + aleksis-admin migrate + aleksis-admin createinitialrevisions - * Configure nGINX:: - $ editor /etc/nginx/sites-available/aleksis.example.com - server { - listen 80; - listen [::]:80; +Configure uWSGI +~~~~~~~~~~~~~~~ - server_name aleksis.example.com; +uWSGI is an application server that will manage the server processes and requests. +It will also run the Celery broker and scheduler for you. - return 301 https://$server_name$request_uri; - } +Configure a uWSGI app by opening `/etc/uwsgi/apps-available/aleksis.ini` in an +editor and inserting: - server { - listen 443 ssl http2; - listen [::]:443 ssl http2; +.. code-block:: toml - ssl_certificate /etc/letsencrypt/certs/aleksis.example.com/fullchain.pem; - ssl_certificate_key /etc/letsencrypt/certs/aleksis.example.com/privkey.pem; - ssl_trusted_certificate /etc/letsencrypt/certs/aleksis.example.com/chain.pem; + [uwsgi] + vhost = true + plugins = python3 + master = true + enable-threads = true + processes = 20 + wsgi-file = /usr/local/lib/python3/dist-packages/aleksis/core/wsgi.py + chdir = /var/lib/aleksis + lazy = true + lazy-apps = true + attach-daemon = celery -A aleksis.core worker --concurrency=4 + attach-daemon = celery -A aleksis.core beat - server_name aleksis.example.com; +Afterwards, enable the app using: - access_log /var/log/nginx/access.log; +.. code-block:: shell - location /static { - alias /srv/www/aleksis/data/static; - } + ln -s /etc/uwsgi/apps-available/aleksis.ini /etc/uwsgi/apps-enabled/aleksis.ini + service uwsgi restart - location / { - uwsgi_pass aleksis; - include uwsgi_params; +Configure the nginx webserver +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - proxy_redirect off; - proxy_pass_header Authorization; - } - } +First, you should get a TLS certificate, e.g. by using `Let's Encrypt`_. - $ ln -s /etc/nginx/sites-available/aleksis.example.com /etc/nginx/sites-enabled/aleksis.example.com - $ service nginx restart +Then, create a virtual host in nginx, by editing `/etc/nginx/sites-available/aleksis.example.com`. - * Configure AlekSIS:: - $ mkdir /etc/aleksis - $ editor /etc/aleksis/aleksis.toml - static = { root = "/srv/www/aleksis/data/static", url = "/static/" } - media = { root = "/srv/www/aleksis/data/media", url = "/media/" } - secret_key = "SomeRandomValue" +.. code-block:: nginx + + server { + listen 80; + listen [::]:80; + + server_name aleksis.example.com; + + return 301 https://$server_name$request_uri; + } + + server { + listen 443 ssl http2; + listen [::]:443 ssl http2; + + ssl_certificate /etc/letsencrypt/certs/aleksis.example.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/certs/aleksis.example.com/privkey.pem; + ssl_trusted_certificate /etc/letsencrypt/certs/aleksis.example.com/chain.pem; + + server_name aleksis.example.com; + + access_log /var/log/nginx/access.log; + + location /static { + alias /usr/local/share/aleksis/static; + } + + location / { + uwsgi_pass aleksis; + include uwsgi_params; + proxy_redirect off; + proxy_pass_header Authorization; + } + } + +Enable the virtual host: + +.. code-block:: shell + + ln -s /etc/nginx/sites-available/aleksis.example.com /etc/nginx/sites-enabled/aleksis.example.com + service nginx restart + +Finalisation +~~~~~~~~~~~~ + +Your AlekSIS installation should now be reachable and you can login with the administration +account configured above. + +With Docker +----------- - [http] - allowed_hosts = ["aleksis.example.com"] +AlekSIS can also be installed using Docker, either only AlekSIS itself, or the +full stack, including Redis, using docker-compose - [database] - host = "localhost" - name = "aleksis" - username = "aleksis" - password = "SomeSecretPassword!1" +Full stack using docker-compose +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -1. Clone git repository and checkout version:: +First, install Docker and docker-compose on your system. Also install git +to get the docker-compose file and image definition. - $ cd /usr/src - $ git clone https://edugit.org/AlekSIS/official/AlekSIS-Core - $ cd AlekSIS-Core - $ git checkout 2.0b +.. code-block:: shell -1. Install dependencies and setup initially:: + apt install docker.io docker-compose git - $ poetry install - $ aleksis-admin yarn install - $ aleksis-admin collectstatic - $ aleksis-admin migrate +Now, clone the distribution repository, which contains the docker-compose +file. -1. Restart uWSGI:: +.. code-block:: shell - $ service uwsgi restart + git clone https://edugit.org/AlekSIS/official/AlekSIS -Docker with `docker-compose` ---------------------------- +You should review the file `docker-compose.yaml` for any environment variables +you want to change. -1. Prerequisites:: +Finally, bring the stack up using: - * System with docker and docker-compose installed +.. code-block:: shell -1. Run docker image:: + docker-compose up -d - $ git clone https://edugit.org/AlekSIS/Official/AlekSIS - $ docker-compose up -d +AlekSIS will be reachable on port 8000. You are responsible for adding a +reverse proxy like nginx providing TLS, etc. .. _Dynaconf: https://dynaconf.readthedocs.io/en/latest/ +.. _Let's Encrypt: https://certbot.eff.org/instructions +.. _PyPI: https://pypi.org