diff --git a/content/hr/admin-processes.md b/content/hr/admin-processes.md new file mode 100644 index 000000000..e1b9a5bc2 --- /dev/null +++ b/content/hr/admin-processes.md @@ -0,0 +1,14 @@ +## XII. Administrativni procesi +### Pokrenite administrativne/upravljačke zadatke kao jednokratne procese + +[Formacija procesa](./concurrency) je niz procesa koji se koriste za obavljanje redovnog poslovanja aplikacije (kao što je rukovanje web zahtjevima) dok se ona izvodi. Osim toga, razvijatelji će često htjeti obaviti jednokratne administrativne zadatke ili zadatke održavanja za aplikaciju, kao što su: + +* Pokretanje migracija baze podataka (npr. `manage.py migrate` u Djangu, `rake db:migrate` u Railsu). +* Pokretanje konzole (također poznata kao ljuska [REPL](https://en.wikipedia.org/wiki/Read-eval-print_loop)) za pokretanje proizvoljnog kôda ili pregled modela aplikacije u odnosu na aktivnu bazu podataka. Većina jezika pruža REPL pokretanjem tumača bez ikakvih argumenata (npr. `python` ili `perl`) ili u nekim slučajevima imaju zasebnu naredbu (npr. `irb` za Ruby, `rails console` za Rails). +* Pokretanje jednokratnih skripti predanih u repozitorij aplikacije (npr. `php scripts/fix_bad_records.php`). + +Jednokratni administrativni procesi trebali bi se izvoditi u identičnom okruženju kao i redoviti [dugotrajni procesi](./processes) aplikacije. Pokreću se u odnosu na [izdanje](./build-release-run), koristeći istu [bazu izvornog kôda](./codebase) i [konfiguraciju](./config) kao i bilo koji proces koji se pokreće u odnosu na to izdanje. Administrativni kôd mora biti isporučen s kôdom aplikacije kako bi se izbjegli problemi sa sinkronizacijom. + +Iste tehnike [izolacije zavisnosti](./dependencies) trebale bi se koristiti na svim vrstama procesa. Na primjer, ako Ruby web proces koristi naredbu `bundle exec thin start`, tada bi migracija baze podataka trebala koristiti `bundle exec rake db:migrate`. Isto tako, Python program koji koristi Virtualenv trebao bi koristiti isporučeni `bin/python` za pokretanje i web poslužitelja Tornado i svih `manage.py`-evih administrativnih procesa. + +Metodologija dvanaest faktora snažno daje prednost jezicima koji pružaju ljusku REPL od početka korištenja i koji olakšavaju pokretanje jednokratnih skripti. U lokalnoj implementaciji, razvijatelji pozivaju jednokratne administrativne procese izravnom naredbom ljuske unutar direktorija za naplatu aplikacije. U produkcijskoj implementaciji, razvijatelji mogu koristiti ssh ili drugi mehanizam za daljinsko izvršavanje naredbi kojeg nudi izvršna okolina te implementacije za pokretanje takvog procesa. diff --git a/content/hr/background.md b/content/hr/background.md new file mode 100644 index 000000000..6d1613e59 --- /dev/null +++ b/content/hr/background.md @@ -0,0 +1,8 @@ +Pozadina +======== + +Suradnici u izradi ovog dokumenta bili su izravno uključeni u razvoj i implementaciju stotina aplikacija te su neizravno svjedočili razvoju, radu i skaliranju stotina tisuća aplikacija putem našeg rada na platformi [Heroku](https://www.heroku.com/). + +Ovaj dokument sintetizira sva naša iskustva i zapažanja o širokom spektru aplikacija softvera kao usluge u divljini (u stvarnom svijetu, op. prev.). To je triangulacija o idealnim praksama za razvoj aplikacija, obraćajući posebnu pozornost na dinamiku organskog rasta aplikacije tijekom vremena, dinamiku suradnje između razvijatelja koji rade na bazi kôda aplikacije i [izbjegavanju troškova erozije softvera](https://blog.heroku.com/the_new_heroku_4_erosion_resistance_explicit_contracts). + +Naša motivacija je podići svijest o nekim sustavnim problemima koje smo vidjeli u modernom razvoju aplikacija, pružiti zajednički rječnik za raspravu o tim problemima i ponuditi skup širokih konceptualnih rješenja za te probleme s pratećom terminologijom. Format je inspiriran knjigama Martina Fowlera *[Uzorci arhitekture poslovne aplikacije](https://books.google.com/books?id=FyWZt5DdvFkC)* i *[Refactoring](https://books.google.com/books?id=1MsETFPD3I0C)*. diff --git a/content/hr/backing-services.md b/content/hr/backing-services.md new file mode 100644 index 000000000..df3b0b761 --- /dev/null +++ b/content/hr/backing-services.md @@ -0,0 +1,14 @@ +## IV. Potporne usluge +### Tretirajte potporne usluge kao priložene resurse + +*Potporna usluga* je svaka usluga koju aplikacija koristi putem mreže kao dio svog normalnog rada. Primjeri uključuju spremišta podataka (kao što je [MariaDB](https://mariadb.org/) ili [CouchDB](https://couchdb.apache.org/)), sustave za slanje poruka/upravljanje redovima čekanja (kao što je [RabbitMQ](https://www.rabbitmq.com/) ili [Beanstalkd](https://beanstalkd.github.io/)), SMTP usluge za odlaznu e-poštu (kao što je [Postfix](https://www.postfix.org/)) i sustavi za predmemoriju (kao što je [Memcached](https://memcached.org/)). + +Potpornim uslugama poput baze podataka tradicionalno upravljaju isti administratori sustava koji implementiraju aplikaciju u izvršnom okruženju. Osim ovih usluga kojima se upravlja lokalno, aplikacija također može imati usluge koje pružaju i kojima upravljaju treće strane. Primjeri uključuju SMTP usluge (kao što je [Postmark](https://postmarkapp.com/)), usluge prikupljanja metrike (kao što je [New Relic](https://newrelic.com/) ili [Loggly](https://www.loggly.com/)), usluge pohrane binarne imovine (kao što je [Amazon S3](https://aws.amazon.com/s3/)), pa čak i korisničke usluge dostupne putem API-ja (kao što je [Twitter](https://developer.twitter.com/), [Google karte](https://developers.google.com/maps/) ili [Last.fm](https://www.last.fm/api)). + +**Kôd za dvanestofaktorsku aplikaciju ne pravi razliku između lokalnih usluga i usluga treće strane.** Aplikaciji su obje vrste priloženi resursi, kojima se pristupa putem URL-a ili drugog lokatora/vjerodajnica pohranjenih u [konfiguraciji](./config). [Implementacija](./codebase) dvanaestofaktorske aplikacije trebala bi moći zamijeniti lokalnu MariaDB bazu podataka onom kojom upravlja treća strana (kao što je [Amazon RDS](https://aws.amazon.com/rds/)) bez ikakvih promjena kôda aplikacije. Isto tako, lokalni SMTP poslužitelj mogao bi se zamijeniti SMTP uslugom treće strane (kao što je Postmark) bez promjene kôda. U oba slučaja potrebno je promijeniti samo dršku resursa u konfiguraciji. + +Svaka posebna potporna usluga je *resurs*. Na primjer, MariaDB baza podataka je resurs; dvije MariaDB baze podataka (koriste se za usitnjavanje na aplikacijskom sloju) karakteriziraju se kao dva različita resursa. Dvanaestofaktorska aplikacija tretira te baze podataka kao *priložene resurse*, što ukazuje na njihovu labavu povezanost s implementacijom na koju su pripojene. + +![Produkcijska implementacija povezana s četiri potporne usluge.](/images/attached-resources.png) + +Resursi se mogu po volji priključiti i odvojiti od implementacija. Na primjer, ako se baza podataka aplikacije loše ponaša zbog hardverskog problema, administrator aplikacije može pokrenuti novi poslužitelj baze podataka vraćen iz nedavne sigurnosne kopije. Trenutna produkcijska baza podataka mogla bi se odvojiti, a nova priključiti -- sve bez ikakvih promjena kôda. diff --git a/content/hr/build-release-run.md b/content/hr/build-release-run.md new file mode 100644 index 000000000..8b99f359b --- /dev/null +++ b/content/hr/build-release-run.md @@ -0,0 +1,18 @@ +## V. Izgradnja, izdavanje, pokretanje +### Strogo razdvojite stadije izgradnje i pokretanja + +[Baza izvornog kôda](./codebase) pretvara se u (nerazvojnu) implementaciju kroz tri stadija: + +* *Stadiij izgradnje* je transformacija koja pretvara repo kôda u izvršni paket poznat kao *izgradnja*. Koristeći verziju kôda na commitu navedenom u procesu implementacije, stadij izgradnje dohvaća od dobavljača [zavisnosti](./dependencies) i stvara binarne datoteke i imovinu. +* *Stadij izdavanja* uzima izgradnju proizvedenu stadijem izgradnje i spaja je s trenutnom [konfiguracijom](./config) implementacije. Rezultirajuće *izdanje* sadrži i izgradnju i konfiguraciju te je spremno za trenutno izvršavanje u izvršnom okruženju. +* *Stadij pokretanja* (također poznata kao "runtime") pokreće aplikaciju u izvršnom okruženju, pokretanjem nekog skupa [procesa](./processes) aplikacije prema odabranom izdanju. + +![Kôd postaje izgradnja koja se kombinira s konfiguracijom za stvaranje izdanja.](/images/release.png) + +**Dvanaestofaktorska aplikacija koristi strogo razdvajanje između stadija izgradnje, izdavanja i pokretanja.** Na primjer, nemoguće je unijeti promjene u kôd tijekom izvođenja jer ne postoji način da se te promjene prenesu natrag u stadij izgradnje. + +Alati za implementaciju obično nude alate za upravljanje izdanjima, posebice mogućnost vraćanja na prethodno izdanje. Na primjer, alat za implementaciju [Capistrano](https://capistranorb.com/) pohranjuje izdanja u poddirektorij pod nazivom `releases`, gdje je trenutno izdanje simbolička poveznica na trenutni direktorij izdanja. Njegova naredba `rollback` olakšava brzi povratak na prethodno izdanje. + +Svako izdanje uvijek treba imati jedinstveni identifikator izdanja, kao što je vremenska oznaka izdanja (kao što je `2011-04-06-20:32:17`) ili rastući broj (kao što je `v100`). Skup izdanja je namijenjen samo za dodavanje i izdanje se ne može mijenjati nakon što je stvoreno. Svaka promjena mora stvoriti novo izdanje. + +Izgradnje pokreću razvijatelji aplikacije svaki put kad se implementira novi kôd. Za razliku od toga, pokretanje može se dogoditi automatski tijekom izvršavanja u slučajevima kao što je ponovno pokretanje poslužitelja ili srušeni proces kojeg ponovno pokreće upravitelj procesa. Stoga bi se stadij izvršavanja trebao zadržati na što manje pokretnih dijelova, budući da problemi koji sprječavaju pokretanje aplikacije mogu uzrokovati da se pokvari usred noći kada nema razvijatelja. Stadij izgradnje može biti složeniji, budući da su pogreške uvijek u prvom planu za razvijatelja koji pokreće implementaciju. diff --git a/content/hr/codebase.md b/content/hr/codebase.md new file mode 100644 index 000000000..eb0858ab9 --- /dev/null +++ b/content/hr/codebase.md @@ -0,0 +1,17 @@ +## I. Baza izvornog kôda +### Jedna baza izvornog kôda praćena u upravljanju revizijama, mnogo implementacija + +Dvanaestofaktorska aplikacija uvijek se prati u sustavu upravljanja verzija, kao što je [Git](https://git-scm.com/), [Mercurial](https://www.mercurial-scm.org/), ili [Subversion](https://subversion.apache.org/). Kopija baze podataka za praćenje revizija poznata je kao *spremište kôda*, često skraćeno na *repo kôda* ili samo *repo*. + +*Baza izvornog kôda* je bilo koji pojedinačni repo (u centraliziranom sustavu upravljanja revizija kao što je Subversion), ili bilo koji skup repoa koji dijele korijenski commit (u decentraliziranom sustavu upravljanja revizija kao što je Git). + +![Jedna baza izvornog kôda preslikava se na mnoge implementacije.](/images/codebase-deploys.png) + +Uvijek postoji korelacija jedan na jedan između baze izvornog kôda i aplikacije: + +* Ako postoji više baza izvornog kôda, to nije aplikacija -- to je distribuirani sustav. Svaka komponenta u distribuiranom sustavu je aplikacija i svaka se pojedinačno može uskladiti s metodologijom dvanaest faktora. +* Više aplikacija koje dijele isti kôd predstavlja kršenje metodologije dvanaest faktora. Rješenje je ovdje ugraditi zajednički kôd u knjižnice koje se mogu uključiti putem [upravitelja zavisnosti](./dependencies). + +Postoji samo jedna baza izvornog kôda po aplikaciji, ali bit će mnogo implementacija aplikacije. *Implementacija* je pokrenuta instanca aplikacije. Ona je tipično produkcijsko sjedište i jedno ili više probnih sjedišta. Osim toga, svaki razvijatelj ima kopiju aplikacije koja se izvodi u svom lokalnom razvojnom okruženju, a svaka takva se također karakterizira kao implementacija. + +Baza izvornog kôda je ista za sve implementacije, iako različite verzije mogu biti aktivne u svakoj implementaciji. Na primjer, razvijatelj ima neke commitove koje još nisu implementirani u uprizorenje; probno sjedište ima neke commitove koji još nisu implemetnirani u produkciju. Ali svi dijele istu bazu izvornog kôda, što ih čini prepoznatljivim kao različite implementacije iste aplikacije. diff --git a/content/hr/concurrency.md b/content/hr/concurrency.md new file mode 100644 index 000000000..ce52c4e7d --- /dev/null +++ b/content/hr/concurrency.md @@ -0,0 +1,14 @@ +## VIII. Konkurentnost +### Skalirajte prema van putem modela procesa + +Svaki računalni program, jednom pokrenut, predstavljan je od strane jednog ili više procesa. Web aplikacije su imale različite oblike izvršenja procesa. Na primjer, PHP procesi se pokreću kao podređeni procesi Apachea, pokrenuti na zahtjev prema potrebi volumena zahtjeva. Java procesi imaju suprotan pristup, s JVM-om koji pruža jedan masivni uberproces koji rezervira veliki blok sustavskih resursa (CPU i memorija) pri pokretanju, s konkurentnošću kojom se interno upravlja putem niti. U oba slučaja, pokrenuti proces(i) samo su minimalno vidljivi razvijateljima aplikacije. + +![Skala se izražava kao broj pokrenutih procesa, raznolikost radnog opterećenja se izražava kao vrste procesa.](/images/process-types.png) + +**U dvanaestofaktorskoj aplikaciji procesi su "građani prve klase".** Procesi u dvanaestofaktorskoj aplikaciji uzimaju snažne znakove iz [Unixovog modela procesa za pokretanje uslužnih daemona](https://adam.herokuapp.com/past/2011/5/9/applying_the_unix_process_model_to_web_apps/). Koristeći ovaj model, razvijatelj može projektirati svoju aplikaciju za rukovanje različitim radnim opterećenjima dodjeljivanjem svake vrste posla *vrsti procesa*. Na primjer, HTTP zahtjevima može rukovati web proces, a dugotrajnim pozadinskim zadacima upravlja proces radnika. + +To ne isključuje pojedinačne procese iz rukovanja vlastitim internim multipleksiranjem, putem niti unutar VM-a u vremenu izvođenja, ili asinkronog/događajnog modela koji se nalazi u alatima kao što su [EventMachine](https://github.com/eventmachine/eventmachine), [Twisted](https://twistedmatrix.com/trac/) ili [Node.js](https://nodejs.org/). No, pojedinačni VM može narasti samo tako velik (u uspravnoj skali), tako da aplikacija također mora moći obuhvatiti više procesa koji se pokreću na više fizičkih strojeva. + +Procesni model uistinu zablista kada dođe vrijeme za skaliranje prema van. [Ne-dijeli-ništa, horizontalno particiona priroda procesa dvanaestofaktorske aplikacije](./processes) znači da je dodavanje više konkurentnosti jednostavna i pouzdana operacija. Niz tipova procesa i broj procesa svake vrste poznat je kao *formacija procesa*. + +Procesi dvanaestofaktorske aplikacije [nikada se ne bi trebali daemonizirati](https://dustin.sallings.org/2010/02/28/running-processes.html) ili pisati PID datoteke. Umjesto toga, oslanjaju se na upravitelja procesa operacijskog sustava (kao što je [systemd](https://www.freedesktop.org/wiki/Software/systemd/), upravitelj distribuiranih procesa na platformi u oblaku ili alat kao što je [Foreman](http://blog.daviddollar.org/2011/05/06/introducing-foreman.html) u razvoju) za upravljanje [izlaznim tokovima](./logs), odgovaranje na srušene procese i rukovanje ponovnim pokretanjima koja je započeo korisnik i isključivanjem. diff --git a/content/hr/config.md b/content/hr/config.md new file mode 100644 index 000000000..a6064355d --- /dev/null +++ b/content/hr/config.md @@ -0,0 +1,22 @@ +## III. Konfiguracija +### Pohranite konfiguraciju u okruženje + +*Konfiguracija* aplikacije je sve ono što će vjerojatno varirati između [implementacija](./codebase) (uprizorenje, produkcija, razvojna okruženja itd.). Ovo uključuje: + +* Dršku resursa za bazu podataka, Memcached i druge [potporne usluge](./backing-services) +* Vjerodajnice za vanjske usluge kao što su Amazon S3 ili Twitter +* Vrijednosti specifične za pojedinu implementaciju kao što je kanonsko ime domaćina te implementacije + +Aplikacije ponekad spremaju konfiguraciju kao konstante u kôdu. Ovo je kršenje metodologije dvanaest faktora, koja zahtijeva **strogo odvajanje konfiguracije od kôda**. Konfiguracija se značajno razlikuje od implementacije do implementacije, kôd ne. + +Lakmus test za to da li aplikacija ima sve konfiguracije ispravno izvučene iz kôda je može li se baza izvornog kôda u bilo kojem trenutku učiniti otvorenim kôdom, bez ugrožavanja vjerodajnica. + +Imajte na umu da ova definicija "konfiguracije" **ne** uključuje internu konfiguraciju aplikacije, kao što je `config/routes.rb` u Railsu, ili kako su [moduli kôda povezani](https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-introduction) u [Springu](https://spring.io/). Ova vrsta konfiguracije se ne razlikuje između implementacije, pa je najbolje da bude izvedena u kôdu. + +Drugi pristup konfiguraciji je korištenje konfiguracijskih datoteka koje nisu upisane u upravljanju revizijama, kao što je `config/database.yml` u Railsu. Ovo je veliko poboljšanje u odnosu na korištenje konstanti koje se upisuju u repo kôda, ali još uvijek ima slabosti: lako je greškom upisati konfiguracijsku datoteku u repo; postoji tendencija da konfiguracijske datoteke budu razbacane na različitim mjestima i u različitim formatima, što otežava pregled i upravljanje svim konfiguracijama na jednom mjestu. Nadalje, ovi formati obično su specifični za jezik ili okvir. + +**Dvanaestofaktorska aplikacija pohranjuje konfiguraciju u *varijable okruženja*** (često skraćeno na *env vars* ili *env*). Env vars je lako mijenjati između implementacija bez promjene kôda; za razliku od konfiguracijskih datoteka, male su šanse da budu slučajno upisane u repo kôda; i za razliku od prilagođenih konfiguracijskih datoteka ili drugih konfiguracijskih mehanizama kao što su Java System Properties, one su standard koji ne ovisi o jeziku i OS-u. + +Drugi aspekt upravljanja konfiguracijom je grupiranje. Ponekad aplikacije gomilaju konfiguriraciju u imenovane grupe (koje se često nazivaju "okruženja") nazvane prema određenim implementacijama, kao što su okruženja `development`, `test` i `production` u Railsu. Ova metoda ne skalira čisto: kako se stvara više implementacija aplikacije, potrebni su novi nazivi okruženja, kao što su `staging` ili `qa`. Kako projekt dalje raste, razvijatelji mogu dodati svoja posebna okruženja kao što je `joes-staging`, što rezultira kombinatornom eksplozijom konfiguracije, što upravljanje implementacijama aplikacije čini vrlo krhkim. + +U dvanaestofaktorskoj aplikaciji, env vars su granularne kontrole, svaka potpuno ortogonalna na druge env vars. Nikada se ne grupiraju zajedno kao "okruženja", već se njima samostalno upravlja za svaku implementaciju. Ovo je model koji glatko skaliram prema gore jer se aplikacija prirodno širi na više implementacija tijekom svog životnog vijeka. diff --git a/content/hr/dependencies.md b/content/hr/dependencies.md new file mode 100644 index 000000000..f35184fbd --- /dev/null +++ b/content/hr/dependencies.md @@ -0,0 +1,12 @@ +## II. Zavisnosti +### Eksplicitno deklarirajte i izolirajte zavisnosti + +Većina programskih jezika nudi sustav pakiranja za distribuciju potpornih knjižnica, kao što je [CPAN](https://www.cpan.org/) za Perl ili [Rubygems](https://rubygems.org/) za Ruby. Knjižnice instalirane putem sustava za pakiranje mogu se instalirati zaa cijeli sustav (poznate kao "paketi sjedišta") ili ograničene na direktorij koji sadrži aplikaciju (poznat kao "dobavljanje" ili "pakiranje"). + +**Dvanaestofaktorska Aplikacija nikada se ne oslanja na implicitno postojanje paketa instaliranih za cijeli sustav.** Ona deklarira sve zavisnosti, potpuno i točno, putem manifesta *deklaracije zavisnosti*. Nadalje, koristi alat za *izolaciju zavisnosti* tijekom izvođenja kako bi osigurala da nikakve implicitne zavisnosti ne "procure" iz okolnog sustava. Potpuna i eksplicitna specifikacija zavisnosti jednoliko se primjenjuje i na produkciju i na razvoj. + +Na primjer, [Bundler](https://bundler.io/) za Ruby nudi format manifesta `Gemfile` za deklaraciju zavisnosti i `bundle exec` za izolaciju zavisnosti. U Pythonu postoje dva odvojena alata za ove korake -- [Pip](https://pip.pypa.io/) se koristi za deklaraciju i [Virtualenv](https://virtualenv.pypa.io/) za izolaciju. Čak i C ima [Autoconf](https://www.gnu.org/software/autoconf/) za deklaraciju zavisnosti, a statičko povezivanje može osigurati izolaciju zavisnosti. Bez obzira na lanac alata, deklaracija zavisnosti i izolacija moraju se uvijek koristiti zajedno -- samo jedno ili drugo nije dovoljno da se zadovolji medologija dvanaest faktora. + +Jedna od prednosti eksplicitne deklaracije zavisnosti je da pojednostavljuje postavljanje za razvijatelje koji su novi u aplikaciji. Novi razvijatelj može preuzeti bazu izvornog kôda aplikacije na svom razvojnom stroju, zahtijevajući samo instalirane interpreter i standardnu biblioteku jezika te upravitelj zavisnosti kao preduvjete. Moći će postaviti sve što je potrebno za pokretanje kôda aplikacije pomoću determinističke *naredbe izgradnje*. Na primjer, naredba build za Ruby/Bundler je `bundle install`, dok je za Clojure/[Leiningen](https://github.com/technomancy/leiningen#readme) to `lein deps`. + +Dvanaestofaktorske aplikacije također se ne oslanjaju na implicitno postojanje bilo kakvih sustavskih alata. Primjeri uključuju pozivanje ImageMagicka ili `curl`-a putem ljuske. Iako ovi alati mogu postojati na mnogim ili čak većini sustava, nema jamstva da će postojati na svim sustavima na kojima bi se aplikacija mogla izvoditi u budućnosti ili da li će verzija pronađena na budućem sustavu biti kompatibilna s aplikacijom. Ako aplikacija treba pozvati sustavski alat putem ljuske, taj alat treba isporučiti u aplikaciji. diff --git a/content/hr/dev-prod-parity.md b/content/hr/dev-prod-parity.md new file mode 100644 index 000000000..0ee82107f --- /dev/null +++ b/content/hr/dev-prod-parity.md @@ -0,0 +1,38 @@ +## X. Paritet razvoja/produkcije +### Održavajte razvoj, uprizorenje i produkciju što sličnijim + +Povijesno gledano, postojale su značajne praznine između razvoja (razvijatelj koji uživo uređuje lokalnu [implementaciju](./codebase) aplikacije) i produkcije (pokrenuta implementacija aplikacije kojoj pristupaju krajnji korisnici). Te se praznine manifestiraju u tri područja: + +* **Vremenski jaz**: razvijatelj može raditi na kôdu za koji su potrebni dani, tjedni ili čak mjeseci da krene u implementaciju. +* **Jaz među osobljem**: razvijatelji pišu kôd, operativni inženjeri ga implementiraju. +* **Jaz među alatima**: razvijatelji možda koriste stog poput Nginxa, SQLitea i OS X-a, dok produkcijska implementacija koristi Apache, MySQL i Linux. + +**Dvanaestofaktorska aplikacija dizajnirana je za [kontinuiranu implementaciju](https://avc.com/2011/02/continuous-deployment/) tako da je jaz između razvoja i produkcije malen.** Gledajući tri opisane praznine iznad: + +* Učinite vremenski razmak malenim: razvijatelj može napisati kôd i imati ga implementiranog satima ili čak samo nekoliko minuta kasnije. +* Učinite jaz među osobljem malenim: razvijatelji koji su napisali kôd usko su uključeni u njegovu implementaciju i promatranje njegovog ponašanja u produkciji. +* Učinite jaz među alatima malenim: održavajte razvoj i produkciju što sličnijima. + +Sumirajući gore navedeno u tablicu: + +| | Tradicionalna aplikacija | Dvanaestofaktorska aplikacija | +| - | ------------------------ | ----------------------------- | +| Vrijeme između postavljanja | Tjedni | Sati | +| Autori kôda i implementatori kôda | Različiti ljudi | Isti ljudi | +| Razvojna i produkcijska okruženja | Divergentna | Što je moguće sličnija | + +[Potporne usluge](./backing-services), kao što su baza podataka aplikacije, sustav za upravljanje redovima čekanja ili predmemorija, jedno je područje u kojem je važan paritet razvoja/produkcije. Mnogi jezici nude knjižnice koje pojednostavljuju pristup potpornoj usluzi, uključujući *adaptere* za različite vrste usluga. Neki primjeri su u donjoj tablici. + +| Vrsta | Jezik | Knjižnica | Adapteri | +| ----- | ----- | --------- | -------- | +| Baza podataka | Ruby/Rails | ActiveRecord | MySQL, PostgreSQL, SQLite | +| Red čekanja | Python/Django | Celery | RabbitMQ, Beanstalkd, Redis | +| Predmemorija | Ruby/Rails | ActiveSupport::Cache | Memorija, datotečni sustav, Memcached | + +razvijatelji ponekad pronalaze veliku privlačnost u korištenju lagane pozadinske usluge u svojim lokalnim okruženjima, dok će se ozbiljnija i robusnija pomoćna usluga koristiti u produkciji. Na primjer, korištenje SQLitea lokalno i PostgreSQL-a u produkciji; ili lokalnu procesnu memoriju za predmemoriju u razvoju i Memcached u produkciji. + +**Dvanaestofaktorski razvijatelj odolijeva porivu za korištenjem različitih potpornih usluga između razvoja i produkcije**, čak i kada adapteri teoretski apstrahiraju sve razlike u potpornim uslugama. Razlike između potpornih usluga znače da se pojavljuju male nekompatibilnosti, što uzrokuje neuspjeh u produkciji kôda koji je radio i prošao testove u razvoju ili uprizorenju. Ove vrste pogrešaka stvaraju trenje koje destimulira kontinuiranu implementaciju. Trošak ovog trenja i naknadnog prigušenja kontinuirane implementacije iznimno je visok kada se promatra u zbroju tijekom životnog vijeka aplikacije. + +Lagane lokalne usluge manje su uvjerljive nego što su nekada bile. Moderne potporne usluge kao što su Memcached, PostgreSQL i RabbitMQ nije teško instalirati i pokrenuti zahvaljujući modernim sustavima pakiranja, kao što su [Homebrew](https://brew.sh/) i [apt-get](https://help.ubuntu.com/community/AptGet/Howto). Alternativno, deklarativni alati za osiguravanje resursa kao što su [Chef](https://www.chef.io/products/chef-infra) i [Puppet](https://puppet.com/docs/) u kombinaciji s laganim virtualnim okruženjima kao što su [Docker](https://www.docker.com/) i [Vagrant](https://www.vagrantup.com/) omogućuju razvijateljima pokretanje lokalnih okruženja koja su usko približna produkcijskim okruženjima. Troškovi instaliranja i korištenja ovih sustava su niski u usporedbi s prednostima pariteta razvoja/produkcije i kontinuirane implementacije. + +Adapteri za različite potporne usluge i dalje su korisni jer čine prijenos na nove potporne usluge relativno bezbolnim. No, sve implementacije aplikacije (okruženja razvijatelja, uprizorenje, produkcija) trebaju koristiti istu vrstu i verziju svake od potpornih usluga. diff --git a/content/hr/disposability.md b/content/hr/disposability.md new file mode 100644 index 000000000..a8f3de14d --- /dev/null +++ b/content/hr/disposability.md @@ -0,0 +1,12 @@ +## IX. Jednokratna upotreba +### Maksimalno povećajte robusnost uz brzo pokretanje i dobrohotno isključivanje + +**[Procesi](./processes) dvanaestofaktorske aplikacije su *jednokratni*, što znači da se mogu pokrenuti ili zaustaviti u trenutku.** To olakšava brzo elastično skaliranje, brzu implementaciju promjena [kôda](./codebase) ili [konfiguracije](./config) i robusnost implementacija u produkciji. + +Procesi bi trebali težiti **minimiziranju vremena pokretanja**. U idealnom slučaju, procesu treba nekoliko sekundi od trenutka kada se izvrši naredba za pokretanje dok proces nije pokrenut i spreman za primanje zahtjeva ili poslova. Kratko vrijeme pokretanja pruža veću agilnost za proces [izdanja](./build-release-run) i skaliranje; i pomaže robusnosti, jer upravitelj procesa može lakše premjestiti procese na nove fizičke strojeve kada je to opravdano. + +Procesi se **dobrohotno isključuju kada prime signal [SIGTERM](https://en.wikipedia.org/wiki/SIGTERM)** od upravitelja procesa. Za web proces, dobrohotno isključivanje se postiže prestankom slušanja na vratima usluge (čime se odbijaju svi novi zahtjevi), dopuštajući svim trenutnim zahtjevima da se završe, a zatim se izlazi. Implicitno u ovom modelu je da su HTTP zahtjevi kratki (ne više od nekoliko sekundi), ili u slučaju dugog prozivanja, klijent bi se trebao besprijekorno pokušati ponovno povezati kada se veza izgubi. + +Za radni proces, dobrohotno iksljučivanje se postiže vraćanjem trenutnog posla u radni red. Na primjer, na [RabbitMQ-u](https://www.rabbitmq.com/) radnik može poslati [`NACK`](https://www.rabbitmq.com/amqp-0-9-1-quickref.html#basic.nack); na [Beanstalkdu](https://beanstalkd.github.io/), posao se automatski vraća u red kad god se radnik prekine. Sustavi koji se temelje na zaključavanju kao što je [Delayed Job](https://github.com/collectiveidea/delayed_job#readme) moraju biti sigurni da su otpustili svoje zaključavanje zapisa posla. Implicitno u ovom modelu je da svi poslovi omogućuju [višestruku ulaznost](https://en.wikipedia.org/wiki/Reentrant_%28subroutine%29), što se obično postiže umotavanjem rezultata u transakciju ili pravljenjem [idempotentne](https://en.wikipedia.org/wiki/Idempotence) operacije. + +Procesi bi također trebali biti **otporni na iznenadnu smrt**, u slučaju kvara na temeljnom hardveru. Iako je ovo mnogo rjeđa pojava od dobrohotnog isključivanja sa `SIGTERM`-om, ipak se može dogoditi. Preporučeni pristup je korištenje robusnog pozadinskog dijela reda čekanja, kao što je Beanstalkd, koji vraća poslove u red kada se klijenti odvoje ili im istekne vrijeme čekanja. U svakom slučaju, dvanaestofaktorska aplikacija dizajnirana je za rukovanje neočekivanim, nedobrohotnim prekidima. [Dizajn samo za rušenje](https://lwn.net/Articles/191059/) dovodi ovaj koncept do svog [logičnog zaključka](https://docs.couchdb.org/en/latest/intro/overview.html). diff --git a/content/hr/intro.md b/content/hr/intro.md new file mode 100644 index 000000000..357cd1a67 --- /dev/null +++ b/content/hr/intro.md @@ -0,0 +1,12 @@ +Uvod +==== + +U modernom dobu softver se obično isporučuje kao usluga: naziva se *web aplikacije* ili *softver-kao-usluga*. Dvanaestofaktorska aplikacija je metodologija za izgradnju aplikacija softvera-kao-usluge koje: + +* Koriste **deklarativne** formate za automatizaciju postavljanja, kako bi se smanjilo vrijeme i troškovi za nove razvijatelje koji se pridružuju projektu; +* Imaju **čist ugovor** s temeljnim operativnim sustavom, koji nudi **maksimalnu prenosivost** između izvršnih okruženja; +* Prikladne su za **implementaciju** na modernim **platformama u oblaku**, eliminirajući potrebu za poslužiteljima i administracijom sustava; +* **Minimiziraju razliku** između razvoja i produkcije, omogućujući **kontinuiranu implementaciju** za maksimalnu agilnost; +* I mogu se **skalirati** bez značajnih promjena alata, arhitekture ili razvojnih praksi. + +Dvanaestofaktorska metodoligja može se primijeniti na aplikacije napisane u bilo kojem programskom jeziku i koje koriste bilo koju kombinaciju pomoćnih usluga (baza podataka, red čekanja, predmemorija itd.). diff --git a/content/hr/logs.md b/content/hr/logs.md new file mode 100644 index 000000000..e19d97a92 --- /dev/null +++ b/content/hr/logs.md @@ -0,0 +1,16 @@ +## XI. Zapisnici +### Tretirajte zapisnike kao tokove događaja + +*Zapisnici* pružaju uvid u ponašanje pokrenute aplikacije. U okruženjima temeljenim na poslužitelju oni se obično zapisuju u datoteku na disku ("zapisnička datoteka"); ali ovo je samo izlazni format. + +Zapisnici su [tok](https://adam.herokuapp.com/past/2011/4/1/logs_are_streams_not_files/) agregiranih, vremenski poredanih događaja prikupljenih iz izlaznih tokova svih pokrenutih procesa i potpornih usluga. Zapisnici u svom sirovom obliku obično su tekstualni format s jednim događajem po retku (iako tragovi iz iznimki mogu obuhvaćati više redaka). Zapisnici nemaju fiksni početak ili kraj, već kontinuirano protiču sve dok aplikacija radi. + +**Dvanaestofaktorska aplikacija nikada se ne bavi usmjeravanjem ili pohranom svog izlaznog toka.** Ne bi trebala pokušavati pisati ili upravljati datotekama zapisnika. Umjesto toga, svaki pokrenuti proces upisuje svoj tok događaja, bez međuspremnika, u `stdout`. Tijekom lokalnog razvoja, razvijatelj će vidjeti ovaj tok u prvom planu svog terminala kako bi promatrao ponašanje aplikacije. + +U probnim ili produkcijskim implementacijama, tok svakog procesa bit će uhvaćen od strane izvršnog okruženja, poredan zajedno sa svim ostalim tokovima iz aplikacije i preusmjeren na jedno ili više konačnih odredišta radi pregleda i dugoročnog arhiviranja. Ova arhivska odredišta nisu vidljiva aplikaciji niti ih može konfigurirati, a umjesto toga njima u potpunosti upravlja okruženje izvršavanja. U tu svrhu dostupni su usmjerivači zapisnika otvorenog kôda (kao što su [Logplex](https://github.com/heroku/logplex) i [Fluentd](https://github.com/fluent/fluentd)). + +Tok događaja za aplikaciju može se preusmjeriti u datoteku ili nadgledati preko tail-a u stvarnom vremenu u terminalu. Što je najvažnije, tok se može poslati u sustav indeksiranja i analize zapisnika kao što je [Splunk](https://www.splunk.com/) ili sustav za skladištenje podataka opće namjene kao što je [Hadoop/Hive](https://hive.apache.org/). Ovi sustavi omogućuju veliku snagu i fleksibilnost za introspekciju ponašanja aplikacije tijekom vremena, uključujući: + +* Pronalaženje određenih događaja u prošlosti. +* Grafički prikaz trendova velikih razmjera (kao što su zahtjevi po minuti). +* Aktivno upozorenje prema korisnički definiranoj heuristici (kao što je upozorenje kada količina pogrešaka u minuti prijeđe određeni prag). diff --git a/content/hr/port-binding.md b/content/hr/port-binding.md new file mode 100644 index 000000000..8333b5858 --- /dev/null +++ b/content/hr/port-binding.md @@ -0,0 +1,14 @@ +## VII. Povezivanje na vrata +### Izvezite usluge putem povezivanja na vrata + +Web aplikacije se ponekad izvode unutar spremnika web poslužitelja. Na primjer, PHP aplikacije mogu se izvoditi kao modul unutar [Apache HTTPD](https://httpd.apache.org/) ili se Java aplikacije mogu izvoditi unutar [Tomcata](https://tomcat.apache.org/). + +**Dvanaestofaktorska aplikacija je potpuno samostalna** i ne oslanja se na ubacivanje web poslužitelja tijekom izvođenja u okruženje izvršenja za stvaranje usluge usmjerene na web. Web aplikacija **izvozi HTTP kao uslugu povezujući se na vrata** i slušanjem zahtjeva koji dolaze na ta vrata. + +U lokalnom razvojnom okruženju, razvijatelj posjećuje URL usluge kao što je `http://localhost:5000/` kako bi pristupio usluzi koju izvozi njihova aplikacija. U implementaciji, sloj usmjeravanja obrađuje zahtjeve za usmjeravanje od javnog imena domaćina do web procesa povezanog na vrata. + +To se obično implementira korištenjem [deklaracije zavisnosti](./dependencies) za dodavanje biblioteke web poslužitelja u aplikaciju, kao što su [Tornado](https://www.tornadoweb.org/) za Python, [Thin](https://github.com/macournoyer/thin) za Ruby ili [Jetty](https://www.eclipse.org/jetty/) za Javu i druge jezike temeljene na JVM-u. To se u potpunosti događa u *korisničkom prostoru*, odnosno unutar kôda aplikacije. Ugovor s okruženjem za izvršavanje je povezivanje na vrata za posluživanje zahtjeva. + +HTTP nije jedina usluga koja se može izvesti korištenjem povezivanja na vrata. Gotovo svaka vrsta poslužiteljskog softvera može se pokrenuti putem procesa koji se povezuje na vrata i čeka dolazne zahtjeve. Primjeri uključuju [ejabberd](https://www.ejabberd.im/) (priča [XMPP](https://xmpp.org/)) i [Redis](https://redis.io/) (priča [Redis protokol](https://redis.io/topics/protocol)). + +Također imajte na umu da pristup povezivanjem na vrata znači da jedna aplikacija može postati [potporna usluga](./backing-services) za drugu aplikaciju, pružanjem URL-a potporne aplikacije kao ručke resursa u [konfiguraciji](./config) za aplikaciju koja je koristi. diff --git a/content/hr/processes.md b/content/hr/processes.md new file mode 100644 index 000000000..87f9d5dc7 --- /dev/null +++ b/content/hr/processes.md @@ -0,0 +1,14 @@ +## VI. Procesi +### Izvršavajte aplikaciju kao jedan ili više procesa bez stanja + +Aplikacija se izvršava u izvršnom okruženju kao jedan ili više *procesa*. + +U najjednostavnijem slučaju, kôd je samostalna skripta, izvršno okruženje je lokalno prijenosno računalo razvijatelja s instaliranim interpreterom i standardnom bibliotekom jezika, a proces se pokreće putem naredbenog retka (na primjer, `python my_script.py`). S druge strane spektra, produkcijska implementacija sofisticirane aplikacije može koristiti mnoge [vrste procesa, instancirane u nula ili više pokrenutih procesa](./concurrency). + +**Dvanaestofaktroski procesi su bez stanja i [ništa ne dijele međusobno](https://en.wikipedia.org/wiki/Shared_nothing_architecture).** Svi podaci koji moraju postojati moraju se pohraniti u [potpornu uslugu](./backing-services), uobičajeno bazu podataka. + +Memorijski prostor ili datotečni sustav procesa može se koristiti kao kratka predmemorija za jednu transakciju. Na primjer, preuzimanje velike datoteke, rad s njom i pohranjivanje rezultata operacije u bazu podataka. Dvanaestofaktorska aplikacija nikada ne pretpostavlja da će sve što je predmemorirano u memoriji ili na disku biti dostupno u budućem zahtjevu ili poslu -- s velikim brojem pokrenutih procesa svake vrste, velike su šanse da će budući zahtjev poslužiti drugi proces. Čak i kada se izvodi samo jedan proces, ponovno pokretanje (pokrenuto implementacijom kôda, promjenom konfiguracije ili izvršnim okruženjem koje premješta proces na drugu fizičku lokaciju) obično će izbrisati svo lokalno (npr. memoriju i datotečni sustav) stanje. + +Alati za pakiranje imovine poput [django-assetpackager](https://code.google.com/archive/p/django-assetpackager/) koriste datotečni sustav kao predmemoriju za prevedenu imovinu. Dvanaestofaktorska aplikacija radije obavlja ovo prevođenje tijekom [stadija izgradnje](./build-release-run). Alati za pakiranje imovine kao što su [Jammit](https://documentcloud.github.io/jammit/) i [Rails asset pipeline](https://guides.rubyonrails.org/asset_pipeline.html) mogu se konfigurirati za pakiranje imovine tijekom stadija izgradnje. + +Neki web sustavi oslanjaju se na ["ljepljive sesije"](https://en.wikipedia.org/wiki/Load_balancing_%28computing%29#Persistence) -- to jest, predmemoriranje podataka korisničke sesije u memoriju procesa aplikacije i očekivanje da će budući zahtjevi istog posjetitelja biti preusmjereni na isti proces. Ljepljive sesije su kršenje metodologije dvanaest faktora i nikada se ne smiju koristiti niti se na njih oslanjati. Podaci o stanju sesije dobar su kandidat za pohranu podataka koja nudi vremenski istek, kao što je [Memcached](https://memcached.org/) ili [Redis](https://redis.io/). diff --git a/content/hr/toc.md b/content/hr/toc.md new file mode 100644 index 000000000..d595e76e8 --- /dev/null +++ b/content/hr/toc.md @@ -0,0 +1,38 @@ +Metodologija dvanaest faktora +============================= + +## [I. Baza izvornog kôda](./codebase) +### Jedna baza izvornog kôda praćena u upravljanju revizijama, mnogo implementacija + +## [II. Zavisnosti](./dependencies) +### Eksplicitno deklarirajte i izolirajte zavisnosti + +## [III. Konfiguracija](./config) +### Pohranite konfiguraciju u okruženju + +## [IV. Potporne usluge](./backing-services) +### Tretirajte potporne usluge kao priložene resurse + +## [V. Izgradnja, izdavanje, pokretanje](./build-release-run) +### Strogo razdvojite stadije izgradnje i pokretanja + +## [VI. Procesi](./processes) +### Izvršavajte aplikaciju kao jedan ili više procesa bez stanja + +## [VII. Povezivanje na vrata](./port-binding) +### Izvezite usluge putem povezivanja na vrata + +## [VIII. Konkurentnost](./concurrency) +### Skalirajte prema van putem modela procesa + +## [IX. Jednokratna upotreba](./disposability) +### Maksimalno povećajte robusnost uz brzo pokretanje i dobrohotno isključivanje + +## [X. Paritet razvoja/produkcije](./dev-prod-parity) +### Održavajte razvoj, uprizorenje i produkciju što je moguće sličnijim + +## [XI. Zapisnici](./logs) +### Tretirajte zapisnike kao tokove događaja + +## [XII. Administrativni procesi](./admin-processes) +### Pokrenite administrativne/upravljačke zadatke kao jednokratne procese diff --git a/content/hr/who.md b/content/hr/who.md new file mode 100644 index 000000000..1611aa82f --- /dev/null +++ b/content/hr/who.md @@ -0,0 +1,4 @@ +Tko bi trebao pročitati ovaj dokument? +====================================== + +Bilo koji razvijatelj koji gradi aplikacije koje rade kao usluga. Operativni inženjeri koji implementiraju ili upravljaju takvim aplikacijama. diff --git a/locales/hr.yml b/locales/hr.yml new file mode 100644 index 000000000..51cdd1f5a --- /dev/null +++ b/locales/hr.yml @@ -0,0 +1,7 @@ +en: + # Name of language listed in locales menu + language: Hrvatski (hr) + + # A text to make known that the article is a translation not an original. + # Empty for English, original. + translation: (hrvatski prijevod)