webh.pl

Aplikacje Node.js, Python i Go na VPS

Jak wdrożyć aplikację Node.js, Python lub Go na serwerze VPS: środowisko uruchomieniowe, menedżer procesów, reverse proxy w Nginx, domena, SSL i firewall.

  • czytania
  • Zaktualizowano:
Strony i aplikacje Oprogramowanie na serwerze
Serwery VPS

Hosting współdzielony obsługuje głównie PHP, więc aplikacje w Node.js, Pythonie czy Go uruchamiasz na VPS, gdzie masz pełną kontrolę nad środowiskiem. Choć języki się różnią, schemat wdrożenia jest dla nich wspólny: Uruchamiasz aplikację na porcie lokalnym, pilnujesz, by działała bez przerw, i wystawiasz ją na świat przez serwer proxy z domeną i certyfikatem SSL. Ten poradnik prowadzi przez ten schemat krok po kroku.

Wspólny schemat wdrożenia

Niezależnie od języka wdrożenie składa się z czterech elementów:

  1. Środowisko uruchomieniowe języka (Node.js, Python lub Go) zainstalowane na serwerze.
  2. Aplikacja nasłuchująca na porcie lokalnym (np. 3000 lub 8000), dostępnym tylko na samym serwerze.
  3. Menedżer procesów, który utrzymuje aplikację przy życiu i uruchamia ją po restarcie serwera.
  4. Reverse proxy (Nginx), który przyjmuje ruch z internetu na portach 80 i 443 i przekazuje go do aplikacji, obsługując domenę i SSL.

Taki układ jest bezpieczny i wygodny: Aplikacja nie jest wystawiona wprost do internetu, a Nginx zajmuje się szyfrowaniem i kierowaniem ruchu.

Krok 1: Przygotuj serwer

Zacznij od podstawowego zabezpieczenia serwera (aktualizacje, użytkownik z sudo, firewall, SSH), które opisujemy w artykule o pierwszych krokach na VPS. Aplikację uruchamiaj na koncie zwykłego użytkownika, a nie na root.

Krok 2: Zainstaluj środowisko uruchomieniowe

Node.js

Najpewniej zainstalujesz aktualną wersję z oficjalnego repozytorium NodeSource:

curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
sudo apt install -y nodejs

W katalogu projektu zainstalujesz zależności poleceniem npm install.

Python

Python zwykle jest już w systemie. Zależności trzymaj w środowisku wirtualnym, żeby nie mieszać ich z systemowymi:

python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt

Aplikacje webowe w Pythonie uruchamiasz przez serwer WSGI lub ASGI (np. Gunicorn albo Uvicorn), który obsługuje ruch HTTP.

Go

W Go kompilujesz aplikację do pojedynczego pliku wykonywalnego, więc na serwerze nie potrzebujesz dodatkowego środowiska, jedynie kompilatora do zbudowania:

go build -o app

Powstały plik app uruchamiasz bezpośrednio, co czyni Go wyjątkowo prostym we wdrożeniu.

Krok 3: Uruchom aplikację na porcie lokalnym

Skonfiguruj aplikację tak, by nasłuchiwała na adresie 127.0.0.1 i wybranym porcie (np. 3000 dla Node, 8000 dla Pythona). Dzięki temu jest dostępna tylko lokalnie, a ruch z internetu poprowadzi dopiero Nginx.

Informacja

Nie wystawiaj portu aplikacji wprost do internetu. Publiczny dostęp ma zapewniać Nginx na portach 80 i 443, a aplikacja powinna odpowiadać wyłącznie lokalnie.

Krok 4: Utrzymaj aplikację przy życiu

Uruchomiona ręcznie aplikacja zatrzyma się po zamknięciu sesji SSH lub restarcie serwera. Menedżer procesów pilnuje, by działała stale i wstawała po restarcie.

systemd (uniwersalny)

systemd działa dla każdego języka. Utwórz plik usługi, np. /etc/systemd/system/moja-aplikacja.service:

[Unit]
Description=Moja aplikacja
After=network.target

[Service]
User=nazwa
WorkingDirectory=/home/nazwa/app
ExecStart=/usr/bin/node server.js
Restart=always

[Install]
WantedBy=multi-user.target

Dla Pythona w ExecStart wskaż serwer WSGI/ASGI, dla Go skompilowany plik. Następnie włącz usługę:

sudo systemctl enable --now moja-aplikacja

PM2 (popularny dla Node.js)

W projektach Node często wygodniejszy jest PM2, który zarządza aplikacjami Node i potrafi je restartować oraz uruchamiać po starcie systemu:

sudo npm install -g pm2
pm2 start server.js
pm2 startup
pm2 save

Krok 5: Postaw reverse proxy w Nginx

Nginx przyjmuje ruch z internetu i przekazuje go do aplikacji na porcie lokalnym. Instalację Nginx opisujemy w artykule o LEMP/LAMP, a pełną konfigurację reverse proxy (wiele domen, WebSockety, terminacja SSL) w artykule o Nginx jako reverse proxy. Najprostsza konfiguracja proxy dla domeny wygląda tak:

server {
    listen 80;
    server_name twojadomena.pl;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Podmień port 3000 na ten, na którym nasłuchuje Twoja aplikacja, a domenę na własną. Po zapisaniu konfiguracji przeładuj Nginx.

Krok 6: Domena, SSL i firewall

  1. Skieruj domenę na adres IP serwera rekordem A, jak opisujemy w artykule o rekordach DNS.
  2. Wystaw certyfikat SSL dla domeny Certbotem, zgodnie z poradnikiem o darmowym SSL na VPS. Certbot doda obsługę HTTPS wprost do konfiguracji Nginx.
  3. Skonfiguruj firewall tak, by z internetu dostępne były porty 80 i 443 oraz SSH (domyślnie port 22), a port samej aplikacji pozostał lokalny. Firewall opisujemy w artykule o firewallu na VPS.

Aktualizacje i zasoby

Wdrożenie nowej wersji aplikacji sprowadza się zwykle do trzech kroków: Pobrania zmian, zbudowania (jeśli język tego wymaga) i restartu usługi:

sudo systemctl restart moja-aplikacja

Aplikacje współdzielą zasoby serwera (CPU, pamięć). Gdy zaczyna ich brakować, zwiększysz je zgodnie z artykułem o zmianie zasobów VPS.

Alternatywa: Docker

Zamiast instalować środowisko bezpośrednio na serwerze, możesz uruchamiać aplikacje w kontenerach. Docker pakuje aplikację z jej zależnościami, co ułatwia powtarzalne wdrożenia, zwłaszcza gdy aplikacja składa się z kilku usług. Opisujemy go w artykule o Dockerze na VPS.

Najczęstsze pytania

Po co reverse proxy, skoro aplikacja sama obsługuje HTTP?

Nginx jako proxy daje wygodny punkt na obsługę SSL, wielu domen i ruchu na standardowych portach, a aplikację trzyma odizolowaną od internetu. To bezpieczniejsze i elastyczniejsze niż wystawianie aplikacji wprost na port publiczny.

systemd czy PM2?

systemd jest uniwersalny i działa dla każdego języka, więc to dobry domyślny wybór, zwłaszcza dla Pythona i Go. PM2 bywa wygodniejszy w projektach Node.js dzięki funkcjom dopasowanym do tego środowiska. Oba utrzymują aplikację przy życiu i uruchamiają ją po restarcie.

Dlaczego aplikacja ma nasłuchiwać tylko na 127.0.0.1?

Bo wtedy nie jest dostępna wprost z internetu, a cały ruch przechodzi przez Nginx, który obsługuje szyfrowanie i kierowanie. Wystawienie portu aplikacji publicznie omija tę warstwę i zwiększa ryzyko.

Czy mogę uruchomić kilka aplikacji na jednym VPS?

Tak. Każdą uruchom na innym porcie lokalnym i dodaj dla niej osobną konfigurację Nginx z własną domeną. Pamiętaj tylko, że wszystkie dzielą zasoby tego samego serwera.