Problema de migración en torno a la deduplicación de votos

@sweetbeems aquí tienes un conjunto preliminar de comandos que deberían ayudarte a restaurar tus datos, y los he probado en mi sitio.

Asumo que estás utilizando nuestra instalación de docker y que estás algo familiarizado con la línea de comandos.

Deberías identificar un archivo de copia de seguridad en <site>/admin/backups. Debe ser uno que se haya realizado antes de que se eliminaran los datos.

Esta guía asume que tus copias de seguridad incluyen cargas. La diferencia es que el archivo de copia de seguridad sería .tar.gz (datos + cargas) frente a .sql.gz (solo datos).

# entra en la aplicación usando el usuario predeterminado
docker exec -it app bash

# identifica la copia de seguridad que quieres que esté allí
ls /var/www/discourse/public/backups/default/

# extrae el archivo dump.sql de la copia de seguridad comprimida
cd /var/www/discourse/public/backups
mkdir site-backup-to-restore
tar xfz ./default/=SITE_BACKUP_FILENAME= -C site-backup-to-restore/
cd site-backup-to-restore
gunzip dump.sql.gz

# obtén los datos
# esto encuentra el inicio de los datos de votos de encuestas
# hasta el final de los datos (que sería una línea vacía)
start=$(grep -n "COPY public.poll_votes (poll_id, poll_option_id, user_id, created_at, updated_at) FROM stdin;" dump.sql | sed  's/\([0-9]*\).*/\1/')
end=$(tail -n +$start dump.sql | grep -m 1 -n ^$ | sed  's/\([0-9]*\).*/\1/')
end=$((end-2))
tail -n +$start dump.sql | head -n $end > poll_votes_dump.sql

# aquí querrás echar un vistazo a poll_votes_dump.sql
cat poll_votes_dump.sql

# cambia el COPY a un INSERT para que
# todavía podamos añadir ON CONFLICT
sed -i 's/[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\} [0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}\.[0-9]\{6\}/'\''&\''/g' poll_votes_dump.sql
sed -i '2,$s/\t/,/g' poll_votes_dump.sql
sed -i '2,$s/^/(/; 2,$s/$/),/' poll_votes_dump.sql
sed -i '$ s/,$//' poll_votes_dump.sql
sed -i 's/COPY public.poll_votes (poll_id, poll_option_id, user_id, created_at, updated_at) FROM stdin;/INSERT INTO public.poll_votes (poll_id, poll_option_id, user_id, created_at, updated_at)\nVALUES/' poll_votes_dump.sql
echo "ON CONFLICT DO NOTHING;" >> poll_votes_dump.sql
cat poll_votes_dump.sql
Estos son los resultados que deberían mostrar los comandos `cat`

El primero debería verse así

COPY public.poll_votes (poll_id, poll_option_id, user_id, created_at, updated_at) FROM stdin;
1       1       1       2023-07-04 05:49:17.031031      2023-07-04 05:49:17.031031
1       4       1       2023-07-04 05:54:01.281801      2023-07-04 05:54:01.281801

y el segundo debería verse así

INSERT INTO public.poll_votes (poll_id, poll_option_id, user_id, created_at, updated_at)
VALUES
(1,1,1,'2023-07-04 05:49:17.031031','2023-07-04 05:49:17.031031'),
(1,4,1,'2023-07-04 05:54:01.281801','2023-07-04 05:54:01.281801')
ON CONFLICT DO NOTHING;

Sal de la instancia de docker y entra como usuario postgres. Hay un problema más profundo que no abordaré aquí y que requiere este paso adicional.

# desde tu host, accede a la aplicación a través del usuario postgres
docker exec --user postgres -it app bash

# insertar
psql -U postgres -d discourse -f /var/www/discourse/public/backups/site-backup-to-restore/poll_votes_dump.sql

# deberías ver `INSERT 0 3928` o el número de votos de encuestas que se restauraron
4 Me gusta