{"id":1328,"date":"2026-03-31T00:39:46","date_gmt":"2026-03-31T03:39:46","guid":{"rendered":"https:\/\/maurobernal.com.ar\/blog\/?p=1328"},"modified":"2026-03-31T00:39:46","modified_gmt":"2026-03-31T03:39:46","slug":"deploy-de-apps-javascript-con-net-aspire-los-3-modelos-que-necesitas-conocer","status":"publish","type":"post","link":"https:\/\/maurobernal.com.ar\/blog\/deploy-de-apps-javascript-con-net-aspire-los-3-modelos-que-necesitas-conocer\/","title":{"rendered":"Deploy de apps JavaScript con .NET Aspire: los 3 modelos que necesit\u00e1s conocer"},"content":{"rendered":"\n<p>Cuando trabajamos con aplicaciones JavaScript en .NET Aspire, uno de los puntos m\u00e1s confusos es entender <strong>c\u00f3mo se despliegan en producci\u00f3n<\/strong>. Durante el desarrollo local, <code>AddViteApp<\/code> levanta el servidor de Vite con HMR y todo funciona de maravilla. El problema viene cuando hay que publicar: \u00bfqui\u00e9n sirve los archivos en producci\u00f3n?<\/p>\n\n\n\n<p>Este art\u00edculo explica los tres modelos de hosting que ofrece Aspire para frontends JavaScript y cu\u00e1ndo usar cada uno.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">El malentendido m\u00e1s com\u00fan<\/h2>\n\n\n\n<p><code>AddViteApp<\/code> <strong>no es un servidor web de producci\u00f3n<\/strong>. Es un recurso de build. En modo desarrollo sirve el dev server de Vite; en publish, produce los artefactos del build. Otro recurso debe encargarse de servir esos archivos al browser en producci\u00f3n.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Modelo 1: El backend sirve el frontend<\/h2>\n\n\n\n<p>El patr\u00f3n m\u00e1s simple. El backend (Node, ASP.NET Core, etc.) toma los archivos del build de Vite y los sirve desde su propio contenedor.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>var frontend = builder.AddViteApp(\"frontend\", \".\/frontend\").WithReference(app).WaitFor(app);\n\napp.PublishWithContainerFiles(frontend, \".\/static\");<\/code><\/pre>\n\n\n\n<p>En publish, Aspire copia los archivos del build del frontend dentro del contenedor del backend. Un \u00fanico servicio desplegado atiende tanto la API como el frontend.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u00bfCu\u00e1ndo usarlo?<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n  <li>Tu backend ya sabe servir archivos est\u00e1ticos (wwwroot, static, etc.)<\/li>\n  <li>Quer\u00e9s una topolog\u00eda simple: un solo servicio, un solo endpoint p\u00fablico<\/li>\n  <li>El frontend y el backend se despliegan y escalan juntos<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Consideraciones<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n  <li>El contenedor del backend crece porque incluye tanto el c\u00f3digo del backend como los assets del frontend<\/li>\n  <li>Es el modelo que Aspire favorece por defecto para frontends Vite<\/li>\n  <li>Routing, auth y cach\u00e9 de assets se manejan en un solo lugar<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Modelo 2: Un reverse proxy sirve el frontend<\/h2>\n\n\n\n<p>Un gateway o BFF (Backend For Frontend) act\u00faa como punto de entrada p\u00fablico. Ruteaa las requests de API hacia el backend y sirve el build del frontend directamente.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>builder\n  .AddYarp(\"app\")\n  .WithConfiguration(c => {\n    c.AddRoute(\"\/api\/{**catch-all}\", api)\n     .WithTransformPathRemovePrefix(\"\/api\");\n  })\n  .WithExternalHttpEndpoints()\n  .PublishWithStaticFiles(frontend);<\/code><\/pre>\n\n\n\n<p>En producci\u00f3n, YARP (o cualquier otro reverse proxy como Nginx o Caddy) sirve el frontend directamente mientras sigue proxeando las llamadas a la API.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u00bfCu\u00e1ndo usarlo?<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n  <li>Quer\u00e9s un gateway o BFF delante de toda la aplicaci\u00f3n<\/li>\n  <li>Ya us\u00e1s un reverse proxy para routing, transforms o l\u00f3gica BFF<\/li>\n  <li>Necesit\u00e1s un endpoint p\u00fablico \u00fanico tanto en desarrollo como en producci\u00f3n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Consideraciones<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n  <li>El hosting del frontend queda desacoplado de cualquier servicio de backend individual<\/li>\n  <li>Las reglas de routing importan: el proxy decide qu\u00e9 va a la API y qu\u00e9 al frontend<\/li>\n  <li>Suma un componente m\u00e1s al deployment, pero da mayor control sobre el ingress<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Modelo 3: SPA standalone + API separada<\/h2>\n\n\n\n<p>El frontend se despliega en un static file host independiente y el browser llama directamente a la API en otro host.<\/p>\n\n\n\n<p>Este modelo puede parecer el m\u00e1s familiar si ven\u00eds de deployar \u00abuna app React a Netlify + una API a Heroku\u00bb, pero <strong>Aspire no lo favorece<\/strong> y tiene varias trampas:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n  <li><strong>Pit 1 &#8211; Variables de entorno en runtime:<\/strong> Vite consume las variables <code>VITE_*<\/code> en <em>build time<\/em>. Si intent\u00e1s pasar la URL de la API como variable de entorno del recurso Vite, el SPA ya deployado no la va a leer en runtime.<\/li>\n  <li><strong>Pit 2 &#8211; Build args para la URL del backend:<\/strong> La URL del backend generalmente no se conoce cuando se buildea la imagen del frontend.<\/li>\n  <li><strong>Pit 3 &#8211; Dependencia circular:<\/strong> Si el frontend necesita la URL del backend y el backend necesita el origen del frontend para CORS, hay un ciclo en deploy-time que Aspire no resuelve autom\u00e1ticamente.<\/li>\n<\/ul>\n\n\n\n<p>Si a\u00fan as\u00ed eleg\u00eds este modelo, planific\u00e1 configuraci\u00f3n de runtime expl\u00edcita y gesti\u00f3n de CORS manual.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">AddJavaScriptApp vs AddViteApp<\/h2>\n\n\n\n<p>La misma l\u00f3gica aplica a <code>AddJavaScriptApp<\/code>. La diferencia es que <code>AddViteApp<\/code> conoce las convenciones de desarrollo de Vite (HMR, puerto por defecto, etc.), mientras que <code>AddJavaScriptApp<\/code> hace menos suposiciones y te deja controlar los scripts de run y build. En ambos casos, en producci\u00f3n necesit\u00e1s decidir qu\u00e9 recurso sirve los assets.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Resumen: \u00bfCu\u00e1l elegir?<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Modelo<\/th><th>Entrypoint en producci\u00f3n<\/th><th>API Aspire<\/th><th>Ideal para<\/th><\/tr><\/thead><tbody><tr><td>Backend sirve frontend<\/td><td>API \/ web server<\/td><td>PublishWithContainerFiles<\/td><td>Apps donde un servicio maneja API y frontend<\/td><\/tr><tr><td>Reverse proxy sirve frontend<\/td><td>Reverse proxy<\/td><td>PublishWithStaticFiles<\/td><td>Apps con gateway o BFF delante de la API<\/td><\/tr><tr><td>SPA standalone<\/td><td>Static site + API separada<\/td><td>Custom<\/td><td>Casos donde se acepta gestionar CORS y config manual<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>La decisi\u00f3n se reduce a una pregunta: <strong>\u00bfqui\u00e9n debe ser el endpoint HTTP p\u00fablico en producci\u00f3n?<\/strong> Si es tu backend, us\u00e1 <code>PublishWithContainerFiles<\/code>. Si es tu gateway o BFF, us\u00e1 <code>PublishWithStaticFiles<\/code>.<\/p>\n\n\n\n<p>Fuente original: <a href=\"https:\/\/aspire.dev\/deployment\/javascript-apps\/\">Deploy JavaScript apps | Aspire Docs<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Cuando trabajamos con aplicaciones JavaScript en .NET Aspire, uno de los puntos m\u00e1s confusos es entender c\u00f3mo se despliegan en producci\u00f3n. Durante el desarrollo local, AddViteApp levanta el servidor de&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[202],"tags":[352,451,357,263,446,240,248,276,277,447,448,449,450,445],"class_list":["post-1328","post","type-post","status-publish","format-standard","hentry","category-dotnet","tag-net-aspire","tag-addviteapp","tag-apphost","tag-ci-cd","tag-deploy","tag-docker","tag-dockerfile","tag-frontend","tag-javascript","tag-node-js","tag-reverse-proxy","tag-spa","tag-static-files","tag-vite"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Deploy de apps JavaScript con .NET Aspire: los 3 modelos que necesit\u00e1s conocer &#183; devops Mauro Bernal<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/maurobernal.com.ar\/blog\/deploy-de-apps-javascript-con-net-aspire-los-3-modelos-que-necesitas-conocer\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Deploy de apps JavaScript con .NET Aspire: los 3 modelos que necesit\u00e1s conocer &#183; devops Mauro Bernal\" \/>\n<meta property=\"og:description\" content=\"Cuando trabajamos con aplicaciones JavaScript en .NET Aspire, uno de los puntos m\u00e1s confusos es entender c\u00f3mo se despliegan en producci\u00f3n. Durante el desarrollo local, AddViteApp levanta el servidor de...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/maurobernal.com.ar\/blog\/deploy-de-apps-javascript-con-net-aspire-los-3-modelos-que-necesitas-conocer\/\" \/>\n<meta property=\"og:site_name\" content=\"devops Mauro Bernal\" \/>\n<meta property=\"article:published_time\" content=\"2026-03-31T03:39:46+00:00\" \/>\n<meta name=\"author\" content=\"Mauro Bernal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@_maurobernal\" \/>\n<meta name=\"twitter:site\" content=\"@_maurobernal\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Mauro Bernal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/deploy-de-apps-javascript-con-net-aspire-los-3-modelos-que-necesitas-conocer\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/deploy-de-apps-javascript-con-net-aspire-los-3-modelos-que-necesitas-conocer\\\/\"},\"author\":{\"name\":\"Mauro Bernal\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\"},\"headline\":\"Deploy de apps JavaScript con .NET Aspire: los 3 modelos que necesit\u00e1s conocer\",\"datePublished\":\"2026-03-31T03:39:46+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/deploy-de-apps-javascript-con-net-aspire-los-3-modelos-que-necesitas-conocer\\\/\"},\"wordCount\":753,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\"},\"keywords\":[\".NET Aspire\",\"AddViteApp\",\"AppHost\",\"ci-cd\",\"Deploy\",\"docker\",\"dockerfile\",\"frontend\",\"javascript\",\"Node.js\",\"Reverse Proxy\",\"SPA\",\"Static Files\",\"Vite\"],\"articleSection\":[\"DotNet\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/deploy-de-apps-javascript-con-net-aspire-los-3-modelos-que-necesitas-conocer\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/deploy-de-apps-javascript-con-net-aspire-los-3-modelos-que-necesitas-conocer\\\/\",\"url\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/deploy-de-apps-javascript-con-net-aspire-los-3-modelos-que-necesitas-conocer\\\/\",\"name\":\"Deploy de apps JavaScript con .NET Aspire: los 3 modelos que necesit\u00e1s conocer &#183; devops Mauro Bernal\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#website\"},\"datePublished\":\"2026-03-31T03:39:46+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/deploy-de-apps-javascript-con-net-aspire-los-3-modelos-que-necesitas-conocer\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/deploy-de-apps-javascript-con-net-aspire-los-3-modelos-que-necesitas-conocer\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/deploy-de-apps-javascript-con-net-aspire-los-3-modelos-que-necesitas-conocer\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Deploy de apps JavaScript con .NET Aspire: los 3 modelos que necesit\u00e1s conocer\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/\",\"name\":\"devops Mauro Bernal\",\"description\":\"Cuando tu trabajo es hacer que las cosas funcionen bien...\",\"publisher\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\",\"name\":\"Mauro Bernal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logo-maurobernal.png?fit=1740%2C1740&ssl=1\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logo-maurobernal.png?fit=1740%2C1740&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logo-maurobernal.png?fit=1740%2C1740&ssl=1\",\"width\":1740,\"height\":1740,\"caption\":\"Mauro Bernal\"},\"logo\":{\"@id\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logo-maurobernal.png?fit=1740%2C1740&ssl=1\"},\"description\":\"Desarrollo de Sistemas en .Net, IT Callcenters, DBA de SQL Server, Mikrotik, Pentest y T\u00e9cnico consultor de Sistemas Bejerman\",\"sameAs\":[\"https:\\\/\\\/maurobernal.com.ar\",\"https:\\\/\\\/x.com\\\/_maurobernal\",\"https:\\\/\\\/youtube.com\\\/maurobernal\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Deploy de apps JavaScript con .NET Aspire: los 3 modelos que necesit\u00e1s conocer &#183; devops Mauro Bernal","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/maurobernal.com.ar\/blog\/deploy-de-apps-javascript-con-net-aspire-los-3-modelos-que-necesitas-conocer\/","og_locale":"es_ES","og_type":"article","og_title":"Deploy de apps JavaScript con .NET Aspire: los 3 modelos que necesit\u00e1s conocer &#183; devops Mauro Bernal","og_description":"Cuando trabajamos con aplicaciones JavaScript en .NET Aspire, uno de los puntos m\u00e1s confusos es entender c\u00f3mo se despliegan en producci\u00f3n. Durante el desarrollo local, AddViteApp levanta el servidor de...","og_url":"https:\/\/maurobernal.com.ar\/blog\/deploy-de-apps-javascript-con-net-aspire-los-3-modelos-que-necesitas-conocer\/","og_site_name":"devops Mauro Bernal","article_published_time":"2026-03-31T03:39:46+00:00","author":"Mauro Bernal","twitter_card":"summary_large_image","twitter_creator":"@_maurobernal","twitter_site":"@_maurobernal","twitter_misc":{"Escrito por":"Mauro Bernal","Tiempo de lectura":"4 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/maurobernal.com.ar\/blog\/deploy-de-apps-javascript-con-net-aspire-los-3-modelos-que-necesitas-conocer\/#article","isPartOf":{"@id":"https:\/\/maurobernal.com.ar\/blog\/deploy-de-apps-javascript-con-net-aspire-los-3-modelos-que-necesitas-conocer\/"},"author":{"name":"Mauro Bernal","@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283"},"headline":"Deploy de apps JavaScript con .NET Aspire: los 3 modelos que necesit\u00e1s conocer","datePublished":"2026-03-31T03:39:46+00:00","mainEntityOfPage":{"@id":"https:\/\/maurobernal.com.ar\/blog\/deploy-de-apps-javascript-con-net-aspire-los-3-modelos-que-necesitas-conocer\/"},"wordCount":753,"commentCount":0,"publisher":{"@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283"},"keywords":[".NET Aspire","AddViteApp","AppHost","ci-cd","Deploy","docker","dockerfile","frontend","javascript","Node.js","Reverse Proxy","SPA","Static Files","Vite"],"articleSection":["DotNet"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/maurobernal.com.ar\/blog\/deploy-de-apps-javascript-con-net-aspire-los-3-modelos-que-necesitas-conocer\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/maurobernal.com.ar\/blog\/deploy-de-apps-javascript-con-net-aspire-los-3-modelos-que-necesitas-conocer\/","url":"https:\/\/maurobernal.com.ar\/blog\/deploy-de-apps-javascript-con-net-aspire-los-3-modelos-que-necesitas-conocer\/","name":"Deploy de apps JavaScript con .NET Aspire: los 3 modelos que necesit\u00e1s conocer &#183; devops Mauro Bernal","isPartOf":{"@id":"https:\/\/maurobernal.com.ar\/blog\/#website"},"datePublished":"2026-03-31T03:39:46+00:00","breadcrumb":{"@id":"https:\/\/maurobernal.com.ar\/blog\/deploy-de-apps-javascript-con-net-aspire-los-3-modelos-que-necesitas-conocer\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/maurobernal.com.ar\/blog\/deploy-de-apps-javascript-con-net-aspire-los-3-modelos-que-necesitas-conocer\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/maurobernal.com.ar\/blog\/deploy-de-apps-javascript-con-net-aspire-los-3-modelos-que-necesitas-conocer\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/maurobernal.com.ar\/blog\/"},{"@type":"ListItem","position":2,"name":"Deploy de apps JavaScript con .NET Aspire: los 3 modelos que necesit\u00e1s conocer"}]},{"@type":"WebSite","@id":"https:\/\/maurobernal.com.ar\/blog\/#website","url":"https:\/\/maurobernal.com.ar\/blog\/","name":"devops Mauro Bernal","description":"Cuando tu trabajo es hacer que las cosas funcionen bien...","publisher":{"@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/maurobernal.com.ar\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":["Person","Organization"],"@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283","name":"Mauro Bernal","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2023\/07\/logo-maurobernal.png?fit=1740%2C1740&ssl=1","url":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2023\/07\/logo-maurobernal.png?fit=1740%2C1740&ssl=1","contentUrl":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2023\/07\/logo-maurobernal.png?fit=1740%2C1740&ssl=1","width":1740,"height":1740,"caption":"Mauro Bernal"},"logo":{"@id":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2023\/07\/logo-maurobernal.png?fit=1740%2C1740&ssl=1"},"description":"Desarrollo de Sistemas en .Net, IT Callcenters, DBA de SQL Server, Mikrotik, Pentest y T\u00e9cnico consultor de Sistemas Bejerman","sameAs":["https:\/\/maurobernal.com.ar","https:\/\/x.com\/_maurobernal","https:\/\/youtube.com\/maurobernal"]}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack-related-posts":[],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts\/1328","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/comments?post=1328"}],"version-history":[{"count":1,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts\/1328\/revisions"}],"predecessor-version":[{"id":1329,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts\/1328\/revisions\/1329"}],"wp:attachment":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/media?parent=1328"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/categories?post=1328"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/tags?post=1328"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}