Credo che il launcher sia stato creato prima che esistesse docker compose:
Discourse può distribuire frequentemente immagini Docker che non necessitano di essere bootstrapate?
Docker Compose non offre la funzionalità richiesta. La costruzione del templating dei file Docker di Discourse consente risultati Docker flessibili. Con Compose, tutto ciò che si ha è un possibile set di Dockerfile fissi che possono risultare in un gruppo di container.
Nella mia configurazione di Discourse, utilizzo un singolo container con Discourse e nginx tramite un socket UNIX. PostgreSQL e Redis sono un servizio sull’host. Questa è una deviazione piuttosto significativa dalla configurazione predefinita, ma è possibile fin da subito.
È parzialmente possibile con Compose, forse utilizzando la funzionalità dei profili piuttosto mal progettata. Ma anche in quel caso è piuttosto disordinato. Oppure dovresti fornire file Compose diversi per ogni variazione.
Stai solo spostando il problema.
Una configurazione Compose pulita per Discourse includerebbe i seguenti servizi in container separati:
- Discourse
- nginx
- PostgreSQL
- Redis
Discourse e nginx devono condividere un volume, niente di complicato.
PostgreSQL e Redis… sono cose che potresti voler ospitare altrove, e non avere un container specifico per Discourse per esse. E ora Docker Compose diventa un problema: docker compose up -d avvierà il tuo PostgreSQL indesiderato. Ok, quindi lo facciamo diventare docker compose --profile postgresql up -d per avviare la configurazione base di Discourse e un container PostgreSQL. docker compose --profile postgresql --profile redis up -d per la configurazione del container Discourse “completa” e autonoma. Faresti meglio a non dimenticare un argomento --profile ..., perché altrimenti avrai più problemi.
Quindi, per una migliore UX, crei un launcher che si occupi di creare il comando Docker Compose desiderato. Ora siamo un po’ tornati al punto di partenza. Tranne che le modifiche al container nginx non sono ancora possibili. Quindi ho bisogno di un container nginx-http e di un container nginx-unix che dovrebbero essere mutuamente esclusivi? …
Certo, la gestione dei plugin potrebbe essere migliore, ma farlo con Docker Compose, sarà un inferno.
Quindi, per riassumere. Non ci sarà un’immagine Docker adeguata.
Per quanto riguarda l’incredibile quantità di conoscenze errate su cosa sia Docker e come funzioni: What is Docker? | Docker Docs
Puoi condividere container mentre lavori e assicurarti che chiunque tu condivida riceva lo stesso container che funziona nello stesso modo.
Inoltre, con l’amato “launcher”, come posso eseguire Discourse su un cluster k8s dato che non c’è un’immagine Docker che posso utilizzare e distribuire lì?
Giusto…
Questo script deve essere eseguito come root. Per favore, usa sudo o accedi prima come root.
No, grazie. Non mi piace eseguire script casuali da Internet. Voglio solo avere una bella immagine Docker che posso eseguire in sicurezza in isolamento ![]()
Ho distribuito con successo Discourse in produzione utilizzando Docker Compose con l’immagine pubblicata, così come hanno fatto i clienti.
Tuttavia, sì, è complicato e comporta una notevole quantità di lavoro su misura.
È molto più facile attenersi all’installazione standard con il launcher CDCK, a meno che tu non debba assolutamente utilizzare un metodo diverso perché hai un’opinione specifica, un’architettura particolare o altri requisiti speciali.
Usare un approccio non guidato e che non ti prende per mano non è “opinabile, specifico o speciale” ![]()
Ad ogni modo, l’indizio è avere l’immagine docker originale di discourse. Semplice come quello.
Ho provato a usare la guida ufficiale e il “launcher” solo per giocare con la configurazione - senza successo (tranne un controllo piuttosto sciocco se l’utente è root, che è solo chiedere problemi).
Poi mi sono rivolto all’immagine bitnami (e al loro file compose suggerito) da https://hub.docker.com/r/bitnami/discourse e dopo un docker compose up (e un mucchio di errori SQL [che non fa presagire nulla di buono] così come avvisi da ruby [stesso avvertimento] ho ottenuto un’istanza funzionante di discourse:
Puro contorto e “magia non standard”…
Quindi di nuovo - perché non c’è un’immagine normale?
Scavando tra le sorgenti e i repository ho trovato che viene utilizzata l’immagine di base (https://hub.docker.com/r/discourse/base/) anche se il suo versionamento/tagging mi ha sorpreso (https://hub.docker.com/r/discourse/base/tags)… Non ci sono versioni sensate mi sono chiesto? E infatti, guardando il repository principale non sembrava esserci alcuna release ma ehi - almeno ci sono versioni correttamente taggate (Tags · discourse/discourse · GitHub).
Ora ci si chiede - perché non ci sono immagini corrispondenti nel docker hub principale?
Quindi sì - dando un’occhiata a come sono organizzate le cose concordo:
![]()
D’altra parte (o meglio: “come dovrebbero essere le cose”), progetto di esempio (di portata minore, ma il ragionamento vale): GitHub - miniflux/v2: Minimalist and opinionated feed reader.
Ha release sensate: Releases · miniflux/v2 · GitHub
Che hanno immagini corrispondenti correttamente taggate: https://hub.docker.com/r/miniflux/miniflux/tags
E poi l’aggiornamento è solo cambiare la versione da x a y (o usare il tag latest quindi un semplice stop/pull/start darà la versione aggiornata (che eseguirà automaticamente tutte le migrazioni richieste)
(oh, e l’immagine è tipo 70 volte più piccola ma questa è un’altra storia)
Ottimo lavoro!
Solo due domande… cosa sono gli errori SQL e gli avvisi ruby? Non li conosco. Ma forse è perché ho usato docker e cose del genere nel modo completamente sbagliato ![]()
Fai qualcosa del genere:
./launcher bootstrap myimage
# il comando che invia quell'immagine al tuo posto preferito per avviare le immagini
./launcher start-cmd
e questo ti darà le variabili d’ambiente di cui hai bisogno per avviare la tua immagine.
Non è davvero così difficile. Puoi persino integrarlo in un’azione di GitHub in modo che costruisca la tua immagine e la invii al tuo repository docker. Guardando i commit a docker_compose, sembra che ci siano mosse in corso per produrre un’immagine che non necessiti di essere avviata, o almeno renderla più facile per fare alcune delle cose richieste (migrare il database, precompilare gli asset e inviarli a s3 e così via). L’ho fatto per clienti che volevano usare k8s o il “coso” di AWS per il lancio di immagini (non ricordo il nome).
Un paio di volte ho considerato di offrire tali immagini pre-costruite come servizio, ma non ho mai trovato nessuno che volesse pagare per questo.
Ma ci sono un sacco di piccoli pezzi. Per quanto ne so, CDCK usa launcher per costruire immagini, ma le avvia e le gestisce con altri strumenti, proprio come vuoi tu. E quando hanno iniziato, docker-compose non era ancora un modo decente per farlo e quando lo è diventato, avevano già fatto funzionare launcher, quindi trovare un modo per migrare tutti da launcher a qualcos’altro non era davvero un’opzione.
Se le immagini bitnami funzionano per te, allora usale, ma se non funzionano, avrai bisogno dell’aiuto di qualcuno che le usa, che qui siamo per lo più nessuno.
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:
- 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
- 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
Questo è un ottimo punto. Non c’è davvero un buon motivo per cui questo script non possa essere eseguito come non root.
Lo script di configurazione è l’unico che ha davvero bisogno dei privilegi di root, per la parte spaventosa in cui suggerisce di eseguire lo script di installazione di Docker da Internet. Quindi anche quello può essere modificato per essere eseguito come non root.
Lo script di avvio non ha bisogno dei privilegi di root, ha solo bisogno di accesso in scrittura a /var/discourse e dell’autorizzazione per gestire i container Docker.
Eh… ![]()
Lo script non ha nemmeno bisogno di accedere a /var/discourse (perché lo fa?).
L’intero problema deriva da un paio di cose:
- enorme incomprensione di cosa sia Docker, come funzioni e cosa consenta
- incollare insieme la nozione che docker = docker-compose (non lo è!)
Puoi avere una configurazione completamente contenuta che virtualmente non tocca l’ambiente host…
Dopo aver scavato parecchio, sembra che l’intero script di “installazione” sia stato creato per rendere l’installazione il più semplice possibile per la persona molto non tecnica. Controlla, guida l’utente e imposta tutto. Questa potrebbe essere una cosa positiva, ma fallisce completamente in qualsiasi cosa tenti di deviare anche di un minimo dall’intento previsto.
Nella configurazione più basilare, potresti non aver nemmeno bisogno di accedere a nessuna directory host - tutto sarà contenuto all’interno di un ambiente limitato (l’immagine verrà utilizzata per creare il container e tutto lo storage richiesto verrebbe gestito tramite volumi Docker [ha problemi quando vuoi migrare altrove o accedere ai file, ma stiamo parlando delle basi]).
Tenta anche di assicurarsi che il DNS sia corretto, tenta di impostare certificati, proxy inverso, SMTP e quant’altro - di nuovo, va benissimo fornire questa configurazione semplice.
MA!
Il problema NON è buttare via tutto questo ma fornire IN AGGIUNTA un’immagine Docker semplice (è già lì, viene utilizzata dagli script e dai template usati dallo script! discourse_docker/templates/postgres.template.yml at main · discourse/discourse_docker · GitHub e discourse_docker/launcher at main · discourse/discourse_docker · GitHub) con
- versioning corretto: tagghi l’immagine con la versione rilasciata di Discourse (3.4.5 o quant’altro)
- documentazione sensata e semplice delle variabili d’ambiente attese (che guidano la connettività a database/redis/ecc.) e dei possibili percorsi/volumi che possono essere montati sull’host.
Solo questo…
Dai un’occhiata alla suddetta guida di Miniflux: Miniflux Installation with Docker - ti fornisce dettagli sull’immagine (e quali repository le servono) e le possibili variabili d’ambiente per configurarla.
O l’immagine Docker di MySQL: https://hub.docker.com/_/mysql - stessa cosa - una guida che spiega cosa è possibile configurare (vedi in particolare la sezione: “Environment Variables”).
Nessuno dice: “devi usare il launcher di MySQL per costruire l’immagine MySQL in modo da poterla usare”, o Redis per quella materia - in questo caso usi semplicemente le immagini esistenti e questo è l’indizio e il succo dell’uso di Docker. Eppure, nel caso di Discourse, improvvisamente questa è una soluzione “cattiva” e tutti gridano: “devi costruire la tua immagine!” – perché!?
No. A causa dei plugin.
Uhm… ho dovuto fare un po’ di ricerche sui plugin e ancora una volta devo dire/citare:
![]()
Quindi quello che ho fatto: sono andato nella sezione plugin, ho cliccato sul primo plugin cercando istruzioni e guida all’installazione (Plugin directory | Discourse - Civilized Discussion → Sign in with Apple | Discourse - Civilized Discussion → Discourse Apple Authentication → Install plugins on a self-hosted site) e… santo cielo - che “casino” contorto.
Perché mai avresti bisogno di una nuova immagine solo per avere i plugin? Con docker puoi semplicemente specificare una directory di mount per i plugin e poi posizionarli lì…
Non sono un esperto di Ruby, quindi le cose potrebbero essere più strane qui, ma ad esempio nel mondo Java basta rilasciare un jar con il plugin in modo che venga caricato e voilà - lo hai in esecuzione. E usi la stessa immagine di tutti gli altri…
(Non sto dicendo che non sia disordinato, sto solo spiegando perché le cose sono così come sono)
A causa della pipeline delle risorse di Ember.
Il che sarebbe comunque un pasticcio, perché non vuoi avere quelle dipendenze esternamente.
Questo: GitHub - ember-engines/ember-asset-loader: Asset loading support for Ember applications?
Perché no, però?
I plugin possono essere elaborati al volo, questo viene fatto anche durante l’aggiornamento di un plugin. Con un po’ di magia è anche possibile aggiungere un nuovo plugin a un’istanza in esecuzione senza ricostruire il container. Quindi il montaggio di un volume di plugin a un container dovrebbe essere possibile (con una serie di modifiche).
Il problema principale che vedo riguarda l’aggiornamento di Discourse. Attualmente questo può essere fatto con un’istanza in esecuzione. L’aggiornamento ricostruisce fondamentalmente Discourse. Se Discourse provenisse effettivamente da un’immagine pre-costruita, non potresti modificare quei file. Quindi l’aggiornamento con tempi di inattività zero/ridotti richiederà probabilmente parecchio lavoro.
Questa è una cosa che non capisco (probabilmente mi manca il contesto in termini di Ruby…).
In generale, con docker/container/orchestration puoi avere distribuzioni blue-green/red-black in cui prepari un nuovo container con una nuova versione e cambi il traffico una volta che è pronto. Tuttavia, in generale per distribuzioni più piccole non dovrebbe essere un problema poiché la maggior parte delle volte l’avvio del servizio (container) dovrebbe richiedere solo pochi secondi, quindi il tempo di inattività dovuto al cambio di versione dovrebbe essere minimo (il problema più grande è dover eseguire gli aggiornamenti dello schema, ma questo si applica indipendentemente dal fatto che si ricostruisca o meno l’immagine).
Sì, ma non è così che funziona attualmente, quindi è quella la parte su cui bisogna lavorare. Come intendi farlo dall’interfaccia di amministrazione di Discourse. Come intendi ridurre il container blu mentre avvii il container verde (i sistemi non hanno risorse infinite, quindi prima di avviare il blu vuoi ridurre i worker di unicorn in verde.) Oppure puoi semplicemente fare in modo che il verde sia giù, e ora il blu salga.
Ci sono molte cose che devono essere definite e elaborate. Sia da una prospettiva tecnica che da una prospettiva di amministratore. L’aggiornamento con un clic dall’interfaccia di amministrazione è una funzionalità preziosa.
Plugin e immagini personalizzate devono ancora essere creati, ma per la creazione vanilla per compose sta diventando a portata di mano in questi giorni - ho creato un piccolo proof of concept qui per chiunque sia curioso.
Ovviamente, dato che questi sono tutti i miei repository (non quelli di Discourse™) questo non è nulla di ufficiale, quindi la tua esperienza può variare, e sicuramente non aspettarti supporto ufficiale
Lo sto condividendo qui, dato che è stato menzionato che la gente sta già utilizzando bitnami e altri modi non sanzionati di esecuzione.
Le immagini postgres (o pgvector) pronte all’uso non funzionano per Discourse - Discourse deve cambiare la configurazione predefinita, non si connette tramite un superutente, supporta le localizzazioni e deve supportare gli aggiornamenti di postgres senza che un amministratore di Discourse debba eseguire dump/restore.
Eh… questa è credo la differenza cruciale e questo “aggiornamento dall’interfaccia di amministrazione” è un po’ un ricordo dei vecchi tempi, quando avevi solo “web hosting” con interprete PHP, quindi tutto era costruito attorno a quella nozione. E penso che questo si sia trasferito su come Discourse funziona e ci si aspetta che venga gestito.
Beh, questa è un’altra cosa che ho notato: Discourse è piuttosto pesante (il container ha iniziato a consumare risorse durante l’avvio a un livello spaventoso), quindi sì, potrebbe essere un problema.
Come vengono “compilati” nel contesto di Ruby (che è per lo più un linguaggio interpretato e non compilato)?
Non sarebbe meglio provare a utilizzare soluzioni pronte all’uso? Anche per la configurazione di postgres si può facilmente cambiare semplicemente fornendo/montando un file postgresql.conf personalizzato, non c’è bisogno di un’immagine completamente personalizzata con configurazione integrata… e anche in tal caso, se fosse necessario, Discourse potrebbe fornire un’immagine pre-compilata che verrebbe semplicemente scaricata invece di essere ricompilata ogni volta…
Questa “interfaccia di aggiornamento dell’amministratore” è un plugin (chiamato “docker manager”). Non è necessario includerlo se si dispone di un altro modo per eseguire aggiornamenti online.
