Oddziel kod od uprawnień administratora
Długotrwała aplikacja powinna działać na osobnym koncie systemowym. Przygotuj katalog projektu, wirtualne środowisko i plik startowy. Najpierw uruchom program ręcznie jako docelowy użytkownik, używając tego samego interpretera, który później trafi do usługi. Błędu importu nie naprawi automatyczny restart.
Zapisz jednostkę
Przykład dotyczy projektu w /opt/moj-bot oraz istniejącego użytkownika botapp. Utwórz plik /etc/systemd/system/moj-bot.service i dopasuj ścieżki.
[Unit]
Description=Moj bot Python
After=network.target
[Service]
Type=simple
User=botapp
WorkingDirectory=/opt/moj-bot
ExecStart=/opt/moj-bot/venv/bin/python -u main.py
Restart=on-failure
RestartSec=5
NoNewPrivileges=true
PrivateTmp=true
[Install]
WantedBy=multi-user.targetnetwork.target nie obiecuje dostępu do Internetu. Program powinien obsługiwać utratę połączenia i ponawiać je z opóźnieniem. Opcja -u ułatwia bieżący odczyt wyjścia Pythona w journalu.
Uruchom i sprawdź
sudo systemctl daemon-reload
sudo systemctl enable --now moj-bot.service
systemctl status moj-bot.service
journalctl -u moj-bot.service -n 50 --no-pagerStatus „active” oznacza uruchomiony proces, a nie potwierdzenie działania każdej funkcji. Osobno wykonaj test połączenia z usługą zewnętrzną i sprawdź odpowiedź programu. Przy awarii odczytaj pierwszy błąd w logu, zanim zwiększysz limity restartów.
Sekrety i aktualizacje
Nie wpisuj tokenu w ExecStart ani do repozytorium. Sposób przekazania sekretu dopasuj do wersji systemd i aplikacji; plik konfiguracyjny musi mieć ograniczone uprawnienia. Aktualizację testuj w osobnym środowisku, a po wdrożeniu zachowaj poprzednią wersję kodu i zestaw zależności. Usługa nie zastępuje kopii bazy danych ani monitoringu.
Źródła i dokumentacja
Odnośniki do źródeł pozwalają sprawdzić daty, dostępność oraz pełny kontekst informacji.