Problemas con el inicio de sesión de Patreon, Forzar HTTPS y tres problemas de S3 CDN

Es posible que necesite dividir esto en tres publicaciones separadas, pero están relacionadas, así que comenzaré con una.

Hace unos días, utilicé este tutorial (How to Scale a Discourse Deployment with a Load Balancer and Managed Database Cluster | DigitalOcean) casi al pie de la letra y migré mi Discourse independiente de Droplet en Digital Ocean a dos Droplets dentro de un Balanceador de Carga, hasta ahora todo bien.

Luego seguí este tutorial (Configure an S3 compatible object storage provider for uploads), pero después de reconstruir Discourse desde la línea de comandos, mi sitio de Discourse solo mostraba una pantalla en blanco. Miré en el Inspector del navegador para descubrir que el navegador estaba bloqueando todo mi contenido porque se estaba sirviendo desde HTTP y no desde HTTPS. Esto se debe probablemente a que el balanceador de carga tiene terminación SSL, por lo que todo lo externo es HTTPS, pero los servidores en sí mismos se ejecutan en HTTP.

En este punto, volví a romper completamente mis servidores, tratando de hacer que funcionaran con HTTPS dentro del Balanceador de Carga, pero simplemente no fue posible. No pude hacer que el Espacio/CDN de Digital Ocean funcionara con S3/CDN según este tutorial (Configure an S3 compatible object storage provider for uploads). Lo revisé minuciosamente e inspeccioné cada aspecto varias veces, pero no funcionó. La única forma en que pude hacer que Discourse se reconstruyera fue eliminando el parámetro DISCOURSE_S3_ENDPOINT: https://sfo3.digitaloceanspaces.com de app.yml, pero luego, aunque se había reconstruido, no pude hacer que el servidor respondiera. Obtuve un error 503 de servidor no respondiendo o un error regular de navegador de servidor no respondiendo o servidor desconectado. Varió según la configuración del Balanceador de Carga y el Espacio/CDN de DO que estaba probando. Probé todas las combinaciones posibles de configuraciones y nada me permitió servir una página.

Cuando dejé el parámetro DISCOURSE_S3_ENDPOINT en su lugar, obtuve el siguiente error durante la reconstrucción de Discourse, pero desapareció cuando comenté el parámetro S3_ENDPOINT.
Aws::S3::Errors::InvalidAccessKeyId: Aws::S3::Errors::InvalidAccessKeyId

Todos mis archivos se sincronizaron con S3, así que creo que es seguro asumir que la Clave de Acceso estaba bien, y el problema fue causado de alguna manera por el parámetro S3_ENDPOINT.

Hoy, me di por vencido tratando de hacer funcionar el intento anterior, y restauré una copia de seguridad de mis Droplets que solo estaban balanceando carga con solo HTTP y finalmente lo logré nuevamente haciendo este tutorial (Set up file and image uploads to S3) pero esta vez edité la configuración de S3 a través del panel de administración de Discourse en lugar de editar app.yml con la configuración del tutorial recomendado. Finalmente funcionó, pero la diferencia importante es que omití deliberadamente la configuración de CDN de S3. He confirmado que las imágenes subidas a las publicaciones se almacenan en S3 y puedo hacer copias de seguridad de Discourse directamente en S3, y esto es realmente todo lo que quiero, pero ahora tengo tres problemas que me persiguen, uno es crítico y dos son ignorables, aunque me gustaría confirmarlo aquí si es posible.

Entonces, el problema crítico es que los usuarios ya no pueden iniciar sesión usando el botón de inicio de sesión de Patreon en la página de inicio de sesión de Discourse. Se muestra este mensaje:
Lo sentimos, hubo un error al autorizar su cuenta. Por favor, inténtelo de nuevo.

La URL es esta:
https://mbp.community/auth/failure?message=invalid_credentials&origin=https%3A%2F%2Fmbp.community%2Flogin&strategy=patreon

Realmente agradecería algún consejo sobre qué podría intentar para que esto funcione, pero nuevamente, me pregunto si esto se debe a que internamente los servidores no están ejecutando HTTPS. Como puede ver en la URL, externamente están en HTTPS, por lo que es difícil saberlo con seguridad. Supongo que espero que alguien aquí tenga experiencia con el balanceo de carga de Digital Ocean, etc. con Discourse.

Los otros dos problemas ahora se están señalando en la Consola de Administración de la siguiente manera:

Algunos consejos basados en la configuración actual de su sitio

  • Su sitio web está utilizando SSL. Pero [force_https](https://mbp.community/admin/site_settings/category/all_results?filter=force_https) aún no está habilitado en la configuración de su sitio.
  • El servidor está configurado para cargar archivos a S3, pero no hay una CDN de S3 configurada. Esto puede generar costos elevados de S3 y un rendimiento más lento del sitio. Vea “Uso de almacenamiento de objetos para cargas” para obtener más información.

Entonces, no me importa intentar activar force_https, pero me preocupa que me bloquee el acceso a mi servidor porque internamente los servidores balanceados por carga no se están ejecutando en HTTPS y, debido a los problemas que tuve ayer, soy reacio a pasar otras doce horas golpeándome la cabeza contra la pared viendo innumerables reconstrucciones de Discourse de 15 minutos sin llegar a ninguna parte. Nuevamente, si alguien sabe que es seguro activar force_https con mis configuraciones, por favor hágamelo saber.

Y el segundo problema, nuevamente, no salió bien a través de los parámetros agregados al archivo app.yml, así que también soy reacio a intentarlo de nuevo. ¿Puede confirmar que esto haría esencialmente lo mismo que los parámetros agregados al archivo app.yml? Si es así, simplemente ignoraré este segundo mensaje. Por el contrario, si por alguna razón es seguro intentarlo, hágamelo saber y haré una copia de seguridad y lo probaré.

Disculpas por la publicación larga. Espero que pueda entender lo que estoy tratando de obtener con el consejo.

1 me gusta

Entonces, realmente necesitas ayuda allí porque lo único que realmente se admite aquí es una instalación estándar.

¿Esperas más de 200.000 visitas a la página al día? Si no, una sola gota de 8 GB con CDN será mucho más fácil de administrar y probablemente más barata. Y por lo que puedo decir, hay al menos un par de formas en que esas instrucciones probablemente no funcionarán para nadie.

Primero, ¿configuraste un redis externo como se describe en el paso 5? Si no, esperaría que las cosas estuvieran al menos un poco rotas. Implican que usar sticky lo “arreglará”, pero realmente no lo hará. Por lo tanto, puede esperar errores espurios difíciles de diagnosticar. Y no especifican una forma de asegurarse de que todas sus instancias ejecuten exactamente la misma versión de Discourse, por lo que eso también probablemente hará que las cosas se rompan.

Realmente querías hacer eso primero, de lo contrario, de hecho, esa configuración no puede funcionar, porque algunas cargas estarán en un servidor y otras en otro, y esas instrucciones no mencionan la palabra “carga”, así que espero que si has estado usando esto por más que solo para pruebas, tienes un lío en tus manos y necesitarás sincronizar las cargas entre tus múltiples gotas.

Indica específicamente que la CDN de Digital Ocean no funciona con Discourse.

¿Usaste una CDN diferente como recomienda? Bunny.net es bastante fácil y simple de configurar.

2 Me gusta

Oh cielos, no sé quién escribió esa guía, pero seguro que no fue alguien muy familiarizado con Discourse a escala.

El último paso te dice que puedes añadir más backends al balanceador de carga usando la función de instantánea de Droplet, pero como la guía no menciona el uso de Almacenamiento de Objetos para las cargas, hacerlo romperá por completo las cargas de los usuarios. Además, si sigues esa guía, las actualizaciones se volverán triviales.

Mi consejo para @Martin_Bailey es que no sigas nada de ahí. Solo resultará en una instalación rota, como has descubierto.

Por favor, sigue nuestra guía de instalación oficial si quieres una instalación rápida y sensata de Discourse. Salirse de ese camino puede convertirse rápidamente en un trabajo a tiempo completo.

3 Me gusta

Gracioso. Dejé un comentario allí describiendo algunos de los problemas y enlazando a la publicación de Rafael, pero fue eliminado.

3 Me gusta

¡Guau! OK, pensé que había ido bien, aunque noté algunas cosas incorrectas, pero ahora tengo una instalación con balanceo de carga. Por supuesto, lo primero que descubrí fue que las cargas de imágenes no funcionaban, por eso usé S3 para almacenar imágenes.

Tal como está, llevará otra carga de trabajo volver a un solo servidor, así que, ¿hay algo que pueda hacer sobre el problema de inicio de sesión de Patreon? Ignoraré los otros dos problemas.

Gracias por tu ayuda de todos modos. Hacen un trabajo tan bueno aquí.

Hola Jay, gracias por tu ayuda. En respuesta a tus preguntas…

No espero muchos usuarios, ya que es una comunidad cerrada de Patreon. Mi objetivo principal era poder actualizar un servidor sin que se cayera el sitio. De hecho, he confirmado que esto es posible, así que estaba contento con la configuración. Sí, hice el paso cinco, por lo que el estado se almacena en una instancia externa de Redis.

La otra cosa que tuve que averiguar, que me detuvo durante un tiempo, fue que también necesitaba agregar el parámetro a continuación a app.yml, de lo contrario, la reconstrucción seguía fallando porque intentaba conectarse a Postgres en el puerto predeterminado, a pesar de tener el puerto real en el parámetro DISCOURSE_DB.

DISCOURSE_DB_BACKUP_PORT: 25060

No había pensado en las cargas hasta después de tener todo funcionando según el primer tutorial, y al principio todo se rompió cuando intenté configurar S3, pero fue porque la configuración de CDN de DO Space que ustedes proporcionan aquí no funciona.

Indica específicamente que la CDN de Digital Ocean no funciona con Discourse.

Lo sé, pero luego el tutorial nos hace agregar esto:
DISCOURSE_S3_ENDPOINT: https://sfo3.digitaloceanspaces.com

Lo que proviene del espacio de DO, ¿verdad? No tengo idea, basándome en todo lo que he leído en estos tutoriales, de cómo trabajaría con una CDN diferente, pero no me preocupa en este momento, ya que lo cubriré en un momento.

No, no usé una CDN diferente. En realidad, estoy bien sin usar una CDN. Dejaré los ajustes de CDN vacíos. Como actualización adicional, basándome en los consejos que todos han brindado amablemente hasta ahora, iba a revertir a mi copia de seguridad de la semana pasada, pero decidí intentar habilitar la opción force_https primero, y habilitarla solucionó el problema de inicio de sesión de Patreon, como había pensado que podría ser. No se cambió nada en el servidor(es), por lo que el problema de inicio de sesión de Patreon probablemente fue causado por alguna lógica interna de Discourse, aunque de nuevo, me doy cuenta (ahora) de que estoy haciendo algo que no recomiendan ni admiten.

Entonces, en este punto, mi configuración es prácticamente como recomienda el primer tutorial, pero las imágenes y las copias de seguridad van a S3, sin una CDN. Está funcionando muy bien. Aprecio que me recomienden usar la instalación independiente, pero tener que bajar el sitio durante 15 minutos cada vez que sale una actualización es realmente doloroso. Ayer mismo encontré tus referencias a data.yml y web_only.yml para una configuración multiserver, pero no pude averiguar qué se suponía que debía hacer, así que me di por vencido.

Voy a seguir con lo que tengo por ahora. Gracias por tu ayuda y por todo lo que hacen.

OK, chicos, ganaron. :slight_smile:

Empecé a ver más problemas con las imágenes que no se cargaban de nuevo porque a veces se compartían a través de http y no de https. Tienen razón, es un desastre.

He revertido la mayor parte de esto, dejando la base de datos de Postgres en su lugar, pero volviendo a un solo servidor droplet, sin balanceador de carga y con imágenes/Redis almacenados localmente. He dejado S3 en su lugar para las copias de seguridad del sitio. Me encanta lo bien que funciona.

Supongo que vuelvo a tener interrupciones de 15 minutos con cada actualización, pero he dedicado un total de como cinco días completos a esto hasta ahora, y no puedo dedicarle más tiempo, así que estoy feliz de que todos hayan podido corregirme con respecto a ese tutorial original que seguí. Es casi como si solo quisieran que la gente pagara por más Droplets. :slight_smile:

Gracias de nuevo por su ayuda.

En realidad, si pudiera preguntar, ¿hay algún tutorial que nos ayude a configurar Discourse de manera que sea posible evitar esa interrupción de 15 minutos con cada actualización? Vi la nota sobre data.yml y web_only.yml, pero no tengo ni idea de lo que necesito hacer para que eso suceda.

Tener yml de data y web_only separados proviene de la configuración de dos contenedores:

1 me gusta

Esto funcionará y resolverá algunos problemas. Y si por alguna (otra) razón te quedas bloqueado, siempre puedes usar launcher enter app para volver a entrar y cambiar la configuración del sitio de nuevo desde la consola de Rails.

Como ya han dicho otros, es mejor seguir una guía diferente.

1 me gusta

Hola chicos,

Escribí ese artículo sobre DigitalOcean, parece que cometí algunos errores, ¡mis disculpas!

Me gustaría actualizar el artículo para corregir los problemas.

Así que solo me gustaría hacer algunas preguntas para asegurarme de que las cosas estén bien con la versión corregida.

En el artículo dije que opcionalmente podrías usar una instancia de Managed Redis, mi idea en ese momento era que usar sesiones persistentes te permitiría usar el Redis incorporado en la imagen de Discourse. ¿Es esto correcto? Quizás esto no sea suficiente y una instancia externa de Redis debería ser un requisito obligatorio.

Estoy de acuerdo con el comentario de @Falco sobre el Almacenamiento de Objetos, eso es un descuido de mi parte. Puedo actualizar el artículo para incluir instrucciones sobre cómo usar DigitalOcean Spaces para manejar las cargas de imágenes.

Sospecho que eliminar todo el estado de los Droplets es la respuesta para resolver los problemas de instalación, esperaba que usar un Redis externo fuera opcional debido a las sesiones persistentes, pero podría estar equivocado.

También estoy de acuerdo en que esto hace que tu instalación de Discourse sea más complicada de actualizar, creo que si eliminas todo el estado de los Droplets, deberías poder actualizar un Droplet, luego crear una instantánea y simplemente reemplazar los otros Droplets con nuevos creados a partir de las instantáneas (un poco como las implementaciones de Kubernetes, excepto que haces la reimplementación manualmente).

También estoy de acuerdo en que probablemente haya mejores maneras de escalar Discourse, aun así me gustaría corregir el artículo para que la gente pueda seguirlo si así lo desean.

Gracias,
Francis

Soy un cliente feliz de Digital Ocean y tengo un panel que mis clientes ingresan claves API y un nombre de host y luego crea automáticamente una instancia, configura Mailgun, espera a que se configuren los registros DNS y luego instala Discourse.

No funciona en absoluto como sugieres. Me puse en contacto con Digital Ocean en tu foro (no encontré otra manera) para informarte y mi mensaje fue eliminado. Luego, 9 meses después, respondes aquí.

Hacerlo correctamente es una hazaña bastante complicada, y los casos en los que sería útil son bastante descabellados. Tengo un sitio con 100.000 visitas por día en una instancia de 8 GB. ¿Quién crees que es la audiencia objetivo de esta guía?

Sí, necesitas Redis externo, PostgreSQL y cubos S3 con una CDN, y la CDN de Digital Ocean no funciona, por lo que tu guía tendría que guiarlos a través de la configuración de la CDN de otra empresa. No creo que quieras hacer eso. Y eso es solo para configurarlo. Si luego quieren hacer una actualización, sería un conjunto completamente diferente de procedimientos que nadie más en el planeta sabría cómo ayudar.

Lo mejor que podrías hacer sería eliminar esa guía por completo. Si quieres ser un verdadero héroe, podrías arreglar la instalación de 1 clic para que no use tu propio script propietario para configurar el correo electrónico y demás, para que sea realmente una instalación estándar. Es bastante confuso tener que presionar control-c para poder llegar a donde está Discourse, y dado que las personas que usaron la instalación de 1 clic no usaron las herramientas estándar de Discourse, no saben cómo usarlas cuando llega el momento de una actualización de línea de comandos. Sería realmente, realmente genial si pudieras hacer eso.

Aquí puedes ver a personas que lo usaron y tuvieron problemas: Search results for 'digital ocean one-click' - Discourse Meta

1 me gusta

No, ya que Redis no es una caché simple, sino que maneja una gran cantidad de conteos, límites de velocidad, trabajos en segundo plano, pub sub. Tener múltiples Redii resultará en conteos corruptos y comportamiento roto.

Eso lo haría, pero agregar un Redis administrado, PostgreSQL administrado, Balanceador de Carga administrado, Almacenamiento de Objetos, Registro de Contenedores también será más caro que simplemente pagar nuestro alojamiento estándar y mucho más complicado de mantener.

En ese punto, la intersección entre las personas que quieren pagar cientos de dólares por mes y no les importa si su servicio se cae debido a un SPOF es bastante pequeña, y se convierte más en una configuración de aficionado que en lo que recomendaríamos para los administradores de foros.

1 me gusta