Una vez destruí mi DB de producción con una UPDATE durmiente y no tuve copias de seguridad recientes. Perdió ~30% de los ingresos, un montón de nervios y mucho tiempo. ese dolor me empujó a construir y abrir una herramienta de copia de seguridad y seguimiento PostgreSQL que ahora uso en todas partes. Table of content Sobre el proyecto de backup PostgreSQL de código abierto La historia de cómo rompió el DB y no pudo recuperarse por completo Cómo empecé a construir el proyecto Roadmap y planes futuros Reglas de seguridad de DB que ahora aplico en todos los proyectos Encuentro Sobre el proyecto de backup PostgreSQL de código abierto He abierto mi propia herramienta para monitorear y copiar PostgreSQL. He estado construyendo y usandolo durante un poco más de dos años. Inicialmente, lo he desarrollado para mi trabajo diario y un par de proyectos de mascotas. Sólo recientemente me impactó que el proyecto realmente parece lo suficientemente bueno como para mostrarlo públicamente, ya ayuda a mis amigos y podría ser útil para la comunidad. Go, gin, gorm, React, TypeScript, PostgreSQL — todo envuelto en Docker. La primera versión fue en Java, pero lo reescrito a Go con el tiempo. Stack: En esencia, es un envoltorio de UI alrededor del estándar en formato personalizado, con un montón de extras que hacen que la UX sea menos dolorosa y añaden integraciones con servicios de almacenamiento y notificación externos. pg_dump What it can do: Programación de copias de seguridad (por ejemplo, todos los días a las 4 de la mañana o todos los domingos a la medianoche) para PostgreSQL 13-17. Almacena las copias de seguridad comprimidas localmente en el servidor, en S3 o en Google Drive (los servidores NS y FTP están en el mapa de ruta). Enviarle un mensaje después de cada copia de seguridad que todo está bien... o no. Las notificaciones son opcionales. Ping en Discord, correo electrónico, Telegram y Slack si el DB deja de responder.Sólo alerta después de n comprobaciones fallidas (para evitar falsos positivos debido a errores de red) y muestra un gráfico de disponibilidad. Naturalmente, el proyecto es gratuito, de código abierto (MIT), auto-hostado y viene con una UI web humana. Sitio del proyecto: https://postgresus.com/ https://postgresus.com/ En GitHub: https://github.com/RostislavDugin/postgresus https://github.com/RostislavDugin/postgresus P.S. Si el proyecto parece útil y usted tiene una cuenta de GitHub, Las primeras estrellas son realmente las más difíciles de conseguir. I’d really appreciate a La historia de cómo rompió el DB y no pudo recuperarse por completo En 2023 tuve un proyecto de mascota que era un envuelto de ChatGPT (3.5). Básicamente, era sólo la reventa del acceso a la API con una interfaz de usuario agradable y abreviaturas. El proyecto creció, luego comenzó a bajar y finalmente lo vendí. de otro servidor. PgBackRest En el momento en que el proyecto estaba trayendo alrededor de 1.500 dólares pasivamente y alcanzando su pico de ingresos, sucedió algo malo: . I broke the data in the DB Era una noche de viernes. estaba cansado, estaba cambiando instantáneamente de codificar a responder a los mensajes, totalmente desfocado. A través de SSH y Salí al VPS de producción y escribí algo como: psql UPDATE users SET email = 'customer@email.com' WHERE email ILIKE '%%'; Entonces me distraí para copiar el correo electrónico correcto del chat y... pulse Enter en “autopilot”. . AFFECTED ROWS: 10 000 Era la única vez en muchos, muchos años que literalmente sentía una sudoración fría en mi espalda. “Sabía que debía haber hecho un En primer lugar, se puede establecer a Pero como en todas las historias de terror, las reglas básicas de seguridad fueron ignoradas, y todo se convirtió en un desastre. Disclaimers SELECT SAVEPOINT Todos los correos electrónicos de los usuarios fueron sobreescritos.Y aquí está el detalle clave: los sistemas de pago tienen reglas estrictas - si un usuario no puede acceder a un servicio pagado, eso es una violación enorme. Corrí a las copias de seguridad - y la sudoración fría se empeoró aún más. La copia de seguridad más reciente era de unos meses 😐. No hay manera de recuperarse de eso. Desde ese momento vinieron nuevos pagos, se cancelaron las suscripciones (lo que significa que no podía simplemente restaurar a todos - algunas personas ya habían salido), etc. De alguna manera, durante el resto de la noche y la mañana, logré reconstruir alrededor del 65% de la DB a través de scripts usando ID de usuario. Para el resto, tuve que cancelar suscripciones y reembolsar a las personas. La lección se aprendió. Cómo empecé a construir el proyecto Tiempo de decisión: me voy a construir una herramienta de copia de seguridad que me ping todos los días que todo está bien! y restaurar en un par de clics! y blackjack y microservicios! y también añadiré un punto final de verificación de salud de la API! Hice la primera versión de Postgresus en alrededor de un mes en Java. Comenzó a usarlo. Deje que algunos amigos lo prueben. Resultó: es útil. Algunas veces esas copias de seguridad me salvaron (y no sólo a mí).El nombre “Postgresus” solo apareció hace dos meses, antes de que el repo fuera simplemente llamado . “Pg-web-backup” en la web En este momento, Postgresus resuelve estos problemas para mí: Es la principal herramienta de copia de seguridad si el proyecto es pequeño o vive en un VPS en lugar de un servicio DB en la nube. Es la herramienta de copia de seguridad fallback si el proyecto es grande y vive en un DBaaS con sus propias copias de seguridad en la nube.Se copia de seguridad "sólo en caso" (si la nube muere, se bloquea, el DB se elimina accidentalmente junto con las copias de seguridad en la nube debido al no pago, etc.).Es siempre mejor tener una copia de seguridad duplicada que terminar en ese infeliz 0,01% cuando incluso la nube desaparece y no hay Plan B. Plan de ruta y planes futuros que planeo impulsar el proyecto en estas direcciones: Add more PostgreSQL-specific load monitoring (pg_stat_activity, pg_stat_system, pg_locks) with a friendly UI. Think of it as an alternative to postgres_exporter + Grafana, but bundled out of the box with backups. Observe and alert on slowdown of key queries. In my work project, there are tables and specific functions that are too early to optimize (if the hypothesis fails, we might drop them), but they could grow and slow down. For example, if INSERT INTO users (...) VALUES (...) starts taking more than 100 ms while the flow of new users is growing - we'll get a notification and go optimize. Collect query stats by CPU time and execution frequency to see where resources are actually going and what’s worth improving. Add more channels for notifications and more storage providers. Reglas de seguridad de DB que ahora aplico en todos los proyectos Te recuerdo dos piezas de sabiduría popular: Los administradores del sistema se dividen en dos categorías: aquellos que aún no hacen copias de seguridad y aquellos que ya lo hacen. Los administradores del sistema se dividen en dos categorías: aquellos que aún no hacen copias de seguridad y aquellos que ya lo hacen. No solo realice copias de seguridad - pruebe regularmente que realmente puede restaurar de ellos. No solo realice copias de seguridad - pruebe regularmente que realmente puede restaurar de ellos. Desde que deseché el DB de mi proyecto, he adoptado estas reglas sin excepción: Antes de cualquier ACTUALIZACIÓN, siempre ejecute una SELECT y asegúrese de tocar exactamente 1-2 líneas. Si el cambio es grande, establezca un SAVEPOINT manualmente. Realizar “alarmas de incendio” con restauración al menos una vez cada 3 meses: restaurar desde una copia en la nube y desde una local. así que cuando importa, no descubras que no hay datos, las copias de seguridad no funcionan, o las restauraciones tardan para siempre. En los últimos dos años hubo algunos casos en los que necesitábamos restaurar desde las copias de seguridad, cada vez que funcionaba, tanto en la nube como a través de Postgresus. Encuentro Espero que este proyecto sea útil para un amplio conjunto de desarrolladores, DBAs y personas de DevOps. Planeo seguir evolucionando para que sea aún más útil en escenarios del mundo real.