Añado aquí un caso particular de migración con el que me encontré, por si le sirve de ayuda a alguien más.
Me topé con un caso particular de Let’s Encrypt/SSL al mover una instancia independiente de Discourse a un nuevo VPS, así que anoté el diagnóstico exacto y los pasos de recuperación, por si resultan útiles para cualquier otra persona que siga esta guía.
En mi caso, nginx dentro de app no arrancaba porque ambos archivos .cer en /var/discourse/shared/standalone/ssl/ se habían convertido en archivos de cero bytes:
PEM_read_bio_X509_AUX() failed
Al reconstruir, se intentó emitir el certificado de nuevo, y tras varios intentos consecutivos alcancé el límite de emisión de certificados de Let’s Encrypt. Copiar los archivos de certificado aún válidos del servidor antiguo no fue suficiente, porque al iniciar app volvían a reemplazarse por archivos de cero bytes.
Lo que finalmente lo solucionó fue detener app y copiar tanto el directorio funcional /var/discourse/shared/standalone/ssl/ como el estado correspondiente de /var/discourse/shared/standalone/letsencrypt/ desde el servidor antiguo, y luego iniciar el contenedor de nuevo.
He documentado la secuencia completa aquí:
Estas son notas de diagnóstico/recuperación de esta migración en particular, y no sustituyen a la documentación oficial de migración ni de HTTPS.
También existe un tema antiguo en Meta que cubre el modo de fallo relacionado con archivos .cer vacíos: