🚀 #19 Gdzie wydać swoją aplikację?

Dzisiaj będzie monotematycznie, bo tylko o wydawaniu aplikacji. Nie będzie tutoriali, ale wskazówki czego możesz użyć. Tylko kilka opcji, bo jest ich za dużo i sam ograniczam się do 3 opisanych opcji.

Jednak zanim zaczniesz czytać, chciałbym Cię prosić o odpowiedź w krótkie ankiecie.


Heroku 💲

Heroku pozwala na szybki deploy aplikacji - zakres technologii jest spory, poza oficjalnie wspieranymi językami, możesz uruchomić cokolwiek co zadziała na Linuxie z Heroku.

Jeśli to czytasz to pewnie interesują Cię aplikacje frontowe. Tutaj Heroku wymaga "trochę" więcej konfiguracji - musisz stworzyć bardzo prosty serwer express.

Konfiguracja automatycznego wydawania aplikacji na Heroku sprowadza się do połączenia repozytorium git, dodania prostej konfiguracji dla nginx i aplikacji node.js.

const express = require('express');
const path = require('path');

const app = express();


app.use(express.static(__dirname + '/dist/APP_NAME'));

app.get('/*', function(req,res) {
 
res.sendFile(path.join(__dirname+'/dist/APP_NAME/index.html'));
});

app.listen(process.env.PORT || 8080);

I to wszystko. Jeśli chodzi o koszta to musisz sprawdzić. Ostatni raz korzystałem z Heroku gdy posiadało jeszcze darmowy plan.

Vercel

Kolejna chmurowa usługa, tym razem darmowa. Jeśli nie masz chęci na jakąkolwiek zabawę z konfiguracją to Vercel udostępnia gotowe szablony - znajdziesz każdy popularny framework frontowy i nie tylko:

Find your Template – Vercel
Jumpstart your app development process with our pre-built solutions.

Jeśli masz już aplikację to wystarczy zainstalować CLI i Vercel sam wykryje framework i skonfiguruje deploy. Tak można żyć :D

Dodatkowymi plusami są:
- redis
- Postgres
- (wkrótce) storage.

Vercel, podobnie jak Heroku, umożliwia nie tylko deploy frontowych aplikacji, ale również Node.js. W przypadku Node.js wymaga od nas trochę więcej konfiguracji, np. dla apki Nest.js potrzeba stworzyć plik vercel.json z konfiguracją:

{
  "version": 2,
  "builds": [
    {
      "src": "src/main.ts",
      "use": "@vercel/node"
    }
  ],
  "routes": [
    {
      "src": "/(.*)",
      "dest": "src/main.ts",
      "methods": ["GET", "POST", "PUT", "DELETE"]
    }
  ],
  "buildCommand": "npm run build",
  "outputDirectory": "dist"
}

Współdzielony serwer 💲

Kiedyś najprostsze rozwiązanie. Logujesz się po FTP, wrzucasz pliki i gotowe. Dodatkowo masz do dyspozycji DirectAdmin/CPanel lub jakiś inny panel i 99% rzeczy sobie wyklikasz - od skonfigurowania domeny po maila. Oczywiście nie musisz tego robić ręcznie (ale kto tego nie robił?), bardzo łatwo skonfigurować automatyczne budowanie aplikacji i wrzucanie plików na serwer przez narzędzia CI/CD - Github Actions, Gitlab CI, Jenkins i pewnie masę innych.

Jeszcze do niedawna sam korzystałem z tego rozwiązania - aplikacja była budowana przez jedno z zadań w CI i następne wrzucana na serwer. Działało, było bezobsługowe, ale... są lepsze metody.

VPS 💲

Opcja dla najbardziej wytrwałych. Dostajesz serwer z systemem operacyjnym i hulaj dusza. Sam musisz zainstalować wymagane oprogramowanie - serwer http (nginx/apache), bazę danych, mail itp. Jednak nie taki diabeł straszny i po kilku nieudanych próbach (na pewno takie będą), później będzie łatwiej.
W sieci znajdziesz wiele poradników (sam też na nich bazuję, nie posiadam dużej wiedzy w tym temacie), dla różnych aplikacji (PHP, Node.js, statyczny html).

IMO każdy deweloper powinien choć raz spróbować postawić aplikację na VPS.
Z tanich rozwiązań (i dobrych) polecam https://mikr.us/.

Poza tym na VPS możesz postawić cokolwiek tylko chcesz np. prywatna instancja Gitlaba, Sentry, n8n - wszystko jest tylko kwestią konfiguracji. I dla zastosować hobbystycznych jest to jedno z najtańszych rozwiązań (poza poświęconym czasem) - w moim przypadku Ghost na VPS kosztuje 75 zł rocznie, a w chmurze - 108$.

GCP/AWS 💲

Opcje, o której najmniej mogę napisać, ale muszę o nich wspomnieć.
Chociaż obecnie korzystam(y) z cloudrun przy deployu aplikacji frontowych. Dla aplikacji frontowych (Angular i React) schemat jest bardzo prosty - buduję obraz dockerowy (nie ja, sam się robi po uruchomieniu odpowiedniego joba w Gitlabie), który następnie jest uruchamiany w GCP.