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
| Deo | Tehnologija | Šta radi |
|---|---|---|
| Sajt | Next.js 16 | Serverski renderovane stranice na engleskom, srpskom i ruskom |
| Konzola | Next.js 16 | Uređivanje, objavljivanje i podešavanja za tim |
| API | Go, chi, pgx, sqlc | Sva poslovna logika, autentifikacija, mediji |
| Worker | Go, River | Zakazano objavljivanje, e-pošta, IndexNow, osvežavanje keša |
| Baza | PostgreSQL 18 | Podaci i red poslova |
| Platforma | Dokploy, Traefik, Let's Encrypt | Build, 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
- 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,webipostgres, pa je običanhttp://api:8080mogao da stigne do pogrešnog kontejnera. Interne adrese sada koriste jedinstvene aliase poputonlyapps-api. - 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.
- 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.
- 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.