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:
- Środowisko uruchomieniowe języka (Node.js, Python lub Go) zainstalowane na serwerze.
- Aplikacja nasłuchująca na porcie lokalnym (np. 3000 lub 8000), dostępnym tylko na samym serwerze.
- Menedżer procesów, który utrzymuje aplikację przy życiu i uruchamia ją po restarcie serwera.
- 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
- Skieruj domenę na adres IP serwera rekordem A, jak opisujemy w artykule o rekordach DNS.
- Wystaw certyfikat SSL dla domeny Certbotem, zgodnie z poradnikiem o darmowym SSL na VPS. Certbot doda obsługę HTTPS wprost do konfiguracji Nginx.
- 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.