Installation und Einrichtung eines eigenen Python-Paketservers

In einem vorangegangenen Beitrag bin ich bereits auf die Möglichkeit eingegangen, einen Spiegelserver für Rapsberry PIs zu installieren, der als lokale Ablage für Updates der ARM basierten Mini-Computer dient. Nun folgt die Möglichkeit, einen eigenen Spiegelserver für Python PIP-Pakete aufzusetzen und zu betreiben.

Vorbereitung des PYPI-Servers

Das Produkt unserer Wahl nennt sich pypiserver und wird über den PIP-Paketmanager installiert. Bevor wir diesen installieren können, benötigen wir zunächst den Paketmanager selbst:

sudo apt install python3-pip

Nun lässt sich der pypiserver installieren:

pip3 install pypiserver

Als nächstes benötigen wir noch einen Webserver der uns unsere Python Pakete zur Verfügung stellt und abrufbar macht. Hierfür eignet sich beispielsweise der schlanke lighttpd:

sudo apt install lighttpd

Nach erfolgter Installation starten wir diesen nun noch:

sudo /etc/init.d/lighttpd start

Damit hätten wir auch bereits alle notwendigen Pakete und Dienste für unseren Server installiert und in Betrieb genommen. Das Standard root-Verzeichnis des lighttpd befindet sich unter /var/www/html/. Innerhalb dieses Ordners lassen sich (der besseren Strukturierung wegen) optional auch weitere Unterordner erstellen.

sudo mkdir -p /var/www/html/python-packages/

Theoretisch könnten wir den Server nun mit dem Befehl …

pypi-server -p 8080 /var/www/html/python-packages/

… auf Port 8080 starten, jedoch würde uns das die aktuelle Shell-Sitzung wegnehmen und uns an weiteren Eingaben hindern. Außerdem haben wir ja noch keinerlei Python-Pakete zur Verfügung gestellt die man sich installieren könnte. Diese lassen sich beispielsweise von https://pypi.org/ beziehen. Dort finden sich die gewünschten Pakete im .tar.gz-Format zum herunterladen. Nachdem die Auswahl getroffen und die jeweiligen Pakete heruntergeladen wurden, werden diese (im .tar.gz-Format) in das Verzeichnis /var/www/html/python-packages/ abgelegt. Bedenkt jedoch, dass viele Pakete Abhängigkeiten zueinander haben. Sind diese nicht vorhanden bzw. können nicht aufgelöst werden, wird die Installation hinterher leider fehlschlagen. Auch benötigen einige Pakete als Abhängigkeit bestimmte Versionen anderer Pakete, was die Sache noch ein wenig komplizierter gestaltet. Sorgt also dafür, dass, neben dem eigentlich zu installierendem Python-Paket, auch die jeweiligen Abhängigkeiten vorhanden sind. Unter Umständen, wird das Repository somit recht umfangreich.
Nichtsdestotrotz, nachdem die Pakete an Ort und Stelle platziert wurden, könnten wir nun endlich den Server starten. Allerdings möchte ich an dieser Stelle zuvor ein kleines Skript vorstellen, welches für uns alternativ ebendiese Aufgabe übernehmen kann und (sofern der entsprechende Cronjob eingerichtet ist) darüber hinaus noch Autostart geeignet ist:

### Erstellung von start_pypiserver.sh
sudo nano /usr/share/start_pypiserver.sh

### Inhalt der start_pypiserver.sh
pypiserver_pid=$(ps aux | grep -i pypi-server | head -1 | awk '{print $2}')
kill -9 $pypiserver_pid

pypi-server -p 8080 /var/www/html/python-packages/ &

Anschließend wird es noch ausführbar gemacht:

sudo chmod +x /usr/share/start_pypiserver.sh

Dieses Skript schaut zunächst nach einer bereits gestarteten PYPI-Server Anwendung, beendet diese anhand der PID (sofern vorhanden) und startet im Anschluss eine neue Sitzung. Das Skript funktioniert für sich genommen völlig autark und kann ohne weiteres ausgeführt werden.
Damit der PYPI-Server jedoch auch bei jedem Systemstart automatisch hochfährt, muss zusätzlich noch ein Cronjob erstellt werden:

### Wir starten den Editor für Cronjobs
crontab -e

### und ergänzen die folgende Zeile
@reboot /usr/share/start_pypiserver.sh

Wie bereits erwähnt wird der Server nun entweder mit dem Skript…

/usr/share/start_pypiserver.sh

… oder der klassischen Methode …

pypi-server -p 8080 /var/www/html/python-packages/

… gestartet.

Vorbereitung des Clients

Damit wäre Serverseitig alles eingerichtet. Kümmern wir uns nun um den Client der die, auf dem Server befindlichen, Pakete beziehen möchte. Das sollte im Idealfall eine andere Maschine sein, die sich innerhalb desselben Netzes befindet, bzw. die den Server problemlos erreichen kann.
Auch hier wird der Python PIP-Paketmanager benötigt:

sudo apt install python3-pip

Nun haben wir zwei Möglichkeiten unsere Python-Pakete mit Hilfe des neu aufgesetzten PYPI-Servers zu installieren. Entweder geben wir den Server direkt mit dem Installationsbefehl mit …

pip3 install --index-url http://192.168.172.5:8080/simple/ --trusted-host 192.168.172.5 wheel -v

(bedenkt, dass die IP-Adresse entsprechend der IP-Adresse eures Server geändert werden muss)
… oder wir definieren den PYPI-Server in einer Konfigurationsdatei, sodass dieser standardmäßig bei jedem pip3 install-Kommando verwendet wird:

### Die pip.conf öffnen bzw. erstellen
sudo nano /etc/pip.conf

### und mit folgendem Inhalt befüllen
[global]
index-url = http://192.168.172.5:8080/simple/

[install]
trusted-host = 192.168.172.5

Anschließend genügt ein einfaches …

sudo pip3 install wheel

… um Python-Pakete von diesem Server zu installieren.

Fazit

Einen eigenen Python-Spiegelserver aufzusetzen ist schnell erledigt und einfach zu administrieren. Das große Manko besteht jedoch in der Abhängigkeit der Pakete zueinander, die sehr umfangreich ausfallen können und in vielen Fällen eine bestimmte Paketversion voraussetzen.

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Nach oben scrollen