Todos los plugins no funcionan debido a un error de CORS después de la actualización reciente

Desde la semana pasada, todos los plugins, tanto los principales como los instalados, han dejado de funcionar en nuestro foro, incluso cuando están habilitados. Inicialmente pensé que esto estaba relacionado con el error mencionado anteriormente FIX: Compile missing rollup plugin bundles on demand in development - #8, pero hemos realizado múltiples actualizaciones desde entonces y nada lo ha solucionado. Intenté habilitar un plugin que no se usaba anteriormente, el de Notas de Usuario preinstalado, y no hay opciones para agregar notas a ningún usuario. Incluso el gestor de Docker ha dejado de funcionar, por lo que todas las actualizaciones deben ejecutarse a nivel de servidor, permitiendo que solo una persona las aplique en lugar de todo el equipo de administración.

He intentado buscar una solución para esto, pero todo lo que he encontrado es que los plugins se deshabilitan automáticamente o algo similar, no tan específico como este caso.

¿Podría alguien por favor aconsejar sobre posibles soluciones o caminos que deberíamos explorar, ya que preferimos evitar una reversión, pero por ahora parece que podría ser la última opción?

Gracias como siempre a todos aquí y por su continuo apoyo :smiley:

Hmm. Parece que se trata de un problema con tu CDN:


Habilité mi plugin de ignorar CORS y los scripts se cargaron correctamente, pero no veo cambios visibles provenientes de los complementos. Te recomiendo probar eso; si funciona, deberías poder identificar qué está causando el error en tu CDN.

Muchas gracias por tomarse el tiempo de investigar esto por nosotros. Realizaremos algunas pruebas durante el fin de semana y actualizaremos cuando podamos.

Tengo el mismo problema con bunnycdn. Funcionaba bien hasta una actualización reciente.

Intenté agregar .js a las cabeceras CORS en bunny.net como se describe aquí:

Al igual que en ese momento, no entiendo por qué surgió este problema cuando actualicé a 6800ad3adf3ef9c3caeb9a4d849997c7a3dc98d7 la semana pasada.

Gracias, Jay, tenemos a Bunny y la solución que mencionaste ha resuelto todos los problemas ahora. ¡Gracias a todos por la ayuda y el apoyo en este caso! Nuestro foro ha vuelto a la normalidad. Bueno, tan normal como puede serlo :smiley:

¡Me alegra saber que lo resolviste!

En el nuevo sistema de complementos, utilizamos script type="module", lo que requiere que se establezcan las cabeceras CORS correctas. Los script type="text/javascript" de estilo antiguo no requieren esas cabeceras.

Hemos estado migrando lentamente diferentes sistemas a type="module" durante los últimos años. Los temas ya lo utilizaban, al igual que highlightjs (que era el mencionado en el otro tema). La carga de fuentes desde el CDN también tiene el requisito de CORS.

Así que probablemente había otras cosas sutilmente rotas, incluso antes de los cambios recientes en el sistema de complementos. Ahora que has configurado la configuración de CORS, todo debería funcionar de nuevo :chefs_kiss:

Aja. Eso es lo que no habría adivinado.

Solo un aviso para todos: si están usando Azure Classic CDN, este problema ha comenzado a ocurrir. Estoy probando una solución en el lado del CDN, pero es posible que necesite migrar a Front Door en lugar de Classic CDN.

Sí, confirmé este problema también en Azure Classic CDN.

Necesitas agregar una nueva regla al motor de reglas; aquí tienes un ejemplo:

"rules": [

                        {

                            "name": "JSCORS",

                            "order": 1,

                            "conditions": [

                                {

                                    "name": "RequestUri",

                                    "parameters": {

                                        "typeName": "DeliveryRuleRequestUriConditionParameters",

                                        "operator": "Contains",

                                        "negateCondition": false,

                                        "matchValues": [

                                            "/assets/js/plugins/"

                                        ],

                                        "transforms": []

                                    }

                                }

                            ],

                            "actions": [

                                {

                                    "name": "ModifyResponseHeader",

                                    "parameters": {

                                        "typeName": "DeliveryRuleHeaderActionParameters",

                                        "headerAction": "Overwrite",

                                        "headerName": "Access-Control-Allow-Origin",

                                        "value": "https://forums.mycoolforum.com"

                                    }

                                },

                                {

                                    "name": "ModifyResponseHeader",

                                    "parameters": {

                                        "typeName": "DeliveryRuleHeaderActionParameters",

                                        "headerAction": "Overwrite",

                                        "headerName": "Content-Type",

                                        "value": "application/javascript"

                                    }

                                },

                                {

                                    "name": "CacheExpiration",

                                    "parameters": {

                                        "typeName": "DeliveryRuleCacheExpirationActionParameters",

                                        "cacheBehavior": "BypassCache",

                                        "cacheType": "All"

                                    }

                                }

                            ]

Curiosamente, este problema no ha afectado a los temas, solo a los plugins en nuestro caso.

¿Hay algún lugar donde encontrar instrucciones o orientación sobre estos cambios recientes relacionados con CORS para aquellos de nosotros que usamos Cloudflare?

@pfaffman @TomoftheFog @tanya_byrne @denvergeeks, ¿podrían confirmar cómo tienen configurados sus activos? ¿Solo cuentan con una CDN y el servidor de la aplicación? ¿O también almacenan los activos en S3 o en almacenamiento compatible con S3?

Si están utilizando S3 o almacenamiento compatible con S3, lamentablemente la única forma fiable es agregar alguna configuración específica de la CDN. Asumí que este tema trataba sobre activos de S3, pero ahora no estoy tan seguro.

Para quienes usan una CDN simple frente al servidor de la aplicación, no debería haber sido necesario realizar ningún trabajo de configuración adicional. Debería «simplemente funcionar», exactamente igual que los bundles de theme-javascripts y highlightjs. Pero parece que en nuestra configuración predeterminada de NGINX faltaba efectivamente la cabecera. ¡Lo sentimos!

Esto debería hacer que las cosas vuelvan a funcionar:

Una vez que esto se fusiona, será necesario ejecutar ./launcher rebuild app para que surta efecto. Los cambios en la configuración de NGINX no se aplican durante las actualizaciones de la interfaz de usuario.

He añadido esta información al tema principal:

¡Disculpa las molestias! Deberíamos haber realizado más pruebas exhaustivas con diferentes configuraciones de CDN. Por favor, avísanos si sigues experimentando problemas después de la reconstrucción.

Confirmamos que no utilizamos S3.

Todos los sitios de los que tengo conocimiento que presentan este problema están en S3. Algunas CDN ya tenían JS en la lista y otras no. No sé por qué podría ser eso; ¿quizás los valores predeterminados cambiaron con los años?

Lo siento por la respuesta tardía, sí utilizamos S3.

Tuve problemas para configurar CORS en Cloudflare R2 para esto con un dominio personalizado. Al final lo resolví a la fuerza aplicando una regla de transformación de encabezados para siempre insertar el encabezado correcto para mi dominio de CDN. Por si acaso esto ayuda a alguien más.

También hemos detectado otro problema desde que surgió este: algunos usuarios no pueden ver las imágenes de los avatares al utilizar el botón de formato predefinido en Markdown. Intenta cargar highlight-js y arroja un error indicando que falló el CORS:

No estamos seguros de si esto solo ocurre en nuestro caso, pero queríamos informar a todos por si estuviera relacionado.

Asumo que f.insertcred.it es tu CDN de S3. HighlightJS debería cargarse desde el ‘CDN de la aplicación’, no desde el CDN de S3, por lo que este es un problema sorprendente. Por lo que sé, nada relacionado con highlightjs ha cambiado en los últimos meses.

¿Tienes un CDN de aplicación? ¿O solo S3 + CDN de S3?

He recibido una actualización del administrador principal del foro:


Por lo que sé, no tenemos una aplicación CDN. No hemos descomentado la variable DISCOURSE_CDN_URL en app.yml.

Solo utilizamos las variables de S3 como DISCOURSE_S3_ENDPOINT y DISCOURSE_S3_CDN_URL, etcétera.

Aquí está nuestro archivo app.yml con la información sensible eliminada

## esta es la plantilla del contenedor Docker de Discourse todo-en-uno, autónoma
##
## Después de realizar cambios en este archivo, DEBES reconstruir
## /var/discourse/launcher rebuild app
##
## ¡TEN MUCHO CUIDADO AL EDITAR!
## ¡LOS ARCHIVOS YAML SON EXTREMADAMENTE SENSIBLES A ERRORES EN LOS ESPACIOS EN BLANCO O EN LA ALINEACIÓN!
## visita http://www.yamllint.com/ para validar este archivo según sea necesario

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  ## Descomenta la siguiente línea para habilitar el oyente IPv6
  #- "templates/web.ipv6.template.yml"
  - "templates/web.ratelimited.template.yml"
  ## Descomenta estas dos líneas si deseas agregar Lets Encrypt (https)
  - "templates/web.ssl.template.yml"
  - "templates/web.letsencrypt.ssl.template.yml"

## ¿Qué puertos TCP/IP debe exponer este contenedor?
## Si deseas que Discourse comparta un puerto con otro servidor web como Apache o nginx,
## consulta https://meta.discourse.org/t/17247 para obtener detalles
expose:
  - "80:80"   # http
  - "443:443" # https

params:
  db_default_text_search_config: "pg_catalog.english"

  ## Establece db_shared_buffers a un máximo del 25% de la memoria total.
  ## se establecerá automáticamente durante el arranque según la RAM detectada, o puedes sobrescribirlo
  db_shared_buffers: "256MB"

  ## puede mejorar el rendimiento de ordenamiento, pero aumenta el uso de memoria por conexión
  #db_work_mem: "40MB"

  ## ¿Qué revisión de Git debe usar este contenedor? (predeterminado: tests-passed)
  #version: tests-passed

  ## Tamaño máximo de carga (predeterminado: 10m)
  upload_size: 20m

env:
  LC_ALL: en_US.UTF-8
  LANG: en_US.UTF-8
  LANGUAGE: en_US.UTF-8
  # DISCOURSE_DEFAULT_LOCALE: en

  ## ¿Cuántas solicitudes web simultáneas se admiten? Depende de la memoria y los núcleos de CPU.
  ## se establecerá automáticamente durante el arranque según las CPUs detectadas, o puedes sobrescribirlo
  UNICORN_WORKERS: 4

  ## TODO: El nombre de dominio al que responderá esta instancia de Discourse
  ## Obligatorio. Discourse no funcionará con una dirección IP sin nombre.
  DISCOURSE_HOSTNAME: forums.insertcredit.com

  ## Descomenta si deseas que el contenedor se inicie con el mismo
  ## nombre de host (opción -h) que se especificó arriba (predeterminado "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: Lista de correos electrónicos delimitados por comas que serán administradores y desarrolladores
  ## en el registro inicial, por ejemplo 'usuario1@ejemplo.com,usuario2@ejemplo.com'
  DISCOURSE_DEVELOPER_EMAILS: 'CORREO'
  
  ## TODO: El servidor de correo SMTP utilizado para validar nuevas cuentas y enviar notificaciones
  ## Se requieren la dirección SMTP, el nombre de usuario y la contraseña
  ## ¡ADVERTENCIA: el carácter '#' en la contraseña de SMTP puede causar problemas!
  DISCOURSE_SMTP_ADDRESS: smtp.mailgun.org
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: USUARIO
  DISCOURSE_SMTP_PASSWORD: "CONTRASEÑA"
  DISCOURSE_SMTP_ENABLE_START_TLS: true           # (opcional, predeterminado true)
  DISCOURSE_SMTP_DOMAIN: forums.insertcredit.com
  DISCOURSE_NOTIFICATION_EMAIL: noreply@forum.insertcred.it
  DISCOURSE_USE_S3: true
  DISCOURSE_S3_REGION: nyc3
  DISCOURSE_S3_ENDPOINT: https://nyc3.digitaloceanspaces.com
  DISCOURSE_S3_ACCESS_KEY_ID: CLAVE_ID
  DISCOURSE_S3_SECRET_ACCESS_KEY: VALOR_CLAVE_ACCESO
  DISCOURSE_S3_CDN_URL: https://f.insertcred.it
  DISCOURSE_S3_BUCKET: insertcredit-forum
  DISCOURSE_S3_BACKUP_BUCKET: insertcredit-forum-backup
  DISCOURSE_BACKUP_LOCATION: s3
  DISCOURSE_S3_INSTALL_CORS_RULE: false

  DISCOURSE_CAN_PERMANENTLY_DELETE: true

  ## Si agregaste la plantilla de Lets Encrypt, descomenta a continuación para obtener un certificado SSL gratuito
  LETSENCRYPT_ACCOUNT_EMAIL: CORREO

  ## La dirección CDN http o https para esta instancia de Discourse (configurada para extraer)
  ## consulta https://meta.discourse.org/t/14857 para obtener detalles
  #DISCOURSE_CDN_URL: https://discourse-cdn.ejemplo.com

  ## La clave de dirección IP de geolocalización de maxmind para la búsqueda de direcciones IP
  ## consulta https://meta.discourse.org/t/-/137387/23 para obtener detalles
  #DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456

## El contenedor Docker es sin estado; todos los datos se almacenan en /shared
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## Los plugins van aquí
## consulta https://meta.discourse.org/t/19157 para obtener detalles
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/discourse-bbcode-color.git
          - git clone https://github.com/discourse/discourse-signatures.git
          - git clone https://github.com/discourse/discourse-chart.git
  after_assets_precompile:
    - exec:
        cd: $home
        cmd:
          - sudo -E -u discourse bundle exec rake s3:upload_assets
          - sudo -E -u discourse bundle exec rake s3:expire_missing_assets

## Cualquier comando personalizado para ejecutar después de la compilación
run:
  - exec: echo "Inicio de comandos personalizados"
  ## Si deseas establecer la dirección de correo electrónico 'De' para tu primer registro, descomenta y cambia:
  ## Después de recibir el primer correo de registro, vuelve a comentar la línea. Solo necesita ejecutarse una vez.
  #- exec: rails r "SiteSetting.notification_email='info@sin-configurar.discourse.org'"
  - exec: echo "Fin de comandos personalizados"

Espero que esto sea de alguna ayuda respecto a la consulta. Un punto a tener en cuenta es que no hemos recibido informes sobre los problemas de desaparición de avatares que tuvimos hace unos días. Por lo que sé, no se ha realizado ningún cambio, por lo que no estamos seguros de si el problema fue solo un pequeño grupo de usuarios y, desde que se resolvió el problema anterior, se solucionó por sí mismo con el tiempo.

Gracias de nuevo por investigar esto.