Discourse peut-il envoyer fréquemment des images Docker qui n'ont pas besoin d'être initialisées ?

Je crois que le lanceur a été créé avant que docker compose n’existe :

1 « J'aime »

Docker compose ne propose pas la fonctionnalité requise. La construction de modèles de fichiers Docker de Discourse permet des résultats Docker flexibles. Avec compose, tout ce que vous avez est un ensemble possible de Dockerfiles fixes qui peuvent résulter en un tas de conteneurs.

Dans ma configuration Discourse, j’utilise un seul conteneur avec Discourse et nginx utilisant un socket UNIX. PostgreSQL et Redis sont un service sur l’hôte. C’est une déviation assez importante par rapport à la configuration par défaut, mais c’est possible dès la sortie de la boîte.

C’est partiellement possible avec compose, peut-être en utilisant la fonctionnalité de profil plutôt mal conçue. Mais même alors, c’est plutôt désordonné. Ou vous devriez fournir différents fichiers compose pour chaque variation.

Vous ne faites que déplacer le problème.

Une configuration compose propre pour Discourse serait les services suivants dans des conteneurs séparés :

  • Discourse
  • nginx
  • PostgreSQL
  • Redis

Discourse et nginx doivent partager un volume, rien de grave.

PostgreSQL et Redis… ce sont des choses que vous pourriez vouloir héberger ailleurs, et ne pas avoir de conteneur spécifique à Discourse pour cela. Et maintenant, docker compose devient un problème docker compose up -d lancera votre PostgreSQL indésirable. Ok, donc nous faisons docker compose --profile postgresql up -d pour lancer la configuration de base de discourse, et un conteneur postgresql. docker compose --profile postgresql --profile redis up -d pour la configuration complète du conteneur Discourse autonome. Vous feriez mieux de ne pas oublier un argument --profile ..., car alors vous avez plus de problèmes.

Donc, pour une meilleure expérience utilisateur, vous créez un lanceur pour gérer la création de la commande docker compose souhaitée. Nous sommes maintenant un peu de retour là où nous en étions. Sauf que les modifications du conteneur nginx ne sont pas encore possibles. J’ai donc besoin d’un conteneur nginx-http et d’un conteneur nginx-unix qui devraient être mutuellement exclusifs ? …

Bien sûr, la gestion des plugins pourrait être meilleure, mais faire cela avec docker compose, ce serait l’enfer.

1 « J'aime »

Pour résumer. Il n’y aura pas d’image Docker appropriée.

Quant à la quantité incroyable de connaissances erronées sur ce qu’est Docker et comment il fonctionne : What is Docker? | Docker Docs

Vous pouvez partager des conteneurs pendant que vous travaillez, et être sûr que tous ceux avec qui vous partagez obtiennent le même conteneur qui fonctionne de la même manière.

Aussi - avec le bien-aimé “lanceur” - comment puis-je exécuter Discourse sur un cluster k8s étant donné qu’il n’y a pas d’image Docker que je puisse consommer et y déployer ?

Riiight…

Ce script doit être exécuté en tant que root. Veuillez utiliser sudo ou vous connecter en tant que root d’abord.

Non merci. Je n’aime pas exécuter de scripts aléatoires provenant d’Internet. Je veux juste avoir une belle image Docker que je puisse exécuter en toute sécurité en isolation :slight_smile:

[citation=“elmuerte, message:188, sujet:33205”]
Docker compose ne dispose pas de la fonctionnalité requise.
[/citation]

J’ai déployé avec succès Discourse en production en utilisant Docker Compose avec l’image publiée, tout comme des clients.

Cependant, oui, c’est compliqué et une quantité raisonnable de travail personnalisé est nécessaire.

Il est beaucoup plus facile de s’en tenir à l’installation standard avec le lanceur CDCK à moins que vous ne deviez vraiment utiliser une méthode différente parce que vous avez une opinion arrêtée, une architecture spécifique ou d’autres exigences particulières.

1 « J'aime »

Utiliser une approche qui ne vous prend pas par la main n’est pas « opinionné, spécifique ou spécial » :roll_eyes:

Quoi qu’il en soit, l’indice est d’avoir l’image Docker originale de Discourse. Aussi simple que cela.

J’ai essayé d’utiliser le guide officiel et le « lanceur » juste pour jouer avec la configuration - sans succès (sauf pour une vérification assez stupide si l’utilisateur est root, ce qui ne demande que des problèmes).

Je me suis ensuite tourné vers l’image Bitnami (et son fichier Compose suggéré) depuis https://hub.docker.com/r/bitnami/discourse et après un docker compose up (et une série d’erreurs SQL [ce qui n’augure rien de bon] ainsi que des avertissements de Ruby [même réserve]), j’ai obtenu une instance de Discourse en cours d’exécution :

Purement alambiqué et « magie non standard »…

Alors encore une fois - pourquoi n’y a-t-il pas d’image régulière ?

En fouillant dans les sources et les dépôts, j’ai trouvé que l’image de base est utilisée (https://hub.docker.com/r/discourse/base/) bien que son versionnement/tagging m’ait surpris (https://hub.docker.com/r/discourse/base/tags)… Il n’y a pas de versions sensées me suis-je demandé ? Et en effet, en regardant le dépôt principal, il ne semblait pas y avoir de versions, mais bon - au moins il y a des versions correctement taguées (Tags · discourse/discourse · GitHub).

Maintenant, on se demande - pourquoi n’y a-t-il pas d’images correspondantes sur le Docker Hub principal ?

Alors oui - en regardant comment les choses sont organisées, je suis d’accord :

:smiley:


D’un autre côté (ou plutôt : « comment les choses devraient être »), projet exemple (plus petit en portée, mais le raisonnement tient) : GitHub - miniflux/v2: Minimalist and opinionated feed reader.

Il a des versions sensées : Releases · miniflux/v2 · GitHub

Qui ont des images correspondantes correctement taguées : https://hub.docker.com/r/miniflux/miniflux/tags

Et ensuite, la mise à niveau consiste simplement à changer la version de x à y (ou à utiliser le tag latest pour qu’un simple stop/pull/start donne la version mise à jour (qui exécutera automatiquement toutes les migrations requises).

(oh, et l’image est environ 70 fois plus petite, mais c’est une autre histoire)

Bon travail !

Juste deux questions… qu’est-ce que les erreurs SQL et les avertissements ruby ? Je ne suis pas familier avec cela. Mais c’est peut-être parce que j’ai utilisé docker et tout le reste de manière totalement erronée :thinking:

Vous faites quelque chose comme ceci :

./launcher bootstrap myimage
# la commande qui pousse cette image vers votre emplacement préféré pour lancer des images
./launcher start-cmd

et cela vous donne les variables d’environnement dont vous avez besoin pour lancer votre image.

Ce n’est vraiment pas si difficile. Vous pouvez même l’intégrer dans une action github afin qu’elle construise votre image et la pousse vers votre dépôt d’images docker. En regardant les commits de docker_compose, il semble que des mesures soient prises pour produire une image qui n’a pas besoin d’être amorcée, ou du moins pour faciliter certaines des tâches requises (migrer la base de données, précompiler les actifs et les pousser vers s3, etc.). J’ai fait cela pour des clients qui voulaient utiliser k8s ou l’outil de lancement d’images AWS (je ne me souviens plus de son nom).

Quelques fois, j’ai envisagé d’offrir de telles images pré-construites en tant que service, mais je n’ai jamais trouvé personne qui voulait payer pour cela.

Mais il y a un tas de petites pièces. Au mieux, je peux dire que CDCK utilise le lanceur pour construire des images, mais ils les lancent et les gèrent avec d’autres outils, tout comme vous le souhaitez. Et quand ils ont commencé, docker-compose n’était pas encore un moyen décent de le faire et quand il l’a été, ils avaient déjà fait fonctionner le lanceur, donc trouver un moyen de migrer tout le monde du lanceur vers autre chose n’était vraiment pas une option.

Si les images bitnami fonctionnent pour vous, utilisez-les, mais si ce n’est pas le cas, vous devrez obtenir de l’aide de quelqu’un qui les utilise, ce qui n’est pratiquement personne ici.

2 « J'aime »

Eh… I already deleted the file and whole setup as I found NodeBB which feels less user hostile when it comes to deployment (guide: Docker - NodeBB Documentation; simple docker-compose file with 3 services: nodebb, postgres and redis: NodeBB/docker-compose-pgsql.yml at master · NodeBB/NodeBB · GitHub; and nicely tagged images: Package nodebb · GitHub)

However, I got the image and here are the relevant errors:

  1. seems like sql schema issue:
postgresql-1  | 2025-07-06 17:15:40.518 GMT [155] ERROR:  relation "translation_overrides" does not exist at character 523
postgresql-1  | 2025-07-06 17:15:40.518 GMT [155] STATEMENT:  SELECT a.attname, format_type(a.atttypid, a.atttypmod),
postgresql-1  | 	       pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod,
postgresql-1  | 	       c.collname, col_description(a.attrelid, a.attnum) AS comment,
postgresql-1  | 	       attidentity AS identity,
postgresql-1  | 	       attgenerated as attgenerated
postgresql-1  | 	  FROM pg_attribute a
postgresql-1  | 	  LEFT JOIN pg_attrdef d ON a.attrelid = d.adrelid AND a.attnum = d.adnum
postgresql-1  | 	  LEFT JOIN pg_type t ON a.atttypid = t.oid
postgresql-1  | 	  LEFT JOIN pg_collation c ON a.attcollation = c.oid AND a.attcollation <> t.typcollation
postgresql-1  | 	 WHERE a.attrelid = '"translation_overrides"'::regclass
postgresql-1  | 	   AND a.attnum > 0 AND NOT a.attisdropped
postgresql-1  | 	 ORDER BY a.attnum
postgresql-1  |
postgresql-1  | 2025-07-06 17:15:40.616 GMT [156] ERROR:  relation "translation_overrides" does not exist at character 523
postgresql-1  | 2025-07-06 17:15:40.616 GMT [156] STATEMENT:  SELECT a.attname, format_type(a.atttypid, a.atttypmod),
postgresql-1  | 	       pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod,
postgresql-1  | 	       c.collname, col_description(a.attrelid, a.attnum) AS comment,
postgresql-1  | 	       attidentity AS identity,
postgresql-1  | 	       attgenerated as attgenerated
postgresql-1  | 	  FROM pg_attribute a
postgresql-1  | 	  LEFT JOIN pg_attrdef d ON a.attrelid = d.adrelid AND a.attnum = d.adnum
postgresql-1  | 	  LEFT JOIN pg_type t ON a.atttypid = t.oid
postgresql-1  | 	  LEFT JOIN pg_collation c ON a.attcollation = c.oid AND a.attcollation <> t.typcollation
postgresql-1  | 	 WHERE a.attrelid = '"translation_overrides"'::regclass
postgresql-1  | 	   AND a.attnum > 0 AND NOT a.attisdropped
postgresql-1  | 	 ORDER BY a.attnum
  1. ruby warnings (both in discourse as well as sidekiq containers, which kinda makes sense as they use same image :D):
sidekiq-1     | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:5: warning: already initialized constant DiscourseAutomation::Scripts::ADD_USER_TO_GROUP_THROUGH_CUSTOM_FIELD
sidekiq-1     | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:5: warning: previous definition of ADD_USER_TO_GROUP_THROUGH_CUSTOM_FIELD was here
sidekiq-1     | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:6: warning: already initialized constant DiscourseAutomation::Scripts::APPEND_LAST_CHECKED_BY
sidekiq-1     | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:6: warning: previous definition of APPEND_LAST_CHECKED_BY was here
sidekiq-1     | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:7: warning: already initialized constant DiscourseAutomation::Scripts::APPEND_LAST_EDITED_BY
sidekiq-1     | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:7: warning: previous definition of APPEND_LAST_EDITED_BY was here
sidekiq-1     | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:8: warning: already initialized constant DiscourseAutomation::Scripts::AUTO_RESPONDER
sidekiq-1     | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:8: warning: previous definition of AUTO_RESPONDER was here
sidekiq-1     | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:9: warning: already initialized constant DiscourseAutomation::Scripts::AUTO_TAG_TOPIC
sidekiq-1     | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:9: warning: previous definition of AUTO_TAG_TOPIC was here
sidekiq-1     | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:10: warning: already initialized constant DiscourseAutomation::Scripts::BANNER_TOPIC
sidekiq-1     | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:10: warning: previous definition of BANNER_TOPIC was here
sidekiq-1     | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:11: warning: already initialized constant DiscourseAutomation::Scripts::CLOSE_TOPIC
sidekiq-1     | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:11: warning: previous definition of CLOSE_TOPIC was here
sidekiq-1     | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:12: warning: already initialized constant DiscourseAutomation::Scripts::FLAG_POST_ON_WORDS
sidekiq-1     | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:12: warning: previous definition of FLAG_POST_ON_WORDS was here
sidekiq-1     | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:13: warning: already initialized constant DiscourseAutomation::Scripts::GIFT_EXCHANGE
sidekiq-1     | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:13: warning: previous definition of GIFT_EXCHANGE was here
sidekiq-1     | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:14: warning: already initialized constant DiscourseAutomation::Scripts::GROUP_CATEGORY_NOTIFICATION_DEFAULT
sidekiq-1     | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:14: warning: previous definition of GROUP_CATEGORY_NOTIFICATION_DEFAULT was here
sidekiq-1     | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:15: warning: already initialized constant DiscourseAutomation::Scripts::PIN_TOPIC
sidekiq-1     | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:15: warning: previous definition of PIN_TOPIC was here
sidekiq-1     | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:16: warning: already initialized constant DiscourseAutomation::Scripts::POST
sidekiq-1     | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:16: warning: previous definition of POST was here
sidekiq-1     | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:17: warning: already initialized constant DiscourseAutomation::Scripts::SEND_PMS
sidekiq-1     | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:17: warning: previous definition of SEND_PMS was here
sidekiq-1     | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:18: warning: already initialized constant DiscourseAutomation::Scripts::SUSPEND_USER_BY_EMAIL
sidekiq-1     | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:18: warning: previous definition of SUSPEND_USER_BY_EMAIL was here
sidekiq-1     | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:19: warning: already initialized constant DiscourseAutomation::Scripts::TOPIC
sidekiq-1     | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:19: warning: previous definition of TOPIC was here
sidekiq-1     | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:20: warning: already initialized constant DiscourseAutomation::Scripts::TOPIC_REQUIRED_WORDS
sidekiq-1     | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:20: warning: previous definition of TOPIC_REQUIRED_WORDS was here
sidekiq-1     | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:21: warning: already initialized constant DiscourseAutomation::Scripts::USER_GLOBAL_NOTICE
sidekiq-1     | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:21: warning: previous definition of USER_GLOBAL_NOTICE was here
sidekiq-1     | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:22: warning: already initialized constant DiscourseAutomation::Scripts::USER_GROUP_MEMBERSHIP_THROUGH_BADGE
sidekiq-1     | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:22: warning: previous definition of USER_GROUP_MEMBERSHIP_THROUGH_BADGE was here
sidekiq-1     | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:23: warning: already initialized constant DiscourseAutomation::Scripts::ZAPIER_WEBHOOK
sidekiq-1     | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:23: warning: previous definition of ZAPIER_WEBHOOK was here
sidekiq-1     | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:5: warning: already initialized constant DiscourseAutomation::Triggers::AFTER_POST_COOK
sidekiq-1     | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:5: warning: previous definition of AFTER_POST_COOK was here
sidekiq-1     | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:6: warning: already initialized constant DiscourseAutomation::Triggers::API_CALL
sidekiq-1     | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:6: warning: previous definition of API_CALL was here
sidekiq-1     | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:7: warning: already initialized constant DiscourseAutomation::Triggers::CATEGORY_CREATED_EDITED
sidekiq-1     | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:7: warning: previous definition of CATEGORY_CREATED_EDITED was here
sidekiq-1     | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:8: warning: already initialized constant DiscourseAutomation::Triggers::PM_CREATED
sidekiq-1     | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:8: warning: previous definition of PM_CREATED was here
sidekiq-1     | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:9: warning: already initialized constant DiscourseAutomation::Triggers::TOPIC_TAGS_CHANGED
sidekiq-1     | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:9: warning: previous definition of TOPIC_TAGS_CHANGED was here
sidekiq-1     | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:10: warning: already initialized constant DiscourseAutomation::Triggers::POINT_IN_TIME
sidekiq-1     | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:10: warning: previous definition of POINT_IN_TIME was here
sidekiq-1     | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:11: warning: already initialized constant DiscourseAutomation::Triggers::POST_CREATED_EDITED
sidekiq-1     | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:11: warning: previous definition of POST_CREATED_EDITED was here
sidekiq-1     | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:12: warning: already initialized constant DiscourseAutomation::Triggers::RECURRING
sidekiq-1     | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:12: warning: previous definition of RECURRING was here
sidekiq-1     | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:13: warning: already initialized constant DiscourseAutomation::Triggers::STALLED_TOPIC
sidekiq-1     | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:13: warning: previous definition of STALLED_TOPIC was here
sidekiq-1     | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:14: warning: already initialized constant DiscourseAutomation::Triggers::STALLED_WIKI
sidekiq-1     | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:14: warning: previous definition of STALLED_WIKI was here
sidekiq-1     | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:15: warning: already initialized constant DiscourseAutomation::Triggers::TOPIC
sidekiq-1     | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:15: warning: previous definition of TOPIC was here
sidekiq-1     | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:16: warning: already initialized constant DiscourseAutomation::Triggers::USER_ADDED_TO_GROUP
sidekiq-1     | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:16: warning: previous definition of USER_ADDED_TO_GROUP was here
sidekiq-1     | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:17: warning: already initialized constant DiscourseAutomation::Triggers::USER_BADGE_GRANTED
sidekiq-1     | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:17: warning: previous definition of USER_BADGE_GRANTED was here
sidekiq-1     | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:18: warning: already initialized constant DiscourseAutomation::Triggers::USER_FIRST_LOGGED_IN
sidekiq-1     | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:18: warning: previous definition of USER_FIRST_LOGGED_IN was here
sidekiq-1     | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:19: warning: already initialized constant DiscourseAutomation::Triggers::USER_PROMOTED
sidekiq-1     | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:19: warning: previous definition of USER_PROMOTED was here
sidekiq-1     | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:20: warning: already initialized constant DiscourseAutomation::Triggers::USER_REMOVED_FROM_GROUP
sidekiq-1     | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:20: warning: previous definition of USER_REMOVED_FROM_GROUP was here
sidekiq-1     | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:21: warning: already initialized constant DiscourseAutomation::Triggers::USER_UPDATED
sidekiq-1     | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:21: warning: previous definition of USER_UPDATED was here
sidekiq-1     | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers/recurring.rb:6: warning: already initialized constant DiscourseAutomation::Triggers::Recurring::RECURRENCE_CHOICES
sidekiq-1     | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers/recurring.rb:6: warning: previous definition of RECURRENCE_CHOICES was here
sidekiq-1     | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers/stalled_wiki.rb:6: warning: already initialized constant DiscourseAutomation::Triggers::StalledWiki::DURATION_CHOICES
sidekiq-1     | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers/stalled_wiki.rb:6: warning: previous definition of DURATION_CHOICES was here
sidekiq-1     | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers/topic_tags_changed.rb:7: warning: already initialized constant DiscourseAutomation::Triggers::TopicTagsChanged::TriggerOn::TAGS_ADDED_OR_REMOVED
sidekiq-1     | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers/topic_tags_changed.rb:7: warning: previous definition of TAGS_ADDED_OR_REMOVED was here
sidekiq-1     | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers/topic_tags_changed.rb:8: warning: already initialized constant DiscourseAutomation::Triggers::TopicTagsChanged::TriggerOn::TAGS_ADDED
sidekiq-1     | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers/topic_tags_changed.rb:8: warning: previous definition of TAGS_ADDED was here
sidekiq-1     | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers/topic_tags_changed.rb:9: warning: already initialized constant DiscourseAutomation::Triggers::TopicTagsChanged::TriggerOn::TAGS_REMOVED
sidekiq-1     | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers/topic_tags_changed.rb:9: warning: previous definition of TAGS_REMOVED was here
sidekiq-1     | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers/topic_tags_changed.rb:11: warning: already initialized constant DiscourseAutomation::Triggers::TopicTagsChanged::TriggerOn::MODES
sidekiq-1     | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers/topic_tags_changed.rb:11: warning: previous definition of MODES was here
sidekiq-1     | 2025-07-06T17:15:52.699Z pid=1 tid=4ox INFO: Booted Rails 7.2.2.1 application in production environment

C’est un excellent point. Il n’y a vraiment pas de bonne raison pour que ce script ne puisse pas s’exécuter en tant qu’utilisateur non root.

Le script de configuration est le seul qui a vraiment besoin des privilèges root, pour la partie effrayante où il suggère d’exécuter le script d’installation de Docker depuis Internet. Donc, même cela peut être modifié pour s’exécuter en tant qu’utilisateur non root.

Le script de lancement n’a pas besoin des privilèges root, il a juste besoin d’un accès en écriture à /var/discourse et de la permission de gérer les conteneurs Docker.

1 « J'aime »

Euh… :slight_smile:

Le script n’a même pas besoin d’accéder à /var/discourse (pourquoi le fait-il ?).

L’ensemble du problème découle de quelques éléments :

  1. une énorme incompréhension de ce qu’est docker, de son fonctionnement et de ce qu’il permet
  2. le collage de la notion que docker = docker-compose (ce n’est pas le cas !)

Vous pouvez avoir une configuration complètement contenue qui ne touche pratiquement pas l’environnement hôte…

Après avoir pas mal fouillé, il semble que tout le script de “configuration” ait été créé pour rendre l’installation aussi simple que possible pour la personne très peu technique. Il vérifie, guide l’utilisateur et configure tout. Cela peut être une bonne chose, mais cela échoue complètement dans tout ce qui tente de s’écarter, même d’un tout petit pouce, du chemin envisagé.

Dans la configuration la plus basique, vous n’avez peut-être même pas besoin d’accéder à des répertoires hôtes - tout sera contenu dans un environnement limité (l’image sera utilisée pour créer le conteneur et tout le stockage requis sera géré via des volumes docker [cela pose des problèmes lorsque vous souhaitez migrer ailleurs ou accéder aux fichiers, mais nous parlons des bases]).

Il essaie également de s’assurer que le DNS est correct, essaie de configurer les certificats, le proxy inverse, le SMTP et autres - encore une fois, c’est tout à fait normal de fournir cette configuration facile.

MAIS !

Le problème n’est PAS de jeter cela mais de fournir EN PLUS une image docker simple (elle existe déjà, elle est utilisée par les scripts et les modèles utilisés par le script ! discourse_docker/templates/postgres.template.yml at main · discourse/discourse_docker · GitHub & discourse_docker/launcher at main · discourse/discourse_docker · GitHub) avec

  1. un versionnement approprié : vous étiquetez l’image avec la version de discourse publiée (3.4.5 ou autre)
  2. une documentation saine et simple des variables d’environnement attendues (pilotant la connectivité de la base de données/redis/etc.) et des chemins/volumes possibles qui peuvent être montés sur l’hôte.

Juste ça…

Jetez un œil au guide miniflux mentionné précédemment : Miniflux Installation with Docker - il vous donne des détails sur l’image (et quels dépôts les servent) et les variables d’environnement possibles pour la configurer.
Ou l’image docker MySQL : https://hub.docker.com/_/mysql - la même chose - un guide qui explique ce qui est possible de configurer (voir surtout la section : “Variables d’environnement”).

Personne ne dit : “vous devez utiliser le lanceur mysql pour construire l’image mysql afin de pouvoir l’utiliser”, ni redis d’ailleurs - dans ce cas, vous utilisez simplement les images existantes et c’est l’indice et l’essence de l’utilisation de docker. Pourtant, dans le cas de discourse, soudainement, c’est une mauvaise solution et tout le monde crie : “vous devez construire votre propre image !” – pourquoi !?

Non. À cause des plugins.

1 « J'aime »

Euh… j’ai dû creuser un peu concernant les plugins et encore une fois je dois dire/citer :

:smiley:

Alors ce que j’ai fait : je suis allé dans la section plugins, j’ai cliqué sur le premier plugin à la recherche d’instructions et d’un guide d’installation (Plugin directory | Discourse - Civilized DiscussionSign in with Apple | Discourse - Civilized DiscussionDiscourse Apple AuthenticationInstall plugins on a self-hosted site) et… mon dieu - quel “bazar” compliqué.

Pourquoi diable auriez-vous besoin d’une nouvelle image juste pour avoir des plugins ? Avec Docker, vous pouvez simplement spécifier un répertoire de montage pour les plugins, puis y placer le vôtre…

Je ne suis pas un expert en Ruby, donc les choses peuvent être plus étranges ici, mais par exemple dans le monde Java, vous déposez simplement un jar avec le plugin pour qu’il soit chargé et voilà - vous l’avez en cours d’exécution. Et vous utilisez la même image que tout le monde…

(Je ne dis pas que ce n’est pas désordonné, j’explique juste pourquoi les choses sont comme elles sont)

À cause du pipeline d’assets Ember.

Ce qui serait également un gâchis, car vous ne voulez pas avoir ces dépendances en externe.

2 « J'aime »

Celui-ci : GitHub - ember-engines/ember-asset-loader: Asset loading support for Ember applications ?

Pourquoi pas par contre ?

Les plugins peuvent être traités à la volée, cela se fait également lors de la mise à niveau d’un plugin. Avec un peu de magie, vous pouvez également ajouter un nouveau plugin à une instance en cours d’exécution sans reconstruire le conteneur. Ainsi, le montage d’un volume de plugin dans un conteneur devrait être possible (avec un tas de changements).

Le principal problème que je vois concerne la mise à niveau de Discourse. Cela peut actuellement être fait avec une instance en cours d’exécution. La mise à niveau reconstruit essentiellement Discourse. Si Discourse provenait réellement d’une image pré-construite, vous ne pouvez pas modifier ces fichiers. Ainsi, la mise à niveau avec peu ou pas de temps d’arrêt nécessitera probablement pas mal de travail.

C’est quelque chose que je ne saisis pas (probablement un manque de contexte en termes de Ruby…).

En général, avec Docker/conteneurs/orchestration, vous pouvez avoir des déploiements blue-green/red-black où vous préparez un nouveau conteneur avec une nouvelle version et basculez le trafic une fois qu’il est prêt. Cependant, en général, pour les déploiements plus petits, cela ne devrait pas poser de problème car la plupart du temps, le démarrage du service (conteneur) ne prend que quelques secondes, donc le temps d’arrêt lors du changement de version devrait être minime (le plus gros problème est de devoir exécuter des mises à niveau de schéma, mais cela s’applique indépendamment du fait que vous reconstruisiez l’image ou non).

Oui, mais ce n’est pas comme ça que ça fonctionne actuellement, donc c’est la partie qui nécessite un travail. Comment allez-vous faire cela depuis l’interface d’administration de Discourse. Comment allez-vous réduire le conteneur bleu tout en lançant le conteneur vert (les systèmes n’ont pas de ressources infinies, donc avant de lancer le bleu, vous voulez réduire les workers unicorn dans le vert.) Ou vous pouvez simplement considérer que le vert est arrêté, et maintenant le bleu démarre.

Il y a beaucoup de choses qui doivent être comprises et résolues. Tant d’un point de vue technique que d’un point de vue administrateur. La mise à niveau en un clic depuis l’interface d’administration est une fonctionnalité précieuse.

1 « J'aime »

Les plugins et les images personnalisées doivent encore être créés, mais pour la construction vanilla, la composition devient à portée de main de nos jours - j’ai fait une petite preuve de concept ici pour ceux qui sont curieux.

Évidemment, comme ce sont tous mes dépôts (pas ceux de Discourse™), ce n’est rien d’officiel, donc votre kilométrage peut varier, et ne vous attendez certainement pas à un support officiel :dragon: Je lance ceci ici, car il a été mentionné que des gens utilisent déjà bitnami et d’autres moyens non approuvés pour l’exécuter.

Les images postgres (ou pgvector) prêtes à l’emploi ne fonctionnent pas pour Discourse - Discourse doit modifier la configuration par défaut, ne se connecte pas via un superutilisateur, prend en charge les locales et doit prendre en charge les mises à niveau de postgres sans qu’un administrateur Discourse ait besoin de vider/restaurer.

4 « J'aime »

Euh… c’est je pense la différence cruciale et cette « mise à jour depuis l’interface d’administration » rappelle un peu le bon vieux temps, où l’on n’avait que l’« hébergement web » avec un interpréteur php, donc tout était construit autour de cette notion. Et je pense que cela s’est reporté sur la façon dont Discourse fonctionne et est censé être géré.

Eh bien, c’est une autre chose que j’ai remarquée - discourse est assez lourd (le conteneur a commencé à consommer des ressources au démarrage à un niveau effrayant) donc oui - cela pourrait être un problème.

Comment ceux-ci sont-ils « construits » dans le contexte de Ruby (qui est principalement un langage interprété et non compilé) ?

Ne serait-il pas préférable d’essayer d’utiliser des solutions prêtes à l’emploi ? Même pour la configuration de postgres, cela peut être facilement modifié en fournissant/montant simplement un fichier postgresql.conf personnalisé, pas besoin d’une image complètement personnalisée avec une configuration intégrée… et même encore - si cela est requis, discourse pourrait fournir une telle image pré-construite qui serait simplement tirée au lieu d’être reconstruite à chaque fois…

Cette « interface de mise à niveau d’administration » est un plugin (appelé « docker manager »). Vous n’avez pas besoin de l’inclure si vous avez un autre moyen de faire des mises à jour en ligne.