[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"blog-/blog/tutorial/instalar-nextcloud-servidor":3,"prev-/blog/tutorial/instalar-nextcloud-servidor":2032,"next-/blog/tutorial/instalar-nextcloud-servidor":2035,"related-/blog/tutorial/instalar-nextcloud-servidor":2038},{"id":4,"title":5,"author":6,"authorUrl":7,"body":8,"category":1999,"cta":2000,"date":2003,"dateModified":2003,"description":2004,"draft":2005,"extension":2006,"faq":2007,"featured":2005,"image":2020,"imageAlt":2021,"meta":2022,"navigation":509,"path":2023,"readingTime":172,"seo":2024,"stem":2025,"tags":2026,"__hash__":2031},"blog/blog/tutorial/instalar-nextcloud-servidor.md","Instalar y configurar Nextcloud en tu propio servidor","Syswork México","/nosotros",{"type":9,"value":10,"toc":1970},"minimark",[11,23,36,41,44,48,59,63,71,909,931,937,992,995,999,1020,1023,1042,1049,1058,1062,1067,1079,1083,1086,1166,1170,1173,1192,1196,1200,1203,1213,1217,1220,1224,1227,1303,1309,1311,1315,1318,1322,1375,1379,1452,1456,1464,1730,1737,1741,1744,1828,1832,1836,1845,1859,1862,1866,1869,1873,1876,1882,1884,1888,1895,1901,1904,1908,1911,1957,1966],[12,13,14,15,22],"p",{},"Google Drive y OneDrive son convenientes — hasta que te preguntas dónde están realmente tus datos, quién más puede acceder a ellos y qué pasa cuando el proveedor cambia sus términos de servicio o sus precios. ",[16,17,21],"a",{"href":18,"rel":19},"https://nextcloud.com",[20],"nofollow","Nextcloud"," te da la misma experiencia de almacenamiento y colaboración en la nube, pero corriendo en tu propio servidor, con tus propias reglas y tus datos bajo tu control.",[12,24,25,26,30,31,35],{},"En esta guía vas a instalar Nextcloud con ",[16,27,29],{"href":28},"/blog/docker-compose-guia-completa","Docker Compose",", conectarlo a ",[16,32,34],{"href":33},"/tecnologias/postgresql","PostgreSQL"," como base de datos, configurar SSL y optimizarlo para uso diario de tu equipo.",[37,38,40],"h2",{"id":39},"requisitos-previos","Requisitos previos",[12,42,43],{},"Un servidor Ubuntu 24.04 con al menos 2 GB de RAM, Docker y Docker Compose instalados, un dominio que apunte al servidor y suficiente almacenamiento para tus archivos.",[37,45,47],{"id":46},"paso-1-estructura-del-proyecto","Paso 1: Estructura del proyecto",[49,50,55],"pre",{"className":51,"code":53,"language":54},[52],"language-text","nextcloud/\n├── docker-compose.yml\n├── .env\n└── data/                  # Se crea automáticamente\n","text",[56,57,53],"code",{"__ignoreMap":58},"",[37,60,62],{"id":61},"paso-2-docker-compose","Paso 2: Docker Compose",[12,64,65,66,70],{},"Esta configuración incluye Nextcloud, PostgreSQL como base de datos y ",[16,67,69],{"href":68},"/tecnologias/redis","Redis"," como caché para rendimiento óptimo:",[49,72,76],{"className":73,"code":74,"language":75,"meta":58,"style":58},"language-yaml shiki shiki-themes material-theme-lighter github-light github-dark","# docker-compose.yml\nservices:\n  nextcloud:\n    image: nextcloud:29-apache\n    restart: unless-stopped\n    environment:\n      POSTGRES_HOST: db\n      POSTGRES_DB: nextcloud\n      POSTGRES_USER: nextcloud\n      POSTGRES_PASSWORD: ${DB_PASSWORD}\n      REDIS_HOST: cache\n      NEXTCLOUD_ADMIN_USER: ${ADMIN_USER}\n      NEXTCLOUD_ADMIN_PASSWORD: ${ADMIN_PASSWORD}\n      NEXTCLOUD_TRUSTED_DOMAINS: ${DOMAIN}\n      OVERWRITEPROTOCOL: https\n      OVERWRITECLIURL: https://${DOMAIN}\n      PHP_UPLOAD_LIMIT: 10G\n      PHP_MEMORY_LIMIT: 512M\n    volumes:\n      - nc_data:/var/www/html\n    depends_on:\n      db:\n        condition: service_healthy\n      cache:\n        condition: service_started\n    networks:\n      - proxy\n      - backend\n    labels:\n      - \"traefik.enable=true\"\n      - \"traefik.http.routers.nextcloud.rule=Host(`${DOMAIN}`)\"\n      - \"traefik.http.routers.nextcloud.entrypoints=websecure\"\n      - \"traefik.http.routers.nextcloud.tls.certresolver=letsencrypt\"\n      - \"traefik.http.services.nextcloud.loadbalancer.server.port=80\"\n      # Headers requeridos por Nextcloud\n      - \"traefik.http.middlewares.nextcloud-headers.headers.stsSeconds=31536000\"\n      - \"traefik.http.middlewares.nextcloud-headers.headers.stsIncludeSubdomains=true\"\n      - \"traefik.http.middlewares.nextcloud-caldav.redirectregex.permanent=true\"\n      - \"traefik.http.middlewares.nextcloud-caldav.redirectregex.regex=^https://(.*)/.well-known/ca(l|rd)dav\"\n      - \"traefik.http.middlewares.nextcloud-caldav.redirectregex.replacement=https://$${1}/remote.php/dav/\"\n      - \"traefik.http.routers.nextcloud.middlewares=nextcloud-headers,nextcloud-caldav\"\n\n  db:\n    image: postgres:16-alpine\n    restart: unless-stopped\n    environment:\n      POSTGRES_DB: nextcloud\n      POSTGRES_USER: nextcloud\n      POSTGRES_PASSWORD: ${DB_PASSWORD}\n    volumes:\n      - pg_data:/var/lib/postgresql/data\n    healthcheck:\n      test: [\"CMD-SHELL\", \"pg_isready -U nextcloud -d nextcloud\"]\n      interval: 10s\n      timeout: 5s\n      retries: 5\n    networks:\n      - backend\n\n  cache:\n    image: redis:7-alpine\n    restart: unless-stopped\n    command: redis-server --maxmemory 128mb --maxmemory-policy allkeys-lru\n    volumes:\n      - redis_data:/data\n    networks:\n      - backend\n\n  cron:\n    image: nextcloud:29-apache\n    restart: unless-stopped\n    entrypoint: /cron.sh\n    volumes:\n      - nc_data:/var/www/html\n    depends_on:\n      - nextcloud\n    networks:\n      - backend\n\nnetworks:\n  proxy:\n    external: true\n  backend:\n\nvolumes:\n  nc_data:\n  pg_data:\n  redis_data:\n","yaml",[56,77,78,87,98,106,119,130,138,149,160,170,181,192,203,214,225,236,247,258,269,277,286,294,302,313,321,331,339,347,355,363,378,390,402,414,426,432,444,456,468,480,492,504,511,519,529,538,545,554,563,572,579,587,595,627,638,649,661,668,675,680,688,698,707,718,725,733,740,747,752,760,769,778,789,796,803,810,817,824,831,836,844,852,864,872,877,885,893,901],{"__ignoreMap":58},[79,80,83],"span",{"class":81,"line":82},"line",1,[79,84,86],{"class":85},"sutJx","# docker-compose.yml\n",[79,88,90,94],{"class":81,"line":89},2,[79,91,93],{"class":92},"sQzsp","services",[79,95,97],{"class":96},"sP7_E",":\n",[79,99,101,104],{"class":81,"line":100},3,[79,102,103],{"class":92},"  nextcloud",[79,105,97],{"class":96},[79,107,109,112,115],{"class":81,"line":108},4,[79,110,111],{"class":92},"    image",[79,113,114],{"class":96},":",[79,116,118],{"class":117},"s_sjI"," nextcloud:29-apache\n",[79,120,122,125,127],{"class":81,"line":121},5,[79,123,124],{"class":92},"    restart",[79,126,114],{"class":96},[79,128,129],{"class":117}," unless-stopped\n",[79,131,133,136],{"class":81,"line":132},6,[79,134,135],{"class":92},"    environment",[79,137,97],{"class":96},[79,139,141,144,146],{"class":81,"line":140},7,[79,142,143],{"class":92},"      POSTGRES_HOST",[79,145,114],{"class":96},[79,147,148],{"class":117}," db\n",[79,150,152,155,157],{"class":81,"line":151},8,[79,153,154],{"class":92},"      POSTGRES_DB",[79,156,114],{"class":96},[79,158,159],{"class":117}," nextcloud\n",[79,161,163,166,168],{"class":81,"line":162},9,[79,164,165],{"class":92},"      POSTGRES_USER",[79,167,114],{"class":96},[79,169,159],{"class":117},[79,171,173,176,178],{"class":81,"line":172},10,[79,174,175],{"class":92},"      POSTGRES_PASSWORD",[79,177,114],{"class":96},[79,179,180],{"class":117}," ${DB_PASSWORD}\n",[79,182,184,187,189],{"class":81,"line":183},11,[79,185,186],{"class":92},"      REDIS_HOST",[79,188,114],{"class":96},[79,190,191],{"class":117}," cache\n",[79,193,195,198,200],{"class":81,"line":194},12,[79,196,197],{"class":92},"      NEXTCLOUD_ADMIN_USER",[79,199,114],{"class":96},[79,201,202],{"class":117}," ${ADMIN_USER}\n",[79,204,206,209,211],{"class":81,"line":205},13,[79,207,208],{"class":92},"      NEXTCLOUD_ADMIN_PASSWORD",[79,210,114],{"class":96},[79,212,213],{"class":117}," ${ADMIN_PASSWORD}\n",[79,215,217,220,222],{"class":81,"line":216},14,[79,218,219],{"class":92},"      NEXTCLOUD_TRUSTED_DOMAINS",[79,221,114],{"class":96},[79,223,224],{"class":117}," ${DOMAIN}\n",[79,226,228,231,233],{"class":81,"line":227},15,[79,229,230],{"class":92},"      OVERWRITEPROTOCOL",[79,232,114],{"class":96},[79,234,235],{"class":117}," https\n",[79,237,239,242,244],{"class":81,"line":238},16,[79,240,241],{"class":92},"      OVERWRITECLIURL",[79,243,114],{"class":96},[79,245,246],{"class":117}," https://${DOMAIN}\n",[79,248,250,253,255],{"class":81,"line":249},17,[79,251,252],{"class":92},"      PHP_UPLOAD_LIMIT",[79,254,114],{"class":96},[79,256,257],{"class":117}," 10G\n",[79,259,261,264,266],{"class":81,"line":260},18,[79,262,263],{"class":92},"      PHP_MEMORY_LIMIT",[79,265,114],{"class":96},[79,267,268],{"class":117}," 512M\n",[79,270,272,275],{"class":81,"line":271},19,[79,273,274],{"class":92},"    volumes",[79,276,97],{"class":96},[79,278,280,283],{"class":81,"line":279},20,[79,281,282],{"class":96},"      -",[79,284,285],{"class":117}," nc_data:/var/www/html\n",[79,287,289,292],{"class":81,"line":288},21,[79,290,291],{"class":92},"    depends_on",[79,293,97],{"class":96},[79,295,297,300],{"class":81,"line":296},22,[79,298,299],{"class":92},"      db",[79,301,97],{"class":96},[79,303,305,308,310],{"class":81,"line":304},23,[79,306,307],{"class":92},"        condition",[79,309,114],{"class":96},[79,311,312],{"class":117}," service_healthy\n",[79,314,316,319],{"class":81,"line":315},24,[79,317,318],{"class":92},"      cache",[79,320,97],{"class":96},[79,322,324,326,328],{"class":81,"line":323},25,[79,325,307],{"class":92},[79,327,114],{"class":96},[79,329,330],{"class":117}," service_started\n",[79,332,334,337],{"class":81,"line":333},26,[79,335,336],{"class":92},"    networks",[79,338,97],{"class":96},[79,340,342,344],{"class":81,"line":341},27,[79,343,282],{"class":96},[79,345,346],{"class":117}," proxy\n",[79,348,350,352],{"class":81,"line":349},28,[79,351,282],{"class":96},[79,353,354],{"class":117}," backend\n",[79,356,358,361],{"class":81,"line":357},29,[79,359,360],{"class":92},"    labels",[79,362,97],{"class":96},[79,364,366,368,372,375],{"class":81,"line":365},30,[79,367,282],{"class":96},[79,369,371],{"class":370},"sjJ54"," \"",[79,373,374],{"class":117},"traefik.enable=true",[79,376,377],{"class":370},"\"\n",[79,379,381,383,385,388],{"class":81,"line":380},31,[79,382,282],{"class":96},[79,384,371],{"class":370},[79,386,387],{"class":117},"traefik.http.routers.nextcloud.rule=Host(`${DOMAIN}`)",[79,389,377],{"class":370},[79,391,393,395,397,400],{"class":81,"line":392},32,[79,394,282],{"class":96},[79,396,371],{"class":370},[79,398,399],{"class":117},"traefik.http.routers.nextcloud.entrypoints=websecure",[79,401,377],{"class":370},[79,403,405,407,409,412],{"class":81,"line":404},33,[79,406,282],{"class":96},[79,408,371],{"class":370},[79,410,411],{"class":117},"traefik.http.routers.nextcloud.tls.certresolver=letsencrypt",[79,413,377],{"class":370},[79,415,417,419,421,424],{"class":81,"line":416},34,[79,418,282],{"class":96},[79,420,371],{"class":370},[79,422,423],{"class":117},"traefik.http.services.nextcloud.loadbalancer.server.port=80",[79,425,377],{"class":370},[79,427,429],{"class":81,"line":428},35,[79,430,431],{"class":85},"      # Headers requeridos por Nextcloud\n",[79,433,435,437,439,442],{"class":81,"line":434},36,[79,436,282],{"class":96},[79,438,371],{"class":370},[79,440,441],{"class":117},"traefik.http.middlewares.nextcloud-headers.headers.stsSeconds=31536000",[79,443,377],{"class":370},[79,445,447,449,451,454],{"class":81,"line":446},37,[79,448,282],{"class":96},[79,450,371],{"class":370},[79,452,453],{"class":117},"traefik.http.middlewares.nextcloud-headers.headers.stsIncludeSubdomains=true",[79,455,377],{"class":370},[79,457,459,461,463,466],{"class":81,"line":458},38,[79,460,282],{"class":96},[79,462,371],{"class":370},[79,464,465],{"class":117},"traefik.http.middlewares.nextcloud-caldav.redirectregex.permanent=true",[79,467,377],{"class":370},[79,469,471,473,475,478],{"class":81,"line":470},39,[79,472,282],{"class":96},[79,474,371],{"class":370},[79,476,477],{"class":117},"traefik.http.middlewares.nextcloud-caldav.redirectregex.regex=^https://(.*)/.well-known/ca(l|rd)dav",[79,479,377],{"class":370},[79,481,483,485,487,490],{"class":81,"line":482},40,[79,484,282],{"class":96},[79,486,371],{"class":370},[79,488,489],{"class":117},"traefik.http.middlewares.nextcloud-caldav.redirectregex.replacement=https://$${1}/remote.php/dav/",[79,491,377],{"class":370},[79,493,495,497,499,502],{"class":81,"line":494},41,[79,496,282],{"class":96},[79,498,371],{"class":370},[79,500,501],{"class":117},"traefik.http.routers.nextcloud.middlewares=nextcloud-headers,nextcloud-caldav",[79,503,377],{"class":370},[79,505,507],{"class":81,"line":506},42,[79,508,510],{"emptyLinePlaceholder":509},true,"\n",[79,512,514,517],{"class":81,"line":513},43,[79,515,516],{"class":92},"  db",[79,518,97],{"class":96},[79,520,522,524,526],{"class":81,"line":521},44,[79,523,111],{"class":92},[79,525,114],{"class":96},[79,527,528],{"class":117}," postgres:16-alpine\n",[79,530,532,534,536],{"class":81,"line":531},45,[79,533,124],{"class":92},[79,535,114],{"class":96},[79,537,129],{"class":117},[79,539,541,543],{"class":81,"line":540},46,[79,542,135],{"class":92},[79,544,97],{"class":96},[79,546,548,550,552],{"class":81,"line":547},47,[79,549,154],{"class":92},[79,551,114],{"class":96},[79,553,159],{"class":117},[79,555,557,559,561],{"class":81,"line":556},48,[79,558,165],{"class":92},[79,560,114],{"class":96},[79,562,159],{"class":117},[79,564,566,568,570],{"class":81,"line":565},49,[79,567,175],{"class":92},[79,569,114],{"class":96},[79,571,180],{"class":117},[79,573,575,577],{"class":81,"line":574},50,[79,576,274],{"class":92},[79,578,97],{"class":96},[79,580,582,584],{"class":81,"line":581},51,[79,583,282],{"class":96},[79,585,586],{"class":117}," pg_data:/var/lib/postgresql/data\n",[79,588,590,593],{"class":81,"line":589},52,[79,591,592],{"class":92},"    healthcheck",[79,594,97],{"class":96},[79,596,598,601,603,606,609,612,614,617,619,622,624],{"class":81,"line":597},53,[79,599,600],{"class":92},"      test",[79,602,114],{"class":96},[79,604,605],{"class":96}," [",[79,607,608],{"class":370},"\"",[79,610,611],{"class":117},"CMD-SHELL",[79,613,608],{"class":370},[79,615,616],{"class":96},",",[79,618,371],{"class":370},[79,620,621],{"class":117},"pg_isready -U nextcloud -d nextcloud",[79,623,608],{"class":370},[79,625,626],{"class":96},"]\n",[79,628,630,633,635],{"class":81,"line":629},54,[79,631,632],{"class":92},"      interval",[79,634,114],{"class":96},[79,636,637],{"class":117}," 10s\n",[79,639,641,644,646],{"class":81,"line":640},55,[79,642,643],{"class":92},"      timeout",[79,645,114],{"class":96},[79,647,648],{"class":117}," 5s\n",[79,650,652,655,657],{"class":81,"line":651},56,[79,653,654],{"class":92},"      retries",[79,656,114],{"class":96},[79,658,660],{"class":659},"srdBf"," 5\n",[79,662,664,666],{"class":81,"line":663},57,[79,665,336],{"class":92},[79,667,97],{"class":96},[79,669,671,673],{"class":81,"line":670},58,[79,672,282],{"class":96},[79,674,354],{"class":117},[79,676,678],{"class":81,"line":677},59,[79,679,510],{"emptyLinePlaceholder":509},[79,681,683,686],{"class":81,"line":682},60,[79,684,685],{"class":92},"  cache",[79,687,97],{"class":96},[79,689,691,693,695],{"class":81,"line":690},61,[79,692,111],{"class":92},[79,694,114],{"class":96},[79,696,697],{"class":117}," redis:7-alpine\n",[79,699,701,703,705],{"class":81,"line":700},62,[79,702,124],{"class":92},[79,704,114],{"class":96},[79,706,129],{"class":117},[79,708,710,713,715],{"class":81,"line":709},63,[79,711,712],{"class":92},"    command",[79,714,114],{"class":96},[79,716,717],{"class":117}," redis-server --maxmemory 128mb --maxmemory-policy allkeys-lru\n",[79,719,721,723],{"class":81,"line":720},64,[79,722,274],{"class":92},[79,724,97],{"class":96},[79,726,728,730],{"class":81,"line":727},65,[79,729,282],{"class":96},[79,731,732],{"class":117}," redis_data:/data\n",[79,734,736,738],{"class":81,"line":735},66,[79,737,336],{"class":92},[79,739,97],{"class":96},[79,741,743,745],{"class":81,"line":742},67,[79,744,282],{"class":96},[79,746,354],{"class":117},[79,748,750],{"class":81,"line":749},68,[79,751,510],{"emptyLinePlaceholder":509},[79,753,755,758],{"class":81,"line":754},69,[79,756,757],{"class":92},"  cron",[79,759,97],{"class":96},[79,761,763,765,767],{"class":81,"line":762},70,[79,764,111],{"class":92},[79,766,114],{"class":96},[79,768,118],{"class":117},[79,770,772,774,776],{"class":81,"line":771},71,[79,773,124],{"class":92},[79,775,114],{"class":96},[79,777,129],{"class":117},[79,779,781,784,786],{"class":81,"line":780},72,[79,782,783],{"class":92},"    entrypoint",[79,785,114],{"class":96},[79,787,788],{"class":117}," /cron.sh\n",[79,790,792,794],{"class":81,"line":791},73,[79,793,274],{"class":92},[79,795,97],{"class":96},[79,797,799,801],{"class":81,"line":798},74,[79,800,282],{"class":96},[79,802,285],{"class":117},[79,804,806,808],{"class":81,"line":805},75,[79,807,291],{"class":92},[79,809,97],{"class":96},[79,811,813,815],{"class":81,"line":812},76,[79,814,282],{"class":96},[79,816,159],{"class":117},[79,818,820,822],{"class":81,"line":819},77,[79,821,336],{"class":92},[79,823,97],{"class":96},[79,825,827,829],{"class":81,"line":826},78,[79,828,282],{"class":96},[79,830,354],{"class":117},[79,832,834],{"class":81,"line":833},79,[79,835,510],{"emptyLinePlaceholder":509},[79,837,839,842],{"class":81,"line":838},80,[79,840,841],{"class":92},"networks",[79,843,97],{"class":96},[79,845,847,850],{"class":81,"line":846},81,[79,848,849],{"class":92},"  proxy",[79,851,97],{"class":96},[79,853,855,858,860],{"class":81,"line":854},82,[79,856,857],{"class":92},"    external",[79,859,114],{"class":96},[79,861,863],{"class":862},"syTEX"," true\n",[79,865,867,870],{"class":81,"line":866},83,[79,868,869],{"class":92},"  backend",[79,871,97],{"class":96},[79,873,875],{"class":81,"line":874},84,[79,876,510],{"emptyLinePlaceholder":509},[79,878,880,883],{"class":81,"line":879},85,[79,881,882],{"class":92},"volumes",[79,884,97],{"class":96},[79,886,888,891],{"class":81,"line":887},86,[79,889,890],{"class":92},"  nc_data",[79,892,97],{"class":96},[79,894,896,899],{"class":81,"line":895},87,[79,897,898],{"class":92},"  pg_data",[79,900,97],{"class":96},[79,902,904,907],{"class":81,"line":903},88,[79,905,906],{"class":92},"  redis_data",[79,908,97],{"class":96},[910,911,914],"alert",{"title":912,"type":913},"¿Sin Traefik?","info",[12,915,916,917,920,921,925,926,930],{},"Si no usas Traefik, puedes exponer Nextcloud directamente con ",[56,918,919],{},"ports: - \"8080:80\""," y poner un ",[16,922,924],{"href":923},"/blog/nginx-reverse-proxy-ssl","Nginx reverse proxy"," delante con Certbot para SSL. La configuración de este tutorial asume que tienes ",[16,927,929],{"href":928},"/blog/traefik-reverse-proxy-docker","Traefik configurado",".",[12,932,933,934,114],{},"Crea el archivo ",[56,935,936],{},".env",[49,938,942],{"className":939,"code":940,"language":941,"meta":58,"style":58},"language-bash shiki shiki-themes material-theme-lighter github-light github-dark","# .env\nDOMAIN=nube.tuempresa.com\nADMIN_USER=admin\nADMIN_PASSWORD=contraseña_admin_segura\nDB_PASSWORD=contraseña_db_segura\n","bash",[56,943,944,949,962,972,982],{"__ignoreMap":58},[79,945,946],{"class":81,"line":82},[79,947,948],{"class":85},"# .env\n",[79,950,951,955,959],{"class":81,"line":89},[79,952,954],{"class":953},"su5hD","DOMAIN",[79,956,958],{"class":957},"smGrS","=",[79,960,961],{"class":117},"nube.tuempresa.com\n",[79,963,964,967,969],{"class":81,"line":100},[79,965,966],{"class":953},"ADMIN_USER",[79,968,958],{"class":957},[79,970,971],{"class":117},"admin\n",[79,973,974,977,979],{"class":81,"line":108},[79,975,976],{"class":953},"ADMIN_PASSWORD",[79,978,958],{"class":957},[79,980,981],{"class":117},"contraseña_admin_segura\n",[79,983,984,987,989],{"class":81,"line":121},[79,985,986],{"class":953},"DB_PASSWORD",[79,988,958],{"class":957},[79,990,991],{"class":117},"contraseña_db_segura\n",[993,994],"ad-banner",{},[37,996,998],{"id":997},"paso-3-levantar-nextcloud","Paso 3: Levantar Nextcloud",[49,1000,1002],{"className":939,"code":1001,"language":941,"meta":58,"style":58},"docker compose up -d\n",[56,1003,1004],{"__ignoreMap":58},[79,1005,1006,1010,1013,1016],{"class":81,"line":82},[79,1007,1009],{"class":1008},"sbgvK","docker",[79,1011,1012],{"class":117}," compose",[79,1014,1015],{"class":117}," up",[79,1017,1019],{"class":1018},"stzsN"," -d\n",[12,1021,1022],{},"La primera ejecución toma 1-2 minutos mientras Nextcloud configura la base de datos y crea los archivos iniciales. Revisa los logs:",[49,1024,1026],{"className":939,"code":1025,"language":941,"meta":58,"style":58},"docker compose logs -f nextcloud\n",[56,1027,1028],{"__ignoreMap":58},[79,1029,1030,1032,1034,1037,1040],{"class":81,"line":82},[79,1031,1009],{"class":1008},[79,1033,1012],{"class":117},[79,1035,1036],{"class":117}," logs",[79,1038,1039],{"class":1018}," -f",[79,1041,159],{"class":117},[12,1043,1044,1045,1048],{},"Cuando veas ",[56,1046,1047],{},"Apache/2.4.x configured -- resuming normal operations",", Nextcloud está listo.",[12,1050,1051,1052,1055,1056,930],{},"Accede a ",[56,1053,1054],{},"https://nube.tuempresa.com"," e inicia sesión con las credenciales de admin que definiste en ",[56,1057,936],{},[37,1059,1061],{"id":1060},"paso-4-configuración-post-instalación","Paso 4: Configuración post-instalación",[1063,1064,1066],"h3",{"id":1065},"configurar-el-cron-job","Configurar el cron job",[12,1068,1069,1070,1073,1074,1078],{},"Nextcloud necesita ejecutar tareas en segundo plano (limpieza, generación de previews, notificaciones). El contenedor ",[56,1071,1072],{},"cron"," que agregamos se encarga de esto. Verifica en ",[1075,1076,1077],"strong",{},"Configuración → Ajustes básicos → Tareas en segundo plano"," que esté seleccionado \"Cron\".",[1063,1080,1082],{"id":1081},"optimizar-php","Optimizar PHP",[12,1084,1085],{},"Dentro del contenedor, ajusta la configuración de PHP para archivos grandes:",[49,1087,1089],{"className":939,"code":1088,"language":941,"meta":58,"style":58},"docker compose exec nextcloud bash -c \"cat >> /usr/local/etc/php/conf.d/custom.ini \u003C\u003CEOF\nupload_max_filesize=10G\npost_max_size=10G\nmax_execution_time=3600\nmax_input_time=3600\nmemory_limit=512M\noutput_buffering=0\nEOF\"\n\ndocker compose restart nextcloud\n",[56,1090,1091,1114,1119,1124,1129,1134,1139,1144,1151,1155],{"__ignoreMap":58},[79,1092,1093,1095,1097,1100,1103,1106,1109,1111],{"class":81,"line":82},[79,1094,1009],{"class":1008},[79,1096,1012],{"class":117},[79,1098,1099],{"class":117}," exec",[79,1101,1102],{"class":117}," nextcloud",[79,1104,1105],{"class":117}," bash",[79,1107,1108],{"class":1018}," -c",[79,1110,371],{"class":370},[79,1112,1113],{"class":117},"cat >> /usr/local/etc/php/conf.d/custom.ini \u003C\u003CEOF\n",[79,1115,1116],{"class":81,"line":89},[79,1117,1118],{"class":117},"upload_max_filesize=10G\n",[79,1120,1121],{"class":81,"line":100},[79,1122,1123],{"class":117},"post_max_size=10G\n",[79,1125,1126],{"class":81,"line":108},[79,1127,1128],{"class":117},"max_execution_time=3600\n",[79,1130,1131],{"class":81,"line":121},[79,1132,1133],{"class":117},"max_input_time=3600\n",[79,1135,1136],{"class":81,"line":132},[79,1137,1138],{"class":117},"memory_limit=512M\n",[79,1140,1141],{"class":81,"line":140},[79,1142,1143],{"class":117},"output_buffering=0\n",[79,1145,1146,1149],{"class":81,"line":151},[79,1147,1148],{"class":117},"EOF",[79,1150,377],{"class":370},[79,1152,1153],{"class":81,"line":162},[79,1154,510],{"emptyLinePlaceholder":509},[79,1156,1157,1159,1161,1164],{"class":81,"line":172},[79,1158,1009],{"class":1008},[79,1160,1012],{"class":117},[79,1162,1163],{"class":117}," restart",[79,1165,159],{"class":117},[1063,1167,1169],{"id":1168},"configurar-almacenamiento-externo-opcional","Configurar almacenamiento externo (opcional)",[12,1171,1172],{},"Si tienes un NAS o quieres conectar almacenamiento S3, habilita la app \"External Storage\" en Nextcloud:",[1174,1175,1176,1184,1189],"ol",{},[1177,1178,1179,1180,1183],"li",{},"Ve a ",[1075,1181,1182],{},"Apps → Archivos → External storage support"," → Habilitar",[1177,1185,1179,1186],{},[1075,1187,1188],{},"Configuración → Almacenamiento externo",[1177,1190,1191],{},"Agrega tu almacenamiento (SMB/CIFS, S3, WebDAV, FTP, SFTP)",[37,1193,1195],{"id":1194},"paso-5-seguridad","Paso 5: Seguridad",[1063,1197,1199],{"id":1198},"autenticación-de-dos-factores-2fa","Autenticación de dos factores (2FA)",[12,1201,1202],{},"Habilita TOTP para todos los usuarios:",[1174,1204,1205,1210],{},[1177,1206,1179,1207,1183],{},[1075,1208,1209],{},"Apps → Seguridad → Two-Factor TOTP Provider",[1177,1211,1212],{},"Cada usuario activa 2FA desde su perfil con Google Authenticator o similar",[1063,1214,1216],{"id":1215},"fuerza-bruta-protección-incluida","Fuerza bruta (protección incluida)",[12,1218,1219],{},"Nextcloud incluye protección contra fuerza bruta por defecto. Si alguien falla el login varias veces, el acceso se retrasa progresivamente.",[1063,1221,1223],{"id":1222},"antivirus-escaneo-de-archivos-subidos","Antivirus (escaneo de archivos subidos)",[12,1225,1226],{},"Si tus usuarios suben archivos de fuentes externas, instala ClamAV:",[49,1228,1230],{"className":73,"code":1229,"language":75,"meta":58,"style":58},"# Agregar al docker-compose.yml\n  clamav:\n    image: clamav/clamav:stable\n    restart: unless-stopped\n    volumes:\n      - clam_data:/var/lib/clamav\n    networks:\n      - backend\n\nvolumes:\n  clam_data:\n",[56,1231,1232,1237,1244,1253,1261,1267,1274,1280,1286,1290,1296],{"__ignoreMap":58},[79,1233,1234],{"class":81,"line":82},[79,1235,1236],{"class":85},"# Agregar al docker-compose.yml\n",[79,1238,1239,1242],{"class":81,"line":89},[79,1240,1241],{"class":92},"  clamav",[79,1243,97],{"class":96},[79,1245,1246,1248,1250],{"class":81,"line":100},[79,1247,111],{"class":92},[79,1249,114],{"class":96},[79,1251,1252],{"class":117}," clamav/clamav:stable\n",[79,1254,1255,1257,1259],{"class":81,"line":108},[79,1256,124],{"class":92},[79,1258,114],{"class":96},[79,1260,129],{"class":117},[79,1262,1263,1265],{"class":81,"line":121},[79,1264,274],{"class":92},[79,1266,97],{"class":96},[79,1268,1269,1271],{"class":81,"line":132},[79,1270,282],{"class":96},[79,1272,1273],{"class":117}," clam_data:/var/lib/clamav\n",[79,1275,1276,1278],{"class":81,"line":140},[79,1277,336],{"class":92},[79,1279,97],{"class":96},[79,1281,1282,1284],{"class":81,"line":151},[79,1283,282],{"class":96},[79,1285,354],{"class":117},[79,1287,1288],{"class":81,"line":162},[79,1289,510],{"emptyLinePlaceholder":509},[79,1291,1292,1294],{"class":81,"line":172},[79,1293,882],{"class":92},[79,1295,97],{"class":96},[79,1297,1298,1301],{"class":81,"line":183},[79,1299,1300],{"class":92},"  clam_data",[79,1302,97],{"class":96},[12,1304,1305,1306,930],{},"Luego habilita la app \"Antivirus for files\" en Nextcloud y configúrala para conectar con el contenedor ClamAV en ",[56,1307,1308],{},"clamav:3310",[993,1310],{},[37,1312,1314],{"id":1313},"paso-6-backup","Paso 6: Backup",[12,1316,1317],{},"Un Nextcloud sin backup es un desastre esperando ocurrir. Necesitas respaldar tres cosas:",[1063,1319,1321],{"id":1320},"_1-base-de-datos-postgresql","1. Base de datos PostgreSQL",[49,1323,1325],{"className":939,"code":1324,"language":941,"meta":58,"style":58},"docker compose exec db pg_dump -U nextcloud nextcloud | gzip > backup_db_$(date +%Y%m%d).sql.gz\n",[56,1326,1327],{"__ignoreMap":58},[79,1328,1329,1331,1333,1335,1338,1341,1344,1346,1348,1351,1354,1357,1360,1363,1366,1369,1372],{"class":81,"line":82},[79,1330,1009],{"class":1008},[79,1332,1012],{"class":117},[79,1334,1099],{"class":117},[79,1336,1337],{"class":117}," db",[79,1339,1340],{"class":117}," pg_dump",[79,1342,1343],{"class":1018}," -U",[79,1345,1102],{"class":117},[79,1347,1102],{"class":117},[79,1349,1350],{"class":957}," |",[79,1352,1353],{"class":1008}," gzip",[79,1355,1356],{"class":957}," >",[79,1358,1359],{"class":117}," backup_db_",[79,1361,1362],{"class":96},"$(",[79,1364,1365],{"class":1008},"date",[79,1367,1368],{"class":117}," +%Y%m%d",[79,1370,1371],{"class":96},")",[79,1373,1374],{"class":117},".sql.gz\n",[1063,1376,1378],{"id":1377},"_2-datos-de-nextcloud-archivos-de-usuarios","2. Datos de Nextcloud (archivos de usuarios)",[49,1380,1382],{"className":939,"code":1381,"language":941,"meta":58,"style":58},"docker run --rm -v nextcloud_nc_data:/data -v $(pwd)/backups:/backup alpine \\\n  tar czf /backup/nc_data_$(date +%Y%m%d).tar.gz -C /data .\n",[56,1383,1384,1421],{"__ignoreMap":58},[79,1385,1386,1388,1391,1394,1397,1400,1402,1405,1409,1411,1414,1417],{"class":81,"line":82},[79,1387,1009],{"class":1008},[79,1389,1390],{"class":117}," run",[79,1392,1393],{"class":1018}," --rm",[79,1395,1396],{"class":1018}," -v",[79,1398,1399],{"class":117}," nextcloud_nc_data:/data",[79,1401,1396],{"class":1018},[79,1403,1404],{"class":96}," $(",[79,1406,1408],{"class":1407},"sptTA","pwd",[79,1410,1371],{"class":96},[79,1412,1413],{"class":117},"/backups:/backup",[79,1415,1416],{"class":117}," alpine",[79,1418,1420],{"class":1419},"s_hVV"," \\\n",[79,1422,1423,1426,1429,1432,1434,1436,1438,1440,1443,1446,1449],{"class":81,"line":89},[79,1424,1425],{"class":117},"  tar",[79,1427,1428],{"class":117}," czf",[79,1430,1431],{"class":117}," /backup/nc_data_",[79,1433,1362],{"class":96},[79,1435,1365],{"class":1008},[79,1437,1368],{"class":117},[79,1439,1371],{"class":96},[79,1441,1442],{"class":117},".tar.gz",[79,1444,1445],{"class":1018}," -C",[79,1447,1448],{"class":117}," /data",[79,1450,1451],{"class":117}," .\n",[1063,1453,1455],{"id":1454},"_3-script-de-backup-automatizado","3. Script de backup automatizado",[12,1457,1458,1459,1463],{},"Combina ambos en un script y prográmalo con cron — o usa el ",[16,1460,1462],{"href":1461},"/blog/backup-automatizado-python-cron","script de backup con Python"," que ya creamos:",[49,1465,1467],{"className":939,"code":1466,"language":941,"meta":58,"style":58},"#!/bin/bash\n# backup-nextcloud.sh\nBACKUP_DIR=\"/var/backups/nextcloud/$(date +%Y%m%d)\"\nmkdir -p \"$BACKUP_DIR\"\n\necho \"Activando modo mantenimiento...\"\ndocker compose exec -T nextcloud php occ maintenance:mode --on\n\necho \"Respaldando base de datos...\"\ndocker compose exec -T db pg_dump -U nextcloud nextcloud | gzip > \"$BACKUP_DIR/db.sql.gz\"\n\necho \"Respaldando archivos...\"\ndocker run --rm -v nextcloud_nc_data:/data -v \"$BACKUP_DIR\":/backup alpine \\\n  tar czf /backup/data.tar.gz -C /data .\n\necho \"Desactivando modo mantenimiento...\"\ndocker compose exec -T nextcloud php occ maintenance:mode --off\n\necho \"Backup completado en $BACKUP_DIR\"\nls -lh \"$BACKUP_DIR\"\n",[56,1468,1469,1474,1479,1500,1515,1519,1531,1556,1560,1571,1606,1610,1621,1648,1663,1667,1678,1699,1703,1716],{"__ignoreMap":58},[79,1470,1471],{"class":81,"line":82},[79,1472,1473],{"class":85},"#!/bin/bash\n",[79,1475,1476],{"class":81,"line":89},[79,1477,1478],{"class":85},"# backup-nextcloud.sh\n",[79,1480,1481,1484,1486,1488,1491,1493,1495,1497],{"class":81,"line":100},[79,1482,1483],{"class":953},"BACKUP_DIR",[79,1485,958],{"class":957},[79,1487,608],{"class":370},[79,1489,1490],{"class":117},"/var/backups/nextcloud/",[79,1492,1362],{"class":370},[79,1494,1365],{"class":1008},[79,1496,1368],{"class":117},[79,1498,1499],{"class":370},")\"\n",[79,1501,1502,1505,1508,1510,1513],{"class":81,"line":108},[79,1503,1504],{"class":1008},"mkdir",[79,1506,1507],{"class":1018}," -p",[79,1509,371],{"class":370},[79,1511,1512],{"class":953},"$BACKUP_DIR",[79,1514,377],{"class":370},[79,1516,1517],{"class":81,"line":121},[79,1518,510],{"emptyLinePlaceholder":509},[79,1520,1521,1524,1526,1529],{"class":81,"line":132},[79,1522,1523],{"class":1407},"echo",[79,1525,371],{"class":370},[79,1527,1528],{"class":117},"Activando modo mantenimiento...",[79,1530,377],{"class":370},[79,1532,1533,1535,1537,1539,1542,1544,1547,1550,1553],{"class":81,"line":140},[79,1534,1009],{"class":1008},[79,1536,1012],{"class":117},[79,1538,1099],{"class":117},[79,1540,1541],{"class":1018}," -T",[79,1543,1102],{"class":117},[79,1545,1546],{"class":117}," php",[79,1548,1549],{"class":117}," occ",[79,1551,1552],{"class":117}," maintenance:mode",[79,1554,1555],{"class":1018}," --on\n",[79,1557,1558],{"class":81,"line":151},[79,1559,510],{"emptyLinePlaceholder":509},[79,1561,1562,1564,1566,1569],{"class":81,"line":162},[79,1563,1523],{"class":1407},[79,1565,371],{"class":370},[79,1567,1568],{"class":117},"Respaldando base de datos...",[79,1570,377],{"class":370},[79,1572,1573,1575,1577,1579,1581,1583,1585,1587,1589,1591,1593,1595,1597,1599,1601,1604],{"class":81,"line":172},[79,1574,1009],{"class":1008},[79,1576,1012],{"class":117},[79,1578,1099],{"class":117},[79,1580,1541],{"class":1018},[79,1582,1337],{"class":117},[79,1584,1340],{"class":117},[79,1586,1343],{"class":1018},[79,1588,1102],{"class":117},[79,1590,1102],{"class":117},[79,1592,1350],{"class":957},[79,1594,1353],{"class":1008},[79,1596,1356],{"class":957},[79,1598,371],{"class":370},[79,1600,1512],{"class":953},[79,1602,1603],{"class":117},"/db.sql.gz",[79,1605,377],{"class":370},[79,1607,1608],{"class":81,"line":183},[79,1609,510],{"emptyLinePlaceholder":509},[79,1611,1612,1614,1616,1619],{"class":81,"line":194},[79,1613,1523],{"class":1407},[79,1615,371],{"class":370},[79,1617,1618],{"class":117},"Respaldando archivos...",[79,1620,377],{"class":370},[79,1622,1623,1625,1627,1629,1631,1633,1635,1637,1639,1641,1644,1646],{"class":81,"line":205},[79,1624,1009],{"class":1008},[79,1626,1390],{"class":117},[79,1628,1393],{"class":1018},[79,1630,1396],{"class":1018},[79,1632,1399],{"class":117},[79,1634,1396],{"class":1018},[79,1636,371],{"class":370},[79,1638,1512],{"class":953},[79,1640,608],{"class":370},[79,1642,1643],{"class":117},":/backup",[79,1645,1416],{"class":117},[79,1647,1420],{"class":1419},[79,1649,1650,1652,1654,1657,1659,1661],{"class":81,"line":216},[79,1651,1425],{"class":117},[79,1653,1428],{"class":117},[79,1655,1656],{"class":117}," /backup/data.tar.gz",[79,1658,1445],{"class":1018},[79,1660,1448],{"class":117},[79,1662,1451],{"class":117},[79,1664,1665],{"class":81,"line":227},[79,1666,510],{"emptyLinePlaceholder":509},[79,1668,1669,1671,1673,1676],{"class":81,"line":238},[79,1670,1523],{"class":1407},[79,1672,371],{"class":370},[79,1674,1675],{"class":117},"Desactivando modo mantenimiento...",[79,1677,377],{"class":370},[79,1679,1680,1682,1684,1686,1688,1690,1692,1694,1696],{"class":81,"line":249},[79,1681,1009],{"class":1008},[79,1683,1012],{"class":117},[79,1685,1099],{"class":117},[79,1687,1541],{"class":1018},[79,1689,1102],{"class":117},[79,1691,1546],{"class":117},[79,1693,1549],{"class":117},[79,1695,1552],{"class":117},[79,1697,1698],{"class":1018}," --off\n",[79,1700,1701],{"class":81,"line":260},[79,1702,510],{"emptyLinePlaceholder":509},[79,1704,1705,1707,1709,1712,1714],{"class":81,"line":271},[79,1706,1523],{"class":1407},[79,1708,371],{"class":370},[79,1710,1711],{"class":117},"Backup completado en ",[79,1713,1512],{"class":953},[79,1715,377],{"class":370},[79,1717,1718,1721,1724,1726,1728],{"class":81,"line":279},[79,1719,1720],{"class":1008},"ls",[79,1722,1723],{"class":1018}," -lh",[79,1725,371],{"class":370},[79,1727,1512],{"class":953},[79,1729,377],{"class":370},[910,1731,1734],{"title":1732,"type":1733},"Modo mantenimiento","warning",[12,1735,1736],{},"Activar el modo mantenimiento antes del backup garantiza que no haya escrituras durante el proceso. Es molesto por unos minutos, pero evita inconsistencias. Programa el backup a las 3 AM cuando nadie trabaja.",[37,1738,1740],{"id":1739},"paso-7-apps-recomendadas","Paso 7: Apps recomendadas",[12,1742,1743],{},"Nextcloud tiene un ecosistema de apps que extienden su funcionalidad. Las más útiles para empresas:",[1745,1746,1747,1760],"table",{},[1748,1749,1750],"thead",{},[1751,1752,1753,1757],"tr",{},[1754,1755,1756],"th",{},"App",[1754,1758,1759],{},"Función",[1761,1762,1763,1772,1780,1788,1796,1804,1812,1820],"tbody",{},[1751,1764,1765,1769],{},[1766,1767,1768],"td",{},"Collabora Online / OnlyOffice",[1766,1770,1771],{},"Edición de documentos en el navegador (como Google Docs)",[1751,1773,1774,1777],{},[1766,1775,1776],{},"Talk",[1766,1778,1779],{},"Videoconferencia y chat (alternativa a Zoom/Teams)",[1751,1781,1782,1785],{},[1766,1783,1784],{},"Calendar",[1766,1786,1787],{},"Calendario compartido con CalDAV",[1751,1789,1790,1793],{},[1766,1791,1792],{},"Contacts",[1766,1794,1795],{},"Directorio de contactos con CardDAV",[1751,1797,1798,1801],{},[1766,1799,1800],{},"Mail",[1766,1802,1803],{},"Cliente de correo integrado",[1751,1805,1806,1809],{},[1766,1807,1808],{},"Deck",[1766,1810,1811],{},"Tableros Kanban para gestión de tareas",[1751,1813,1814,1817],{},[1766,1815,1816],{},"Forms",[1766,1818,1819],{},"Formularios y encuestas (alternativa a Google Forms)",[1751,1821,1822,1825],{},[1766,1823,1824],{},"Group Folders",[1766,1826,1827],{},"Carpetas compartidas por grupo con cuotas",[37,1829,1831],{"id":1830},"paso-8-conectar-clientes","Paso 8: Conectar clientes",[1063,1833,1835],{"id":1834},"escritorio-windows-macos-linux","Escritorio (Windows, macOS, Linux)",[12,1837,1838,1839,1844],{},"Descarga el ",[16,1840,1843],{"href":1841,"rel":1842},"https://nextcloud.com/install/#install-clients",[20],"cliente de escritorio de Nextcloud",". Configura:",[1846,1847,1848,1853,1856],"ul",{},[1177,1849,1850,1851],{},"Servidor: ",[56,1852,1054],{},[1177,1854,1855],{},"Usuario y contraseña (o app password si tienes 2FA)",[1177,1857,1858],{},"Selecciona qué carpetas sincronizar",[12,1860,1861],{},"Los archivos se sincronizan automáticamente — igual que Dropbox o OneDrive.",[1063,1863,1865],{"id":1864},"móvil-ios-y-android","Móvil (iOS y Android)",[12,1867,1868],{},"Descarga la app Nextcloud desde App Store o Play Store. Además de archivos, puedes configurar la subida automática de fotos como reemplazo de Google Photos.",[1063,1870,1872],{"id":1871},"webdav","WebDAV",[12,1874,1875],{},"Cualquier aplicación que soporte WebDAV puede conectarse directamente:",[49,1877,1880],{"className":1878,"code":1879,"language":54},[52],"https://nube.tuempresa.com/remote.php/dav/files/usuario/\n",[56,1881,1879],{"__ignoreMap":58},[993,1883],{},[37,1885,1887],{"id":1886},"verificación-de-seguridad","Verificación de seguridad",[12,1889,1890,1891,1894],{},"Nextcloud incluye un escáner de seguridad integrado. Ve a ",[1075,1892,1893],{},"Configuración → Información general"," y revisa las advertencias. También puedes usar el escáner externo:",[49,1896,1899],{"className":1897,"code":1898,"language":54},[52],"https://scan.nextcloud.com\n",[56,1900,1898],{"__ignoreMap":58},[12,1902,1903],{},"Introduce tu dominio y verifica que tu instalación cumple con las mejores prácticas de seguridad.",[37,1905,1907],{"id":1906},"siguientes-pasos","Siguientes pasos",[12,1909,1910],{},"Con Nextcloud corriendo, puedes expandir:",[1846,1912,1913,1919,1925,1936,1948],{},[1177,1914,1915,1918],{},[1075,1916,1917],{},"Integración con Active Directory/LDAP"," — para que los usuarios de tu red corporativa accedan con sus credenciales existentes",[1177,1920,1921,1924],{},[1075,1922,1923],{},"Collabora Online"," — edición de documentos colaborativa en el navegador sin salir de Nextcloud",[1177,1926,1927,1930,1931,1935],{},[1075,1928,1929],{},"Almacenamiento S3"," — almacenamiento primario o secundario en ",[16,1932,1934],{"href":1933},"/servicios/cloud","AWS S3"," para escalar sin límite",[1177,1937,1938,1944,1945],{},[1075,1939,1940],{},[16,1941,1943],{"href":1942},"/blog/monitoreo-grafana-prometheus","Monitoreo"," — métricas de Nextcloud en Prometheus/Grafana con el endpoint ",[56,1946,1947],{},"/ocs/v2.php/apps/serverinfo/api/v1/info",[1177,1949,1950,1956],{},[1075,1951,1952],{},[16,1953,1955],{"href":1954},"/servicios/ciberseguridad","Ciberseguridad"," — auditoría de tu instalación Nextcloud para cumplir con LFPDPPP y políticas de protección de datos",[1958,1959],"call-to-action",{"description":1960,"eyebrow":1961,"icon":1962,"label":1963,"title":1964,"to":1965},"Implementamos Nextcloud para tu empresa con Active Directory, almacenamiento escalable, backup automatizado y soporte continuo.","Almacenamiento empresarial","i-lucide-hard-drive","Solicitar evaluación","¿Quieres tus datos bajo tu propio control?","/contacto",[1967,1968,1969],"style",{},"html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .sQzsp, html code.shiki .sQzsp{--shiki-light:#E53935;--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .syTEX, html code.shiki .syTEX{--shiki-light:#FF5370;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .stzsN, html code.shiki .stzsN{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sptTA, html code.shiki .sptTA{--shiki-light:#6182B8;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":58,"searchDepth":89,"depth":100,"links":1971},[1972,1973,1974,1975,1976,1981,1986,1991,1992,1997,1998],{"id":39,"depth":89,"text":40},{"id":46,"depth":89,"text":47},{"id":61,"depth":89,"text":62},{"id":997,"depth":89,"text":998},{"id":1060,"depth":89,"text":1061,"children":1977},[1978,1979,1980],{"id":1065,"depth":100,"text":1066},{"id":1081,"depth":100,"text":1082},{"id":1168,"depth":100,"text":1169},{"id":1194,"depth":89,"text":1195,"children":1982},[1983,1984,1985],{"id":1198,"depth":100,"text":1199},{"id":1215,"depth":100,"text":1216},{"id":1222,"depth":100,"text":1223},{"id":1313,"depth":89,"text":1314,"children":1987},[1988,1989,1990],{"id":1320,"depth":100,"text":1321},{"id":1377,"depth":100,"text":1378},{"id":1454,"depth":100,"text":1455},{"id":1739,"depth":89,"text":1740},{"id":1830,"depth":89,"text":1831,"children":1993},[1994,1995,1996],{"id":1834,"depth":100,"text":1835},{"id":1864,"depth":100,"text":1865},{"id":1871,"depth":100,"text":1872},{"id":1886,"depth":89,"text":1887},{"id":1906,"depth":89,"text":1907},"tutorial",{"title":2001,"description":2002,"label":1963,"to":1965,"icon":1962},"¿Necesitas almacenamiento empresarial bajo tu control?","Implementamos Nextcloud para tu empresa con integración a Active Directory, almacenamiento escalable y soporte continuo.","2026-01-05","Guía completa para instalar Nextcloud con Docker Compose, configurar almacenamiento, SSL con Traefik y optimización para usar como alternativa a Google Drive o OneDrive bajo tu propio control.",false,"md",[2008,2011,2014,2017],{"question":2009,"answer":2010},"¿Nextcloud es una alternativa real a Google Drive o OneDrive?","Sí. Nextcloud ofrece almacenamiento de archivos, sincronización entre dispositivos, carpetas compartidas, edición colaborativa de documentos (con Collabora o OnlyOffice), calendario, contactos, videoconferencia y más. La diferencia clave es que tus datos viven en tu servidor — no en los servidores de Google o Microsoft. Para empresas que manejan información sensible o regulada, eso es crítico.",{"question":2012,"answer":2013},"¿Cuánto almacenamiento necesito?","Depende del uso. Para un equipo de 10-20 personas con documentos y archivos de oficina, 500 GB a 1 TB es suficiente para empezar. Si manejan video, diseño gráfico o imágenes pesadas, planifica 2-5 TB. Nextcloud soporta almacenamiento externo (NFS, S3, SMB) para escalar sin migrar.",{"question":2015,"answer":2016},"¿Los usuarios pueden sincronizar archivos desde su computadora y celular?","Sí. Nextcloud tiene aplicaciones de escritorio (Windows, macOS, Linux) y móviles (iOS, Android) que sincronizan archivos automáticamente — igual que Dropbox o OneDrive. Los usuarios ni notan la diferencia, pero tus datos están en tu infraestructura.",{"question":2018,"answer":2019},"¿Es difícil de mantener?","Con Docker, el mantenimiento es mínimo. Las actualizaciones se hacen cambiando la versión de la imagen en el docker-compose.yml y haciendo docker compose pull && docker compose up -d. Los backups se automatizan con un script que respalda la base de datos y el volumen de archivos.","/images/blog/nextcloud-instalacion.jpg","Interfaz web de Nextcloud mostrando el explorador de archivos con carpetas compartidas y documentos",{},"/blog/tutorial/instalar-nextcloud-servidor",{"title":5,"description":2004},"blog/tutorial/instalar-nextcloud-servidor",[2027,1009,2028,2029,2030,1999],"nextcloud","almacenamiento","linux","privacidad","_dKxtCT-gAO23gT1jAIHTEtCiGnPkW9dQ4VMw1WKGAk",{"path":2033,"title":2034},"/blog/tutorial/configurar-raid-software-linux","Configurar RAID por software en un servidor Linux",{"path":2036,"title":2037},"/blog/tutorial/respaldos-incrementales-rsync-bash","Respaldos incrementales con rsync y scripts Bash",[2039,2046,2053],{"path":2040,"title":2041,"description":2042,"date":2043,"category":1999,"image":2044,"imageAlt":2045,"readingTime":194},"/blog/tutorial/apis-rest-python-fastapi","Crear APIs REST con Python y FastAPI para integraciones empresariales","Guía paso a paso para construir una API REST profesional con Python y FastAPI que conecte tu ERP, CRM o cualquier sistema con validación, autenticación y documentación automática.","2026-03-04","/images/blog/fastapi-api-rest.jpg","Editor de código mostrando una API FastAPI con documentación Swagger generada automáticamente",{"path":2047,"title":2048,"description":2049,"date":2050,"category":1999,"image":2051,"imageAlt":2052,"readingTime":151},"/blog/tutorial/configurar-firewall-ufw-linux","Configurar firewall en Linux con UFW — reglas esenciales","Guía paso a paso para configurar UFW (Uncomplicated Firewall) en Ubuntu y Debian con las reglas esenciales para proteger servidores de producción.","2026-03-01","/images/blog/ufw-firewall-linux.jpg","Terminal de Linux mostrando reglas de firewall UFW activas protegiendo un servidor de producción",{"path":2054,"title":2055,"description":2056,"date":2057,"category":1999,"image":2058,"imageAlt":2059,"readingTime":172},"/blog/tutorial/traefik-reverse-proxy-docker","Configurar Traefik como reverse proxy para contenedores Docker","Guía paso a paso para instalar Traefik como reverse proxy con descubrimiento automático de contenedores Docker, SSL con Let's Encrypt y dashboard de monitoreo.","2026-02-28","/images/blog/traefik-docker.jpg","Dashboard de Traefik mostrando rutas automáticas hacia múltiples contenedores Docker con SSL activo"]