Narzędzia użytkownika

Narzędzia witryny


wiki:python_systemd

Pliki service dla aplikacji Pythonowych zainstalowanych przez pip w virtualenvie, na przykładzie aplikacji Airflow, opartej na Flask.

Virtualenv został utworzony w katalogu /data/airflow/app. Airflow ma prawa zapisu do katalogu /data/airflow/app/airflow_home, gdzie ma swój katalog roboczy.

mkdir -p /data/airflow/app/airflow_home
cd /data/airflow/app
python3 -m venv .
source bin/activate
pip install apache-airflow
pip freeze
export AIRFLOW_HOME=/data/www/airflow/app/airflow_home
airflow initdb

Użytkownik airflow potrzebuje:

  • odczytywać katalog /data/www/airflow/app/*
  • zapisywać w katalogu /data/www/airflow/app/airflow_home/*,
  • uruchamiać pliki z /data/www/airflow/app/bin/*, z wyjątkiem plików pip*, które można zresztą usunąć.

/etc/systemd/system/airflow-webserver.service

[Unit]
Description=Airflow Webserver


[Service]

# Aplikacja dziala na uzytkowniku airflow.
User=airflow

# Przekierowanie komunikatow aplikacji bezposrednio do journald.
Environment=PYTHONUNBUFFERED=1

# Ustawienie pythonowego virtualenv.
Environment=VIRTUALENV=/data/airflow/app
Environment=PYTHONPATH=$VIRTUALENV/lib:$PYTHONPATH

# PATH nie rozumie zmiennych, wiec trzeba podac pelne sciezki.
Environment=PATH=/data/airflow/app/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

# Roboczy katalog airflow.
Environment=AIRFLOW_HOME=$VIRTUALENV/airflow_home

# To musi byc pelna sciezka, bez uzywania zmiennych.
WorkingDirectory=/data/airflow/app/bin

# Start aplikacji (musi zawierac pelna sciezke).
ExecStart=/data/airflow/app/bin/airflow webserver --host 0.0.0.0 --port 8899

# Automatyczny restart aplikacji po awarii z opoznieniem 10 sekund,
# aby uniknac obciazenia CPU w razie nieudanych uruchomien.
Restart=always
RestartSec=10

# Powiadomienie systemd o uruchomieniu aplkacji.
Type=simple

# Plik z numerem ID procesu.
PIDFile=$AIRFLOW_HOME/airflow-webserver.pid

[Install]

# Autostart aplikacji.
WantedBy=default.target
After=netfork.target

/etc/systemd/system/airflow-scheduler.service

[Unit]
Description=Airflow Scheduler


[Service]

# Aplikacja dziala na uzytkowniku airflow.
User=airflow

# Przekierowanie komunikatow aplikacji bezposrednio do journald.
Environment=PYTHONUNBUFFERED=1

# Ustawienie pythonowego virtualenv.
Environment=VIRTUALENV=/data/airflow/app
Environment=PYTHONPATH=$VIRTUALENV/lib:$PYTHONPATH

# PATH nie rozumie zmiennych, wiec trzeba podac pelne sciezki.
Environment=PATH=/data/airflow/app/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

# Roboczy katalog airflow.
Environment=AIRFLOW_HOME=$VIRTUALENV/airflow_home

# To musi byc pelna sciezka, bez uzywania zmiennych.
WorkingDirectory=/data/airflow/app/bin

# Start aplikacji (musi zawierac pelna sciezke).
ExecStart=/data/airflow/app/bin/airflow scheduler

# Automatyczny restart aplikacji po awarii z opoznieniem 10 sekund,
# aby uniknac obciazenia CPU w razie nieudanych uruchomien.
Restart=always
RestartSec=10

# Powiadomienie systemd o uruchomieniu aplkacji.
Type=simple

[Install]

# Autostart aplikacji.
WantedBy=default.target
After=netfork.target, airflow-webserver.service
Wants=airflow-webserver.service 
wiki/python_systemd.txt · ostatnio zmienione: 2020/03/03 17:52 przez lukasz