{"id":977,"date":"2020-01-08T13:01:55","date_gmt":"2020-01-08T10:01:55","guid":{"rendered":"http:\/\/esanu.name\/vitalie\/?p=977"},"modified":"2020-01-08T13:01:55","modified_gmt":"2020-01-08T10:01:55","slug":"privesc-eu-cum-este-construit","status":"publish","type":"post","link":"http:\/\/esanu.name\/vitalie\/?p=977","title":{"rendered":"Privesc.Eu &#8211; cum este construit."},"content":{"rendered":"<figure id=\"attachment_978\" aria-describedby=\"caption-attachment-978\" style=\"width: 290px\" class=\"wp-caption alignleft\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-978 size-medium\" src=\"http:\/\/esanu.name\/vitalie\/wp-content\/uploads\/2020\/01\/Screen-Shot-2020-01-08-at-11.42.49-300x278.png\" alt=\"Pagina principal\u0103 - privesc.eu\" width=\"300\" height=\"278\" \/><figcaption id=\"caption-attachment-978\" class=\"wp-caption-text\">Pagina principal\u0103 &#8211; privesc.eu<\/figcaption><\/figure>\n<p>Site-ul <a href=\"https:\/\/www.privesc.eu\">Privesc.Eu<\/a> a \u00eenceput simplu de tot. Un site pe <a href=\"https:\/\/wordpress.com\">wordpress<\/a> \u0219i embeduri video de pe <a href=\"http:\/\/ustream.tv\">ustream.tv<\/a>. Timp de 10 ani, rezolv\u00e2nd problemele una c\u00e2te una, am construit un sistem scalabil \u0219i destul de complex. Anume rezolvarea acestor probleme grele m-au motivat s\u0103 construiesc acest sistem. Dac\u0103 era simplu, cred c\u0103 cedam.<\/p>\n<p>Privesc.Eu de unii este considerat mass-media, de al\u021bii startup tehnologic. Noi credem c\u0103 suntem undeva pe la mijloc. \u00cen situa\u021bii excep\u021bionale, cum ar fi alegeri na\u021bionale sau revolte, acest sistem are cel mai mare trafic din \u021bar\u0103. Maximum atins este peste 30 mii oameni live. \u00cen acele zile, mare majoritatea a televiziunilor preiau imaginile video de la noi.<\/p>\n<p>Articolul este dedicat celor care vor s\u0103 construiasc\u0103 un startup. S\u0103 aib\u0103 o impresie despre tehnologiile care trebuie s\u0103 le \u00eenve\u021be \u0219i s\u0103 le m\u00e2nuiasc\u0103 pentru a construi o companie. Din experien\u021ba mea &#8211; 90% din timp este dedicat anume citirii documenta\u021biei \u0219i integr\u0103rii acestor servicii \u0219i doar 10% &#8211; program\u0103rii.<\/p>\n<p>Aici nu voi vorbi despre oamenii care zi de zi \u00eentre\u021bin acest sistem sau care transmit live-uri. Munca lor e enorm\u0103 &#8211; peste 36 mii de ore de transmisiuni live.<\/p>\n<p>\u00cen continuare, pentru curio\u0219i, un longread tehnologic.<\/p>\n<p><strong>BROWSER<\/strong>. C\u00e2nd un om deschide <a href=\"https:\/\/www.privesc.eu\">www.privesc.eu<\/a>, s\u0103 vad\u0103 un live, \u00een spate stau o mul\u021bime de servere legate \u00eentre ele prin microservicii. Unele servicii sunt construite de mine altele sunt cump\u0103rate \u0219i pl\u0103tite lunar. Unele servere stau \u00een cloud, altele \u00eempr\u0103\u0219tiate prin Europa. Fiecare decizie are un tradeoff, cost\/performan\u0103. Dac\u0103 le gre\u0219e\u0219ti, compania poate chiar da faliment.<\/p>\n<p><strong>WEB<\/strong>. Site-ul <a href=\"https:\/\/www.privesc.eu\">www.privesc.eu<\/a> este hostat pe <a href=\"https:\/\/azure.microsoft.com\/en-us\/\">Microsoft Azure<\/a> (prefer aceast\u0103 platform\u0103, fa\u021b\u0103 de <a href=\"https:\/\/aws.amazon.com\">AWS<\/a> sau<a href=\"https:\/\/cloud.google.com\"> Google Cloud<\/a>, le folosesc \u0219i pe celalte dar la alte proiecte) este construit pe framework-ul <a href=\"https:\/\/dotnet.microsoft.com\/apps\/aspnet\">ASP.NET MVC<\/a>. <a href=\"https:\/\/www.pingdom.com\">Pingdom<\/a>, de c\u00e2\u021bi va ani, \u00eemi arat\u0103 uptime 100%. Aceasta este primul indiciu de calitate a unui site. S\u0103 nu cad\u0103! Site-ul ruleaz\u0103 pe minimum 2 web servere \u0219i se autoscaleaz\u0103 p\u00e2n\u0103 la 100 de servere \u00een dependen\u021b\u0103 de volumul de oameni care privesc. Limita de minimum 2 servere am impus-o din cauza c\u0103 avem widgetul <a href=\"https:\/\/www.privesc.eu\">privesc.eu<\/a> care este embedat pe mii de site-uri. Dac\u0103 vom pica se va vedea pe tot Internetul \ud83d\ude00<\/p>\n<p><strong>DB<\/strong>. Serverele web au \u00een spate o baz\u0103 de date <a href=\"https:\/\/ro.wikipedia.org\/wiki\/Microsoft_SQL_Server\">SQL Server<\/a>. Acolo se p\u0103streaz\u0103 toate informa\u021bia despre live-uri, titluri, operatori, camere, servere, utilizatori, autoriz\u0103ri\u2026 F\u0103r\u0103 aceast\u0103 baz\u0103 de date nimic nu func\u021bioneaz\u0103. Folosesc <a href=\"https:\/\/azure.microsoft.com\/en-us\/services\/sql-database\/\">Azure SQL Server<\/a> care \u00eemi asigur\u0103 un uptime de 100%.<\/p>\n<p><strong>CACHE<\/strong>. Este destul de costisitor s\u0103 interpelezi baza de date la orice flecu\u0219te\u021b. Pentru a minimiza interpel\u0103rile folosesc un <a href=\"https:\/\/redis.io\">Redis Cache Server<\/a> as a service din <a href=\"https:\/\/azure.microsoft.com\/en-us\/services\/cache\/\">Azure<\/a>, care \u00eel po\u021bi scala \u00een dependen\u021b\u0103 de necesit\u0103\u021bi. Cache centralizat prin Redis e necesar mai ales c\u00e2nd servere se autoscaleaz\u0103 \u0219i nu trebuie de repopulat informa\u021bia la fiecare server nou pornit. Mai folosesc \u0219i cache in memory pentru unele taskuri mici.<\/p>\n<p><strong>STORAGE<\/strong>. Cea mai mare problem\u0103 la <a href=\"https:\/\/www.privesc.eu\">privesc.eu<\/a> este stocarea datelor. Avem TB de video care trebuie \u021binute online. Mai mu\u021bi TB care trebuie \u021binute offline (originalele de la camerele de filmat). GB de date care trebuie de interpelat \u00een realtime (contoare \u0219i fe\u021bele oamenilor). Pentru a mic\u0219ora cheltuielile, am hot\u0103r\u00e2t ca serverele de stocare video s\u0103 fie p\u0103strate \u00een \u021bar\u0103, \u00een cloud e foarte costisitor. Avem un server \u00een Moldova la <a href=\"https:\/\/moldtelecom.md\">Moldtelecom<\/a> \u0219i altul \u00een Rom\u00e2nia la <a href=\"https:\/\/www.2ktelecom.ro\">2KTelecom<\/a>. Ambele servere umplute p\u00e2n\u0103 la refuz cu HDD-uri \u00een <a href=\"https:\/\/ro.wikipedia.org\/wiki\/RAID\">RAID0<\/a>. Folosim RAID0 pentru c\u0103 la fluxuri mari de cereri alt tip de RAID nu face fa\u021b\u0103.<span class=\"Apple-converted-space\">\u00a0<\/span><\/p>\n<p><strong>VIDEO<\/strong>: De la \u00eenceput am hot\u0103r\u00e2t s\u0103 folosim camere de \u00eenregistrare video pentru \u00eencep\u0103tori. \u00cen timp, camerele pentru \u00eencep\u0103tori au devenit foarte bune. La ce facem noi sunt, uneori, mai bune dec\u00e2t cele profesioniste. Zoom mai mare, sunt foarte u\u0219oare \u0219i ieftine. La proteste ne ajut\u0103 mult. Camerele sunt <a href=\"https:\/\/www.sony.ro\/electronics\/camere-video-handycam\/fdr-ax53\">Sony AX53 4K<\/a> .<\/p>\n<p><strong>AUDIO<\/strong>: Spre deosebire de profesioni\u0219ti care folosesc microfoane prin wireless analogic, mari \u0219i cu logouri pe ele, noi ne folosim de microfoane mici bluetooth<a href=\"https:\/\/www.amazon.com\/Sony-ECMW1M-Wireless-Microphone-Black\/dp\/B00HPM086C\"> Sony ECMW1M Wireless<\/a> sau microfoane<a href=\"https:\/\/www.zoom-na.com\/products\/field-video-recording\/field-recording\/h5-handy-recorder\"> Zoom H5<\/a> \u0219i pe post de mini mixer audio. Sunt ieftine, micu\u021be. Uneori paza de stat ne creeaz\u0103 probleme cu bruiajele.<\/p>\n<p><strong>ENCODER<\/strong>: Am \u00eenceput cu notebook-uri, 10 ani \u00een urm\u0103. Camera video prin A\/V cablu conectate la un convertor USB ap\u0103rea ca o camera web \u00een windows \u0219i prin <a href=\"https:\/\/www.adobe.com\/products\/media-encoder.html\">Adobe Media Encoder<\/a> transmiteam prin protocolul RTMP la serverele <a href=\"https:\/\/www.wowza.com\">Wowza<\/a>. An de an scanam ce apare nou \u00een acest domeniu s\u0103 fie ieftin \u0219i bun. P\u00e2n\u0103 am dat de <a href=\"https:\/\/teradek.com\/collections\/vidiu-family\">Teradek VidiU<\/a>.<\/p>\n<p><strong>BROADCAST<\/strong>: De obicei transmisiunile de la encoder la serverul central se face prin modeme 4G. To\u021bi cameramanii au minim c\u00e2te 2 modeme de la diferi\u021bi operatori de telefonie mobil\u0103. Rareori facem prin cablu. \u00cen Moldova utliz\u0103m <a href=\"https:\/\/www.orange.md\">Orange<\/a> \u0219i <a href=\"http:\/\/unite.md\">Unite<\/a>, \u00een Rom\u00e2nia <a href=\"https:\/\/www.orange.ro\">Orange<\/a> \u0219i <a href=\"https:\/\/www.telekom.ro\">Telekom<\/a>. Nu ne folosim de serviciul de bounding, este destul de scump.<\/p>\n<p><strong>LIVESTREAM<\/strong>. Servere de stocare, care nu prea sunt expuse publicului, mai \u00eendeplinesc \u0219i func\u021bia de a primi semnalul video de la cameramani, de auto\u00eenregistra \u0219i servi video pentru serverele de cache video. Ele sunt interconectate \u00eentre ele. Dac\u0103 un video din Rom\u00e2nia este cerut din Moldova este tras mai \u00eent\u00e2i \u00een Moldova \u0219i apoi este mai departe servit prin serverele cache. Pe aceste servere mai ruleaz\u0103 \u0219i IIS care are soft f\u0103cut de mine. M\u0103 ajut\u0103 la thumnails, gif-uri, extragere de sunete, s\u0103 porneasc\u0103 restreamuri sau s\u0103 permit TV-urilor s\u0103 poat\u0103 desc\u0103rca din arhiv\u0103.<\/p>\n<p><strong>CACHESTREAM<\/strong>. Aceste servere sunt cele mai expuse publicului \u0219i uneori servesc peste 15GB\/s de informa\u021bie video. Ele ruleaz\u0103 pe <a href=\"https:\/\/www.nginx.com\">nginx<\/a>\/<a href=\"https:\/\/www.docker.com\">docker<\/a>\/<a href=\"https:\/\/ubuntu.com\">ubuntu<\/a>. Misiunea lor e simpl\u0103 &#8211; vine un http request la un chunk video din un fi\u0219ier <a href=\"https:\/\/en.wikipedia.org\/wiki\/HTTP_Live_Streaming\">.hls<\/a>, \u0219i dac\u0103 nu-l are, \u00eel cere de la serverul de stocare, \u0219i p\u0103streaz\u0103 acel chunk de video .mp4 local timp de 30 min. C\u00e2nd privi\u021bi video online, de obicei nu vine un fi\u0219ier de c\u00e2\u021biva GB pe local ci sunt trase fi\u0219ere mici a c\u00e2t 2-3MB de c\u00e2teva secunde. Aceste servere sunt a\u0219a de solicitate \u00eenc\u00e2t undeori cedez\u0103 cartelele de re\u021bea. Pentru a evita problemele cu c\u0103dearea lor, serverul de monitorizare periodic verific\u0103 dac\u0103 aceste serverele cache r\u0103spund \u00eenainte de a trimite oameni spre ele. Privesc.Eu are astfel de servere la <a href=\"https:\/\/www.starnet.md\">Starnet<\/a> (Moldova), <a href=\"https:\/\/www.hetzner.com\">Hetzner<\/a> (Germania), <a href=\"https:\/\/www.digitalocean.com\">Digital Ocean<\/a> (Amsterdam). Au storage mic \u0219i sunt pe <a href=\"https:\/\/ro.wikipedia.org\/wiki\/Solid-state_drive\">SSD<\/a>.<\/p>\n<p><strong>P2PSTREAM<\/strong>: Tehnologie testat\u0103 cu 2 companii \u0219i implementat\u0103. Acum este nefunc\u021bional\u0103, \u00eens\u0103 o pot activa \u00een situa\u021bii de criz\u0103. Este mai ieftin traficul \u00een MD dec\u00e2t P2P \ud83d\ude09<\/p>\n<p><strong>COUNTERS<\/strong>: Mul\u021bi clien\u021bi de ai nostri cer datele despre live-uri. Am creat un sistem de contorizare. O problem\u0103 netrivial\u0103 c\u00e2nd ai sute de cereri pe secunde \u0219i trebuie agregate datele \u00een timp real de la mai multe servere www. Pentru asta am folosi <a href=\"https:\/\/azure.microsoft.com\/en-us\/services\/storage\/tables\/\">Azure Table Storage<\/a> fiecare servere \u00eenscrie acolo numele lui, ce live \u0219i c\u00e2te vizualiz\u0103ri. Mai contoriz\u0103m \u0219i pe ce site-uri au ap\u0103rut live-urile \u0219i p\u0103str\u0103m titlu site-ulu \u0219i pagina unde a ap\u0103rut. Datele acestea sunt p\u0103strate pe serverul Redis.<\/p>\n<p><strong>FACE RECOGNITION<\/strong>: De vreun an am ad\u0103ugat aceast\u0103 func\u021bionalitate care scaneaz\u0103 \u00eenregistarea video, g\u0103se\u0219te toate fe\u021bele. Le clasterizeaz\u0103 astel ca s\u0103 fie fiecare claster s\u0103 fie acea\u0219i persoan\u0103. Memorizeaz\u0103 unde acea fa\u021b\u0103 a ap\u0103rut \u0219i vectorul care identific\u0103 acea fa\u021b\u0103. Pentru procesarea video folosesc un calculator de birou cu 12 procesoare care 24\/24 descarc\u0103 fiecare video de pe serverele de stocare, ruleaz\u0103 face recognition \u0219i apoi aceste rezultate se salveaz\u0103 \u00een cloud pe <a href=\"https:\/\/azure.microsoft.com\/en-us\/services\/cosmos-db\/\">CosmosDB<\/a>. CosmosDB e cea mai rapid\u0103 \u0219i scalabil\u0103 baza de date din lume. Iar imaginile se stochez\u0103 ca blob-uri \u00een <a href=\"https:\/\/azure.microsoft.com\/en-us\/services\/storage\/blobs\/\">Azure Blob storage<\/a>. CosmosDB a ajuns la 25GB \u0219i fiecare request e sub 10ms. &#x1f61d;<\/p>\n<p><strong>CHAT<\/strong>: Practic e resursa care consum\u0103 cel mai mult serverele www atunci c\u00e2nd mii de oameni stau pe pagina care are un chat. Serverele trebuie s\u0103 \u021bin\u0103 conexiuni active cu to\u021bi cei care privesc &#8211; s\u0103 primeasc\u0103 \u0219i s\u0103 trimit\u0103 mesaje. Cererea cre\u0219te exponen\u021bial fa\u021b\u0103 de num\u0103rul de oameni activi. Folosesc tehnologia <a href=\"https:\/\/dotnet.microsoft.com\/apps\/aspnet\/signalr\">SignalR<\/a> de la Microsoft \u0219i serverul Redis pentru comunicarea \u00eentre serverele www. \u00cen paralel serverele www primesc prin <a href=\"https:\/\/developers.facebook.com\/docs\/graph-api\/webhooks\/\">webhooks<\/a> \u0219i comentariile de la live-urle difuzate pe Facebook.<\/p>\n<p><strong>DDOS<\/strong>: <a href=\"https:\/\/www.cloudflare.com\">Cloudflare<\/a> Un serviciu foarte util care te protejeaz\u0103 contra atacurilor. Noi \u00eel folosim pentru a minimiza cheltuielile de trafic la thumnails \u0219i player-ul video. Economisim TB de date doar folosind acest serviciu foarte comod. Deasemnea \u0219i <a href=\"https:\/\/ro.wikipedia.org\/wiki\/Sistem_de_nume_de_domeniu\">DNS<\/a>-urile stau aici care rapid pot fi modificate.<\/p>\n<p><strong>EMAIL<\/strong>: Trimitem lunar peste 40 mii de email-uri, alerte, rapoarte la organizatorii, \u00eenceputul de transmisiune, \u00eenchiderea, fotografii \u0219i statistic\u0103. Folosim de ani buni serviciul <a href=\"https:\/\/sendgrid.com\">SendGrid<\/a>. Este simplu \u0219i eficient. Serverele noastre de email sunt hostate de <a href=\"https:\/\/gmail.com\/\">Gmail<\/a>.<\/p>\n<p><strong>SMS<\/strong>: Transmitem lunar c\u00e2teva sute. Folosim pentru comunicare urgent\u0103 cu cameramani \u0219i cu organizatorii. Oricine poate ap\u0103sa butonul Raporteaz\u0103 de sub live \u0219i trimite un SMS cameramanului. Folosim <a href=\"https:\/\/www.nexmo.com\">Nexmo<\/a> care e destul de bun.<\/p>\n<p><strong>PAYMENT<\/strong>: A\u0219 prefera <a href=\"https:\/\/stripe.com\">Stripe<\/a> \u00eens\u0103 nu lucreaz\u0103 nici \u00een Rom\u00e2nia \u0219i nici \u00een Moldova. Am g\u0103sit unul foarte bun &#8211; <a href=\"https:\/\/www.braintreepayments.com\">Braintree<\/a>, care are sistem de subscription. Adic\u0103 el duce eviden\u021ba cardurilor bancare \u0219i are grij\u0103 s\u0103 extrag\u0103 banii lunar \u0219i dac\u0103 nu mai poate &#8211; \u00ee\u021bi raporteaz\u0103.<span class=\"Apple-converted-space\">\u00a0<\/span><\/p>\n<p><strong>NOTIFICATIONS<\/strong>: Avem un server, <a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/cloud-services\/cloud-services-choose-me\">worker role<\/a>, care e plin de taskuri repetitive. Serverul trimite notific\u0103ri la aplica\u021biile de <a href=\"https:\/\/ro.wikipedia.org\/wiki\/IOS_(Apple)\">iOS<\/a>, <a href=\"https:\/\/www.android.com\">Android<\/a>, <a href=\"https:\/\/www.google.com\/chrome\">Chrome<\/a> \u0219i <a href=\"https:\/\/www.mozilla.org\/ro\/firefox\/new\/\">Firefox<\/a>. Monitorizez\u0103 fluxurile de live stream \u0219i imediat ce pic\u0103, anun\u021b\u0103 cameramanul prin <a href=\"https:\/\/discordapp.com\">Discord<\/a> \u0219i <a href=\"https:\/\/slack.com\">Slack<\/a> despre problem\u0103.<\/p>\n<p><strong>ANALYTICS<\/strong>: Web, iOS \u0219i Android sunt legate raporteaz\u0103 la <a href=\"https:\/\/analytics.google.com\">Google Analytics<\/a>. La serverul web \u00een trecut foloseam un sistem de monitorizare <a href=\"https:\/\/newrelic.com\">NewRelic<\/a>. La \u00eenceput era gratuit, apoi c\u00e2nd au ie\u0219it la IPO \u0219i au anulat planul gratuit am trecut la <a href=\"https:\/\/azuremarketplace.microsoft.com\/en-us\/marketplace\/apps\/Microsoft.AppInsights\">Microsoft Application Insights<\/a>.<\/p>\n<p><strong>RESTREAMING<\/strong>: O func\u021bionalitate foarte \u00eentrebat\u0103 la <a href=\"https:\/\/www.privesc.eu\">privesc.eu<\/a> este retransmisiunea pe <a href=\"https:\/\/www.facebook.com\">Facebook<\/a> \u0219i <a href=\"https:\/\/www.youtube.com\/?hl=ro\">Youtube<\/a> a live-urilor filmate de noi. Cu aceasta acum se ocup\u0103 serverele centrale de stocare. C\u00e2nd imaginea video este nemodificat\u0103 se utilizeaz\u0103 pu\u021bine resurse <a href=\"https:\/\/ro.wikipedia.org\/wiki\/Unitate_central\u0103_de_prelucrare\">CPU<\/a>. \u00cens\u0103 dac\u0103 vrem s\u0103 punem logo-ul <a href=\"https:\/\/www.privesc.eu\">privesc.eu<\/a> servere \u021bin doar 4 live-uri \u00een paralel &#x1f614;. Pentru a scala aceast\u0103 problem\u0103 am construit un docker care automat se porne\u0219te \u00een cloud \u0219i se opre\u0219te c\u00e2nd live-ul se deconecteaz\u0103. Suntem acum \u00een faza de testare.<\/p>\n<p><strong>TRANSCRIPTION<\/strong>: Este un sistem intern dezvotat pentru a transcrie video manual, importa sau recunoa\u0219terea vocii. Cu recunoa\u0219terea vocii va trebui de mai a\u0219teptat. Ne-am integrat cu <a href=\"https:\/\/cloud.google.com\/speech-to-text\/\">Google Speech Recognition<\/a> \u00eens\u0103 e destul de prost \u00een limba rom\u00e2n\u0103.<\/p>\n<p><strong>PHOTO<\/strong>: Fotograful dup\u0103 ce fotografiaz\u0103 la eveniment \u00eencarc\u0103 pe loc toate fotografiile pe iPad apoi de pe iPad le trimite pe server. Fotografiile se stochez\u0103 \u00een Azure Blob Storage \u0219i alert\u0103m organizatorul cu un email. To\u021bi oamenii de pe chat deasemnea primesc alerte despre fotografiile \u00eenc\u0103rcate. Utilizatorii pot desc\u0103rca aceste fotografii una c\u00e2te una sau toat\u0103 arhiva.<\/p>\n<p><strong>SEARCH<\/strong>: La \u00eenceput c\u0103utam doar cuvinte \u00een titlurile evenimentelor prin SQL. S\u0103pt\u0103m\u00e2na aceasta \u00eem integrat <a href=\"https:\/\/azure.microsoft.com\/en-in\/services\/search\/\">Azure Search<\/a>, care indexeaz\u0103, titlurile, tag-urile \u0219i transcrierile \u0219i practic instant \u00ee\u021bi d\u0103 rezultatele. Este un serviciu de search foarte flexibil \u00een interpel\u0103ri care \u00een\u021belege \u0219i limba rom\u00e2n\u0103. Rezultatele pot fi ordonate dup\u0103 rank sau timpul de \u00eenregistrare.<\/p>\n<p><strong>SEO<\/strong>: Paginile de la <a href=\"http:\/\/privesc.eu\">privesc.eu<\/a> de obicei au multe componente: chat, fe\u021be de oameni, agenda, linkuri cu alte portaluri care se genereaz\u0103 dinamic. Pentru a servi aceste pagini foarte rapid search-urilor este un serviciu bun &#8211; <a href=\"http:\/\/prerender.io\">prerender.io<\/a>. El deschide pagina cerut\u0103 \u00een chromeless procesaz\u0103 exact cum o face un browser \u0219i stochez\u0103 plain html \u00een memorie. La o a doua cerere r\u0103spunde instant. Privesc.Eu are peste 90 mii de pagini \u0219i crawlerele cer mii de pagini pe zi. Pentru a economisi am pornit un <a href=\"https:\/\/azure.microsoft.com\/en-us\/services\/container-instances\/\">Azure Container Instance<\/a> cu un <a href=\"https:\/\/hub.docker.com\/r\/bgadrian\/docker-prerender\">docker prerender<\/a> \u0219i merge brici.<\/p>\n<p><strong>IDE<\/strong>: <a href=\"https:\/\/visualstudio.microsoft.com\">Visual Studio 2015<\/a> \u0219i 2019- dezvoltare web, <a href=\"https:\/\/code.visualstudio.com\">Visual Studio Code<\/a> &#8211; recunoa\u0219terea fe\u021belor. <a href=\"https:\/\/developer.apple.com\/xcode\/\">XCode<\/a> &#8211; aplica\u021bia iOS. <a href=\"https:\/\/developer.android.com\/studio\">Android Studio<\/a> &#8211; aplica\u021bia Android.<\/p>\n<p><strong>LANGUAGES<\/strong>: <a href=\"https:\/\/en.wikipedia.org\/wiki\/C_Sharp_(programming_language)\">C#<\/a> &#8211; pentru progamare de web servere. <a href=\"https:\/\/ro.wikipedia.org\/wiki\/Java_(limbaj_de_programare)\">Java<\/a> &#8211; custom plug-in pentru Wowza. <a href=\"https:\/\/ro.wikipedia.org\/wiki\/Python\">Python<\/a> &#8211; recunoa\u0219terea fe\u021belor \u00een video. <a href=\"https:\/\/en.wikipedia.org\/wiki\/Objective-C\">Objective-C<\/a>\/<a href=\"https:\/\/en.wikipedia.org\/wiki\/Swift_(programming_language)\">Swift<\/a> &#8211; aplica\u021bia iOS, Java\/<a href=\"https:\/\/en.wikipedia.org\/wiki\/Kotlin_(programming_language)\">Kotlin<\/a> &#8211; Aplica\u021bia Andoid. <a href=\"https:\/\/ro.wikipedia.org\/wiki\/JavaScript\">Javascript<\/a>\/<a href=\"https:\/\/www.typescriptlang.org\">Typescript<\/a> &#8211; Web site. Uneori m\u0103 \u00eencurc \u00een ele c\u00e2nd trec de la una la alta :D.<\/p>\n<p><strong>SOFT<\/strong>: <a href=\"https:\/\/www.iis.net\">IIS<\/a> &#8211; serverele de stocare, <a href=\"https:\/\/www.wowza.com\">Wowza<\/a> &#8211; livestream, <a href=\"https:\/\/www.ffmpeg.org\">FFMPEG<\/a> &#8211; procesare video, conversie, restream, <a href=\"https:\/\/www.nginx.com\">NGINX<\/a> &#8211; servere cache in reverse proxy.<\/p>\n<p><strong>OS<\/strong>: <a href=\"https:\/\/www.microsoft.com\/en-us\/cloud-platform\/windows-server\">Windows Server<\/a> &#8211; serverele www \u0219i de stocare, <a href=\"https:\/\/ubuntu.com\">Ubuntu<\/a> &#8211; serverele de cache video \u0219i recunoa\u0219terea fe\u021belor, <a href=\"https:\/\/www.apple.com\/macos\/catalina\/\">MacOS<\/a> &#8211; pentru development.<\/p>\n<p>Chiar dac\u0103 acest sistem este construit de un singur om, \u00een spatele serviciilor care le folosim stau sute, poate mii de ingineri. Un mare mul\u021bumesc lor, celor care ne ajut\u0103 ca acest site s\u0103 lucreze nonstop.<\/p>\n<p>PS. Azi doar blogul <a href=\"http:\/\/privesc.eu\">privesc.eu<\/a> a mai r\u0103mas pe wordpress. \ud83d\ude09<\/p>\n<p>PS: Urm\u0103torul post &#8211; Cum s\u0103 contruie\u0219ti un canal TV func\u021bional complet autonom.\t\t<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Site-ul Privesc.Eu a \u00eenceput simplu de tot. Un site pe wordpress \u0219i embeduri video de pe ustream.tv. Timp de 10 ani, rezolv\u00e2nd problemele una c\u00e2te una, am construit un sistem scalabil \u0219i destul de complex. Anume rezolvarea acestor probleme grele m-au motivat s\u0103 construiesc acest sistem. Dac\u0103 era simplu, cred c\u0103 cedam. Privesc.Eu de unii &#8230; <a title=\"Privesc.Eu &#8211; cum este construit.\" class=\"read-more\" href=\"http:\/\/esanu.name\/vitalie\/?p=977\" aria-label=\"More on Privesc.Eu &#8211; cum este construit.\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2,3,4,12,17,21,22,25,28,29,35,43],"tags":[],"class_list":["post-977","post","type-post","status-publish","format-standard","hentry","category-net","category-ai","category-apple","category-deep-learning","category-facebook","category-google","category-hacker","category-internet","category-machine-learning","category-microsoft","category-privesc-eu","category-startup"],"_links":{"self":[{"href":"http:\/\/esanu.name\/vitalie\/index.php?rest_route=\/wp\/v2\/posts\/977","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/esanu.name\/vitalie\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/esanu.name\/vitalie\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/esanu.name\/vitalie\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/esanu.name\/vitalie\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=977"}],"version-history":[{"count":0,"href":"http:\/\/esanu.name\/vitalie\/index.php?rest_route=\/wp\/v2\/posts\/977\/revisions"}],"wp:attachment":[{"href":"http:\/\/esanu.name\/vitalie\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=977"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/esanu.name\/vitalie\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=977"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/esanu.name\/vitalie\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=977"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}