Saltar al contenido
megapromotingVamos a hablar

Experiencia · Infraestructura y operación

Ponemos la aplicación en un servidor que controlamos, con publicación reversible, copias de seguridad verificadas y un lugar donde se ve cuándo algo se ha caído.

Alojamiento, puesta en marcha, monitorización y continuidad para aplicaciones web y plataformas con base de datos. Trabajamos sobre una infraestructura que el cliente puede reclamar: máquinas virtuales en proveedores europeos, nginx, procesos bajo supervisión, contenedores, base de datos autogestionada. Incluye la respuesta a la pregunta «dónde están realmente mis datos».

Ya construidoOperăm în acest fel mai multe sisteme proprii, iar configurațiile sunt în depozite, nu doar pe servere. Site-ul acesta rulează pe nginx cu Next.js 16 sub PM2, la OVHcloud București. Platforma de asistenți rulează pe Microsoft Azure, Poland Central, cu MySQL, Redis și RabbitMQ în containere legate la interfața locală. O platformă civică proprie folosește unități systemd cu publicare prin comutare atomică de legătură simbolică, copie de siguranță zilnică verificată și o sarcină separată de retenție care rulează numai dacă acea copie a reușit. Un board intern se publică prin runner propriu, cu acțiuni GitHub fixate pe amprentă completă și cu revenire automată la versiunea anterioară dacă verificarea de sănătate cade după publicare. Rezerva care trebuie spusă: gradul de automatizare diferă de la sistem la sistem. Publicarea acestui site se face încă manual, iar migrările de bază de date sunt aplicate cu mâna, deliberat. Nu vindem un lanț automat pe care nu îl avem peste tot.

Una aplicación que funciona en el portátil y una que funciona en producción se diferencian por cosas que no se ven en la interfaz: qué pasa cuando el proceso muere a las tres de la mañana, qué pasa cuando una publicación sale mal, adónde llegan los registros, quién se entera primero de que algo cayó y desde dónde se recupera la base de datos si el disco desaparece. Este servicio se ocupa exactamente de esa parte.

La elección básica que proponemos es la infraestructura que el cliente puede reclamar: una máquina virtual en un proveedor europeo, nginx delante, procesos bajo un supervisor, contenedores donde tiene sentido, base de datos autohospedada donde la independencia importa más que la comodidad. No porque las plataformas gestionadas sean malas, sino porque algún día quieres poder llevarte todo e irte, y si eso no se pensó desde el principio, ya no se puede hacer barato.

La pregunta sobre la soberanía de los datos tiene una sola respuesta honesta: una verificada. La ubicación se confirma consultando el servicio de metadatos de la máquina virtual y el registro de la dirección, no leyendo la página de marketing del proveedor. La diferencia no es teórica — para una transferencia dentro del Espacio Económico Europeo, el capítulo de transferencias de la Ley 195/2024 simplemente no se aplica. Una migración hecha por nosotros trasladó una plataforma de una base de datos alojada en Estados Unidos a una pila autoalojada en la Unión Europea, precisamente por este motivo.

Lo que no prometemos: que todo sea automático. Las migraciones de esquema las aplicamos a mano, deliberadamente, porque una migración aplicada automáticamente en producción por una cadena que no sabe qué hay en la tabla es la forma habitual en que se pierden datos. La publicación del código se automatiza; el cambio de la estructura de la base sigue siendo una decisión humana, con una copia de seguridad reciente detrás.

Qué incluye

El trabajo, por componentes

Publicación reversible, con verificación después, no solo antes

La publicación no termina cuando los archivos han llegado al servidor, sino cuando una solicitud real demuestra que la nueva versión es la que se sirve. En una de las implementaciones, el script sincroniza el directorio, conserva la versión anterior al lado, luego extrae el nombre del paquete de la página entregada y verifica en la dirección pública que se sirva exactamente ese archivo; si no, vuelve por sí solo a la versión anterior. No es teórico: el mecanismo detectó un paquete que quedó antiguo en el directorio del runner y anuló una publicación que, de otro modo, habría parecido exitosa.

Cambio atómico de versión, con el proceso bajo systemd

La alternativa a «paramos, copiamos encima, arrancamos» es el directorio de versiones más un enlace simbólico conmutado en una sola operación. La unidad systemd apunta siempre a la ruta estable, y la vuelta atrás significa conmutar el enlace de regreso. La unidad tiene política de reinicio ante fallo con una pausa breve, tiempo máximo de parada y restricciones de sistema: sin escalada de privilegios, sistema de archivos protegido, directorios personales inaccesibles, con una lista explícita de rutas en las que tiene permiso para escribir.

nginx al frente, con límites escritos para el caso real

Terminación TLS con renovación automática del certificado, HSTS con duración de un año e inclusión de subdominios, compresión con umbral mínimo de tamaño, recursos estáticos con expiración larga y marcado inmutable, y la aplicación vinculada a la interfaz local para que no pueda ser alcanzada directamente desde internet. Los límites de tasa se establecen por tipo de tráfico, no de forma global. Una lección pagada merece decirse: bajo HTTP/2, el límite de conexiones cuenta los flujos, no las conexiones — con un valor bajo, una sola carga de página rechaza por sí sola sus fuentes y scripts con 429.

Copia de seguridad que se verifica, no solo se ejecuta

Tarea diaria programada, con inicio en el siguiente arranque si la máquina estaba apagada a esa hora y con retraso aleatorio para que no arranque todo en el mismo segundo. La exportación de la base se comprime, y si el archivo resultante está vacío, la ejecución se trata como fallo — una exportación que termina «con éxito» y produce cero bytes es la forma habitual en que se descubre, seis meses después, que no existe copia. Los archivos del repositorio de objetos se sincronizan por separado. Una copia 100% local no sobrevive a la pérdida del disco, así que la copia también se lleva fuera de la máquina, a una cuenta de almacenamiento en la Unión Europea con replicación geográfica, versionado, eliminación reversible y expiración automática — con acceso mediante identidad gestionada, para que no exista ninguna clave de almacenamiento en el disco.

La eliminación programada solo se ejecuta después de una copia exitosa

La tarea de retención depende explícitamente de la de copiado y se inicia después de ella. Una limpieza sin copia reciente es la única forma de eliminación de la que no hay vuelta atrás. A diferencia del copiado, la eliminación no recupera las ejecuciones perdidas: si la máquina estaba apagada, no se borra dos veces al día siguiente. Cada ejecución escribe una fila en una tabla de ejecuciones, y antes de la primera activación real la tarea corre en vacío al menos una semana y se revisa el registro.

Alertas que no mienten ni hacen spam

Una tarea programada que devuelve 200 no significa una tarea que haya funcionado. Nuestro envoltorio de ejecución lee el cuerpo de la respuesta y busca en él fallos parciales, luego envía una alerta con limitación de frecuencia, para que un servicio caído todo el día no produzca noventa y seis mensajes idénticos. El motivo de que exista: un informe diario estuvo muerto once días seguidos, y la única pista era un vacío en una tabla que nadie miraba. La tarea programada se había disparado las once veces.

Cadena de publicación que no puede ser desviada desde arriba

Las acciones del flujo de integración se fijan en la huella completa del commit, no en la etiqueta. En marzo de 2026, una acción popular fue redirigida de las etiquetas `v1`…`v45` hacia código malicioso y llegó a más de 23.000 repositorios en 24 horas; una huella no se mueve. El flujo no conserva credenciales en la copia de trabajo, y la publicación no pasa por un token: pasa por un runner propio, en la máquina destino, con permisos concedidos de forma puntual. Así ninguna clave de acceso al servidor queda en la plataforma de código.

Contenedores con límites, comprobaciones de salud y registros que no llenan el disco

Cada servicio tiene política de reinicio, su propia comprobación de salud (preparación de la base de datos, un punto de estado de la aplicación), límites de CPU y memoria donde la carga lo requiere, y rotación de registros a nivel del motor de contenedores, con tamaño máximo y número de archivos. Los puertos de las bases de datos se enlazan a la interfaz local, nunca públicos. Las variables obligatorias se declaran de forma que el contenedor se niega a arrancar si faltan, en lugar de arrancar con un valor predeterminado peligroso.

Base de datos autogestionada, cuando la independencia importa

Pila completa en contenedores — base de datos, autenticación, interfaz REST, canal en tiempo real, almacenamiento de archivos, puerta de acceso — con las extensiones activadas explícitamente y con los parámetros de memoria y de conexiones adecuados a la máquina, no dejados en los valores predeterminados. Las migraciones son archivos versionados en el repositorio y se aplican manualmente, con el reinicio del componente que mantiene su esquema en memoria. El motivo de esta elección es simple: una plataforma gestionada desde fuera de la Unión Europea puede ser excelente técnicamente y, aun así, no ser adecuada jurídicamente.

Qué aspecto tiene

El recorrido, paso a paso.

01

Inventariamos lo que existe y lo que se puede perder

Qué se ejecuta efectivamente en la máquina, bajo qué supervisor, con qué versiones, con qué puertos expuestos; qué copias de seguridad existen y si alguna se ha restaurado alguna vez; qué secretos han llegado a los repositorios; cuál es la diferencia entre la configuración del repositorio y el archivo del servidor. El último punto casi siempre produce sorpresas: nosotros mismos tenemos documentado un caso en el que el archivo del servidor había sido editado directamente, fuera del repositorio, y dejó una copia de seguridad con marca de tiempo junto a él. Entregamos el inventario y la lista de puntos únicos de fallo.

02

Ponemos la base: servidor, nginx, procesos, hardening

Firewall que rechaza por defecto las entradas y abre solo lo que hace falta, protección contra intentos repetidos de autenticación, espacio de swap dimensionado, nginx con TLS y renovación automática, la aplicación ligada a la interfaz local, el supervisor de procesos configurado para arrancar en el boot. Entregamos las configuraciones en el repositorio, no solo en la máquina, para que la siguiente persona no tenga que reconstruirlas de memoria.

03

Hacemos la publicación repetible y reversible

Script de publicación con la versión anterior conservada, verificación de salud después de la publicación y vuelta automática en caso de fallo. Donde existe equipo e integración continua, se añade runner propio en la máquina objetivo, con acciones fijadas por fingerprint y sin credenciales en la copia de trabajo. Entregamos el procedimiento escrito y una vuelta ejecutada delante del cliente: una vuelta no probada no es una vuelta.

04

Ponemos las copias, la retención y las alarmas

Copia diaria con verificación de que el archivo no está vacío, copia fuera de la máquina en una región de la Unión Europea, la tarea de retención que se ejecuta solo después de una copia exitosa y deja rastro, más alarmas con limitación de frecuencia que leen el contenido de la respuesta, no solo el código de estado. Entregamos una restauración de prueba hecha realmente y su registro.

05

Entregamos las claves y escribimos lo que queda sin hacer

Acceso en cuenta propia, la documentación de operación, la lista de tareas programadas y — obligatoriamente — la lista honesta de las cosas que no se automatizaron y por qué. En nuestro caso, dos quedan casi siempre en la lista: las migraciones de esquema, aplicadas a mano de forma deliberada, y la publicación de este sitio, que todavía es manual.

Ce vede utilizatorulAplicațiaRețea și securitateGăzduire și dateFIECARE STRAT, ALES ȘI EXPLICAT
Straturile unei instalări, de jos în sus: mașina virtuală într-o regiune europeană confirmată, motorul de containere cu rotația jurnalelor, baza de date cu copia zilnică verificată și copia din afara mașinii, procesele sub supraveghetor cu repornire la eșec, nginx cu TLS și limite de rată — iar lateral, lanțul de publicare cu versiunea anterioară păstrată și revenirea automată.

Los datos

Qué tocamos, dónde están y cuánto se quedan

Las preguntas que hace cualquiera que tenga un delegado de protección de datos — hechas aquí antes de que las haga él.

Dónde están realmente los datos y cómo se verifica
La ubicación se confirma desde la máquina, no desde la documentación: el servicio de metadatos del proveedor indica la región real, y el registro de la dirección indica el país. Nuestros sistemas están en OVHcloud, Bucarest, Rumanía, y en Microsoft Azure, Poland Central: ambos en el Espacio Económico Europeo. Las copias de seguridad de la plataforma cívica están en una región nórdica de la Unión, con replicación en una segunda región también de la Unión. Estas líneas han sustituido una lista más larga de ubicaciones que no pudimos confirmar.
Lo que vemos nosotros durante el trabajo
Configuración, registros, esquema de la base y estado de los procesos. El contenido de los datos personales no forma parte del trabajo; donde la depuración aún requiere un ejemplo, se utiliza un caso creado para ello. El acceso administrativo se concede durante la intervención, nominalmente, y se retira al final —y la retirada se verifica, no se presupone.
Los registros y cuánto duran
Los registros web de este sitio rotan a diario, con catorce copias conservadas, con permisos de lectura restringidos al grupo de administración. A nivel de contenedores, la rotación la hace el motor de contenedores, con tamaño y número de archivos fijados, para que un servicio demasiado verboso no llene el disco y detenga la base de datos — la forma más banal de hacer caer una producción.
Los secretos no están en el repositorio
Los valores sensibles entran desde archivos de entorno con permisos restringidos, leídos por la unidad del sistema, no escritos en la unidad — porque la definición de una unidad y el registro del sistema son legibles para más personas de las que se cree. En la cadena de publicación, el archivo de entorno de producción no pasa por la plataforma de código: se copia localmente a la máquina y se borra inmediatamente después de la construcción. Cuando asumimos una infraestructura existente, el primer paso es siempre un inventario de los secretos llegados a los depósitos, con un plan de rotación.
Continuidad: qué pasa cuando nos vamos
La entrega significa acceso con cuenta propia al proveedor de infraestructura, el depósito con todas las configuraciones del servidor, el procedimiento de publicación y de reversión, el de restauración de la copia de seguridad — probado, no solo escrito — y la lista de tareas programadas con lo que hace cada una. El bloqueo contra el borrado accidental se pone en el grupo de recursos de producción desde el principio.

Un caso

Un informe diario que ya no se ejecutaba desde hacía once días, en un sistema en el que todo respondía 200

La situación

En una plataforma interna propia, varias rutinas automáticas generan informes diarios y limpian datos. Las tareas se iniciaban desde dentro de la aplicación, con contadores en proceso. Nada señalaba ningún problema: el servicio estaba iniciado, la dirección respondía, los registros no contenían errores.

Qué construimos

El informe diario faltaba desde hacía once días, y la única huella era un vacío en una tabla que nadie miraba. Salieron a la luz dos defectos distintos. El primero: un contador iniciado dentro de la aplicación se reinicia en cada reinicio del servicio, así que una rutina con un intervalo mayor que el intervalo entre publicaciones nunca se dispara. El segundo, más insidioso: la rutina se había disparado correctamente las once veces y había devuelto cada vez código 200 — pero el cuerpo de la respuesta contenía fallos parciales que nadie leía.

Qué salió

La programación se trasladó fuera de la aplicación, a un planificador del sistema al que no le importan los reinicios. La ejecución se envolvió en un script que escribe una línea de registro por ejecución, recorre el cuerpo de la respuesta por claves de fallo y envía una alerta a un canal de mensajería — con limitación de frecuencia, para que una dependencia caída todo el día no produzca noventa y seis mensajes idénticos. Una respuesta 200 con fallos internos ahora tiene su propio estado, distinto del éxito.

Qué no dice el caso

Nada de esto fue un problema de infraestructura en el sentido clásico: el servidor funcionaba, el disco tenía espacio, el proceso estaba vivo. Precisamente por eso duró once días. Los defectos de operación más caros no son las caídas — esas se ven — sino las cosas que informan éxito sin hacer nada. La comprobación de salud que importa no pregunta «¿estás iniciado?», sino «¿has hecho lo que debías, cuántas veces debías?».

Preguntas

Lo que nos pregunta la gente antes de llamar

¿Dónde estarán efectivamente nuestros datos?

Donde tú elijas, y verificamos que realmente esté ahí. Nuestros sistemas están en OVHcloud, Bucarest y en Microsoft Azure, Poland Central, ambas en el Espacio Económico Europeo, y la ubicación se confirmó consultando el servicio de metadatos de la máquina virtual y el registro de la dirección — no leyendo la documentación del proveedor. La verificación importa: para una transferencia dentro del Espacio Económico Europeo, el capítulo sobre transferencias de la Ley 195/2024 no se aplica y no se necesitan autorizaciones especiales. Fuera de él, aparece un dossier de garantías.

¿Por qué servidor propio y no una plataforma gestionada?

No siempre. Una plataforma gestionada es la elección correcta cuando el equipo es pequeño, el tráfico es irregular y nada del stack tiene requisitos de residencia. El servidor propio se convierte en el mejor argumento en tres situaciones: cuando los datos deben permanecer en una jurisdicción determinada, cuando el coste se vuelve imprevisible a escala, y cuando queréis poder llevaros todo e iros. También hicimos la migración inversa para un sistema propio: de una base de datos alojada en Estados Unidos a un stack autohospedado en la Unión Europea, con ocho contenedores — base de datos, autenticación, interfaz REST, tiempo real, almacenamiento, metadatos, panel y gate de acceso.

¿Qué pasa si una publicación sale mal?

Se revierte, y preferiblemente sola. La versión anterior permanece en el disco junto a la nueva, y después de la publicación una comprobación solicita la página real y confirma que el archivo servido es el recién construido; si no, el script revierte automáticamente. Donde usamos el cambio atómico de enlace simbólico, la reversión es una sola operación. No es una descripción de folleto — el mecanismo ya capturó una publicación con un paquete viejo que quedó en el directorio de trabajo del runner y la anuló.

¿Hacéis copias de seguridad? ¿Con qué frecuencia y las probáis?

Diariamente allí donde la construimos — y lo subrayamos, porque una copia automática no aparece por sí sola cuando mueves una aplicación a un servidor. La copia se ejecuta a una hora fija, se recupera en el siguiente arranque si la máquina estaba apagada, y si la exportación sale vacía la ejecución se trata como un fallo. La copia también sale fuera de la máquina, a una región de la Unión Europea, con replicación, versionado, borrado reversible y expiración automática. La prueba de restauración forma parte de la entrega: una copia nunca restaurada es una suposición, no una copia.

¿Quién se entera primero cuando algo cae?

Depende de lo que hayamos construido, y vale la pena decirlo sin florituras. Existen las comprobaciones de salud a nivel de contenedor y los puntos de estado de las aplicaciones; existe la alarma hacia un canal de mensajería, con limitación de frecuencia, donde la hemos construido. Un punto de comprobación del estado que nadie consulta no es monitorización — es una página. Si quieres monitorización de verdad, es una etapa separada, con un observador externo que consulta periódicamente y con un destinatario de la alerta que tiene permiso para ser despertado.

¿Aplicas automáticamente las migraciones de la base de datos en cada publicación?

No, y es una decisión tomada con conocimiento de causa, no un descuido. La cadena de publicación construye y copia el código; eso es todo. Los cambios de esquema son archivos versionados en el repositorio, aplicados manualmente, con una copia de seguridad fresca detrás, y los componentes que mantienen su esquema en memoria se reinician después. Una migración aplicada automáticamente en producción por un proceso que no sabe qué hay en la tabla es la forma habitual en que se pierden datos de manera irreversible.

¿Cómo evitáis que vuestra cadena de publicación se convierta en una vía de ataque?

Con tres reglas. Las acciones externas se fijan a la huella completa del commit, no a la etiqueta — en marzo de 2026 una acción de uso masivo fue redirigida desde sus etiquetas hacia código malicioso y alcanzó a más de 23.000 repositorios en 24 horas. La copia de trabajo no conserva credenciales. La publicación no se hace con una clave de acceso almacenada en la plataforma de código, sino mediante un ejecutor propio que corre en la máquina objetivo, con permisos concedidos puntualmente. Reconocemos que no todos nuestros proyectos antiguos cumplen todavía las tres; su migración es un trabajo en sí mismo.

¿Tomáis una infraestructura hecha por otra persona?

Sí, y el primer paso siempre es un inventario, no una modificación. Qué corre de verdad, bajo qué supervisor, con qué versiones, qué puertos están expuestos, qué copias de seguridad existen, si alguna se ha restaurado alguna vez, qué secretos han acabado en repositorios y en qué medida la configuración del repositorio todavía se parece al archivo del servidor. La última comprobación casi siempre produce algo: tenemos documentado, en un proyecto propio, un archivo de configuración editado directamente en producción, que dejó una copia de seguridad con marca de tiempo al lado.

¿Qué pasa si queremos trabajar con otra persona?

Os vais por completo. La infraestructura está en vuestras cuentas con el proveedor desde el inicio, y la entrega incluye el repositorio con todas las configuraciones del servidor, el procedimiento de publicación y de reversión, el procedimiento de restauración probado y la lista de tareas programadas con lo que hace cada una. El bloqueo contra la eliminación accidental del grupo de recursos de producción se coloca desde la instalación. Si un proveedor condiciona vuestra salida a reescribir la infraestructura, ese era el problema, no la tecnología.

En qué se basan las afirmaciones anteriores (30 fuentes)
  1. https://www.megapromoting.com răspunde 200 pe nginx + Next.jshttps://www.megapromoting.com/servicii · 2026-09-06

29 de ellas son código y archivos de nuestros repositorios. No publicamos su nombre ni la línea: juntos, en una sola página, describirían con demasiada precisión cómo están construidos sistemas que no son solo nuestros. Los repasamos contigo, en el repositorio, a petición — la verificación sigue siendo posible, solo que se hace en una conversación.

¿Qué te gustaría que funcionara mejor?

Cuéntanos tu proceso. Juntos decidimos qué merece la pena construir, qué podemos conectar y cómo verificamos el resultado.

Vamos a hablar