Preskoči na sadržaj

Inženjering3 min čitanja

Jedan VPS za ceo sajt studija: Next.js, Go, PostgreSQL i Dokploy

Kako onlyapps.org radi na jednom serveru — Go API, red poslova u PostgreSQL-u, Next.js za sajt i konzolu, Dokploy za puštanje u rad — i četiri lekcije sa dana lansiranja.

Novi onlyapps.org — javni sajt, konzola u kojoj ga naš tim uređuje, API i svi pozadinski poslovi — radi na jednom VPS-u. Bez upravljanih baza, bez Redisa, bez spoljnog CI-ja. Evo kako je sve sklopljeno i šta smo naučili tokom puštanja u rad.

Delovi

DeoTehnologijaŠta radi
SajtNext.js 16Serverski renderovane stranice na engleskom, srpskom i ruskom
KonzolaNext.js 16Uređivanje, objavljivanje i podešavanja za tim
APIGo, chi, pgx, sqlcSva poslovna logika, autentifikacija, mediji
WorkerGo, RiverZakazano objavljivanje, e-pošta, IndexNow, osvežavanje keša
BazaPostgreSQL 18Podaci i red poslova
PlatformaDokploy, Traefik, Let's EncryptBuild, rutiranje i TLS na našem VPS-u

Jedna baza za podatke i poslove

Pozadinski poslovi žive u PostgreSQL-u preko River-a, Go reda poslova zasnovanog na Postgres-u. Najveća prednost su transakcije: kada urednik objavi post, izmena sadržaja i poslovi koje ona pokreće — osvežavanje keša sajta, obaveštenje IndexNow-u, e-pošta pretplatnicima — upisuju se u jednoj transakciji. Ili se desi sve, ili ništa, i nema drugog sistema koji treba održavati.

Sadržaj kao podaci, ne HTML

Postovi i dokumenti se čuvaju kao strukturirani JSON iz editora, a sajt ih renderuje komponentu po komponentu. HTML se ne čuva, pa nema šta da se čisti pri izlazu, a isti sadržaj se dosledno prikazuje na svakom jeziku.

Brze stranice bez CDN-a

Sajt koristi Next.js cache komponente. Stranice se služe iz keša i poništavaju po tagovima čim se nešto objavi — worker poziva sajt i ponovo se grade samo pogođene stranice. Mediji se čuvaju na Docker volumenu i služi ih Go API na sopstvenom poddomenu, a slike se pretvaraju u lakše WebP ili JPEG varijante. U našim test merenjima Lighthouse za mobilne daje rezultate u niskim 90-im za performanse i 100 za SEO.

Puštanje u rad sa Dokploy-em

Ceo stek je jedan Docker Compose fajl sa šest servisa: sajt, konzola, API, worker, PostgreSQL i kontejner za rezervne kopije koji svake noći pokreće pg_dump i čuva dve nedelje kopija. Dokploy povlači repozitorijum, gradi image-e na serveru i rutira domene kroz Traefik sa Let's Encrypt sertifikatima. Migracije baze se pokreću automatski pri startu API-ja.

Četiri stvari koje smo naučili na dan lansiranja

  1. Jedinstvena imena servisa na deljenoj mreži. Na serveru sa mnogo projekata Dokploy povezuje javne servise na jednu zajedničku Docker mrežu. Drugi projekti tamo su imali sopstvene servise api, web i postgres, pa je običan http://api:8080 mogao da stigne do pogrešnog kontejnera. Interne adrese sada koriste jedinstvene aliase poput onlyapps-api.
  2. Domene definišite na jednom mestu. Naš compose fajl je deklarisao Traefik rutere, a Dokploy je generisao sopstvene za iste hostove. Sve domene smo prebacili u Dokploy, a u compose fajlu ostavili samo middleware — bezbednosna zaglavlja i www preusmerenje — svaki na svom servisu.
  3. Velika otpremanja traže duži read timeout. Traefik v3 podrazumevano prekida telo zahteva posle 60 sekundi, što je prekidalo otpremanje videa na sporijim vezama. Povećanje read timeout-a na entrypoint-u je to rešilo.
  4. Lozinke unutar URL-ova. Lozinka baze generisana u base64 može da sadrži kosu crtu, što kvari postgres:// adresu za povezivanje. Heksadecimalne lozinke potpuno izbegavaju problem.

Savet

Pre prvog puštanja u rad proverite da li vaše tajne završavaju unutar URL-ova i, ako je tako, generišite ih u hex formatu.

Zašto sve držimo ovako jednostavnim

Sve se testira pre izlaska — svaka izmena prolazi lint, unit i integracione testove, produkcioni build i end-to-end testove sa proverama pristupačnosti. Rezultat je stek koji mali tim može u potpunosti da razume, preseli na drugi server za jedno veče i održava po ceni jednog VPS-a.

PodeliXLinkedIn

ONLYAPPS team

Novi Sad, Srbija · onlyapps.org

Kontakt

Kolačiće za analitiku koristimo samo uz vašu saglasnost. Neophodni kolačići održavaju rad sajta. Politika privatnosti