Deployment aplikacji Średnio zaawansowany 60 min

Aplikacja jako usługa systemd

Zbudujesz jednostkę systemd dla aplikacji webowej, ustawisz użytkownika, katalog roboczy, konfigurację środowiskową i polecenie Uvicorna oraz sprawdzisz uruchomienie i logi usługi.

Wróć do listy lekcji

1. Krótka teoria

Plik jednostki example-app.service opisuje, jak systemd ma zarządzać procesem aplikacji. Sekcja [Unit] zawiera opis i zależności kolejności uruchamiania. [Service] określa proces: User i Group ograniczają jego uprawnienia, WorkingDirectory ustawia katalog potrzebny do importu kodu, a EnvironmentFile wskazuje plik konfiguracji środowiskowej. ExecStart powinien używać bezpośredniej ścieżki do Uvicorna w venv i uruchamiać app.main:app na 127.0.0.1:8000. Restart=on-failure pozwala ponowić uruchomienie po nieoczekiwanym błędzie, ale nie naprawia złej konfiguracji. Sekcja [Install] z WantedBy=multi-user.target pozwala włączyć autostart. Po utworzeniu lub zmianie jednostki wykonuje się systemctl daemon-reload. Następnie można ją włączyć, uruchomić i kontrolować przez status oraz journalctl -u. Ta konfiguracja dotyczy aplikacji webowej; wcześniejsze ogólne zasady diagnostyki systemd nadal obowiązują.

2. Przykłady komend

/etc/systemd/system/example-app.service

Przykładowa jednostka uruchamiająca aplikację przez Uvicorn z venv.

[Unit]
Description=Example ASGI application
After=network.target

[Service]
User=example-app
Group=example-app
WorkingDirectory=/opt/example-app
EnvironmentFile=/opt/example-app/.env
ExecStart=/opt/example-app/venv/bin/uvicorn app.main:app --host 127.0.0.1 --port 8000
Restart=on-failure

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload

Wczytuje definicję nowej lub zmienionej jednostki.

$ sudo systemctl daemon-reload
sudo systemctl enable example-app.service

Włącza automatyczne uruchamianie aplikacji podczas startu systemu.

$ sudo systemctl enable example-app.service
sudo systemctl start example-app.service

Uruchamia usługę aplikacji w bieżącej sesji systemu.

$ sudo systemctl start example-app.service
sudo systemctl restart example-app.service

Restartuje usługę po świadomej zmianie kodu lub konfiguracji.

$ sudo systemctl restart example-app.service
systemctl status example-app.service

Pokazuje stan usługi, PID procesu i ostatnie komunikaty.

$ systemctl status example-app.service
journalctl -u example-app.service -n 50 --no-pager

Wyświetla 50 ostatnich wpisów dziennika aplikacji.

$ journalctl -u example-app.service -n 50 --no-pager

3. Zadanie praktyczne

W środowisku laboratoryjnym przygotuj plik example-app.service z trzema sekcjami. W [Service] ustaw User=example-app, Group=example-app, WorkingDirectory=/opt/example-app, EnvironmentFile=/opt/example-app/.env, ExecStart=/opt/example-app/venv/bin/uvicorn app.main:app --host 127.0.0.1 --port 8000 oraz Restart=on-failure. Dodaj WantedBy=multi-user.target, wykonaj daemon-reload, włącz i uruchom usługę. Sprawdź status, logi oraz lokalną odpowiedź przez curl. Użyj wyłącznie aplikacji laboratoryjnej.

4. Typowe błędy

  • Wskazanie globalnego Uvicorna zamiast programu z venv w ExecStart.
  • Ustawienie katalogu roboczego, z którego nie można zaimportować modułu aplikacji.
  • Uruchamianie usługi jako root mimo braku takiej potrzeby.
  • Pominięcie daemon-reload po zmianie pliku jednostki.
  • Założenie, że enable natychmiast uruchamia usługę.
  • Restartowanie usługi bez przeczytania statusu i logów po błędzie.
  • Nadanie użytkownikowi usługi braku dostępu do kodu lub pliku środowiskowego.

5. Podsumowanie

Jednostka systemd zamienia ręczne polecenie Uvicorna w zarządzaną usługę. Kluczowe pola to User, Group, WorkingDirectory, EnvironmentFile i ExecStart. Po zmianie jednostki trzeba wykonać daemon-reload, a autostart i bieżące uruchomienie kontroluje się oddzielnie. Stan procesu pokazuje systemctl status, a pełniejszą przyczynę problemu zwykle journalctl -u.

Flow nauki
  1. Teoria
  2. Przykład
  3. Ćwiczenie
  4. Quiz
  5. Praktyka
  6. Podsumowanie