Risoluzione dei problemi di bootstrap in Discourse

Sto ancora avendo difficoltà con il nuovo processo di ‘pre-bundling’. Il bootstrap fallisce sulla mia istanza di test e non so perché. Si noti che si tratta di un setup con un database PostgreSQL esterno. I container vengono eseguiti dietro un haproxy come acceleratore SSL. Qui eseguo il bootstrap solo del container web_only. La versione di build corrente (prima del bootstrap) è 3.5.0.beta8-dev, Commits · discourse/discourse · GitHub

Questo è il file yml che attualmente fallisce:

# IMPORTANTE: IMPOSTA UNA PASSWORD SEGRETA in Postgres per l'utente Discourse
# TODO: cambiare SOME_SECRET in questo template

templates:
  - "templates/web.template.yml"
  ## Decommenta la riga successiva per abilitare l'ascolto IPv6
  #- "templates/web.ipv6.template.yml"
  - "templates/web.ratelimited.template.yml"
  - "templates/web.socketed.template.yml"
  ## Decommenta queste due righe se desideri aggiungere Lets Encrypt (https)
  #- "templates/web.ssl.template.yml"
  #- "templates/web.letsencrypt.ssl.template.yml"

## quali porte TCP/IP dovrebbe esporre questo container?
## Se vuoi che Discourse condivida una porta con un altro server web come Apache o nginx,
## vedi https://meta.discourse.org/t/17247 per i dettagli
expose:
  - "80:80"   # http
  - "443:443" # https

# Usa la chiave 'links' per collegare i container tra loro, ovvero usa il flag Docker --link.
links:
  - link:
      name: redis
      alias: data

# eventuali argomenti extra per Docker?
# docker_args:

params:
  ## Quale revisione Git dovrebbe utilizzare questo container? (default: tests-passed)
  #version: tests-passed

env:
  LC_ALL: en_US.UTF-8
  LANG: en_US.UTF-8
  LANGUAGE: en_US.UTF-8
  DISCOURSE_DEFAULT_LOCALE: de

  ## Quante richieste web simultanee sono supportate? Dipende dalla memoria e dai core della CPU.
  ## verrà impostato automaticamente dal bootstrap in base alle CPU rilevate, oppure puoi sovrascrivere
  UNICORN_WORKERS: 4

  ## TODO: Il nome di dominio a cui risponderà questa istanza Discourse
  DISCOURSE_HOSTNAME: 'forum2.netzwissen.de'

  ## Decommenta se vuoi che il container venga avviato con lo stesso
  ## hostname (opzione -h) specificato sopra (default "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: Elenco di email separate da virgola che diventeranno amministratori e sviluppatori
  ## al primo esempio di registrazione 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'admin@netzwissen.de'

  ## TODO: Il server SMTP utilizzato per validare nuovi account e inviare notifiche
  ## INDIRIZZO SMTP, nome utente e password sono obbligatori
  ## ATTENZIONE: il carattere '#' nella password SMTP può causare problemi!
  DISCOURSE_SMTP_ADDRESS: mail.netzwissen.de
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: discourse@netzwissen.de
  DISCOURSE_SMTP_PASSWORD: [xxxxxxxxxxxxxxxxx}
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (opzionale, default true)
  #DISCOURSE_SMTP_DOMAIN: discourse.example.com    # (richiesto da alcuni provider)
  DISCOURSE_NOTIFICATION_EMAIL: discourse@netzwissen.de    # (indirizzo da cui inviare le notifiche)

  ## Se hai aggiunto il template Lets Encrypt, decommenta qui sotto per ottenere un certificato SSL gratuito
  #LETSENCRYPT_ACCOUNT_EMAIL: me@example.com

## configura la connettività ai database
  DISCOURSE_DB_SOCKET: ''
  DISCOURSE_DB_USERNAME: [xxxxxxxxxxx]
  DISCOURSE_DB_NAME: [xxxxxxxxxxxxxxx]
  DISCOURSE_DB_HOST: [xxxxxxxxxxxxxxx]
  DISCOURSE_DB_PASSWORD: [xxxxxxxxxxxxxxx]
  ## caching redis sul container adiacente
  DISCOURSE_REDIS_HOST: redis

  ## L'indirizzo CDN http o https per questa istanza Discourse (configurato per il pull)
  ## vedi https://meta.discourse.org/t/14857 per i dettagli
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com

  ## L'ID account e la chiave di licenza Maxmind geolocation IP per le ricerche di indirizzi IP
  ## vedi https://meta.discourse.org/t/-/173941 per i dettagli
  #DISCOURSE_MAXMIND_ACCOUNT_ID: 123456
  #DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456

volumes:
  - volume:
      host: /mnt/data/discourse/shared/web-only
      guest: /shared
  - volume:
      host: /mnt/data/discourse/shared/web-only/log/var-log
      guest: /var/log

## I plugin vanno qui
## vedi https://meta.discourse.org/t/19157 per i dettagli
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/discourse-shared-edits.git
# alcuni plugin sono stati rimossi, poiché ora sono inclusi nel core
# https://meta.discourse.org/t/bundling-more-popular-plugins-with-discourse-core/373574
## = ora inclusi
##          - git clone https://github.com/discourse/discourse-chat-integration.git
##          - git clone https://github.com/discourse/discourse-openid-connect.git
##          - git clone https://github.com/discourse/discourse-calendar.git
##          - git clone https://github.com/angusmcleod/discourse-events.git
##          - git clone https://github.com/discourse/discourse-data-explorer.git
##          - git clone https://github.com/discourse/discourse-reactions.git
##          - git clone https://github.com/discourse/discourse-chat.git
##          - git clone https://github.com/discourse/discourse-ai.git
##          - git clone https://github.com/discourse/discourse-topic-voting.git
##          - git clone https://github.com/discourse/discourse-post-voting.git
##          - git clone https://github.com/discourse/discourse-user-notes.git
##          - git clone https://github.com/discourse/discourse-solved.git
          - git clone https://github.com/discourse/discourse-docs-card-filter.git
          - git clone https://github.com/discourse/discourse-doc-categories.git
##          - git clone https://github.com/discourse/discourse-assign.git
##          - git clone https://github.com/discourse/discourse-templates.git
          - git clone https://github.com/discourse/discourse-saved-searches.git
          - git clone https://github.com/discourse/discourse-tooltips.git
          - git clone https://github.com/discourse/discourse-category-experts.git
          - git clone https://github.com/discourse/discourse-activity-pub.git
          - git clone https://github.com/discourse/discourse-follow.git
          - git clone https://github.com/nathan-nz/discourse-wikified-posts.git
          - git clone https://github.com/discourse/discourse-whos-online.git
          - git clone https://github.com/merefield/discourse-workflow.git

## Ricorda, questa è sintassi YAML: puoi avere solo un blocco con un nome
run:
  - exec: echo "Inizio dei comandi personalizzati"

  ## Se vuoi configurare l'accesso con password per root, decommenta e modifica:
  ## Usa solo una delle seguenti righe:
  #- exec: /usr/sbin/usermod -p 'PASSWORD_HASH' root
  - exec: /usr/sbin/usermod -p "$(mkpasswd -m sha-256 'xxxxxxxxxxxxxxx')" root

## per l'operazione dietro un load balancer haproxy con nginx locale sul host del container
  - replace:
      filename: /etc/nginx/conf.d/discourse.conf
      from: "types {"
      to: |
        set_real_ip_from 127.0.0.1/24;
        set_real_ip_from 10.0.0.0/24;
        real_ip_header X-Forwarded-For;
        real_ip_recursive on;
        proxy_set_header Host $http_host;
        proxy_set_header X-Request-Start "t=${msec}";
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https; # sostituito $thescheme;
        proxy_set_header X-Real-IP $remote_addr;
        types {

  ## Se vuoi autorizzare utenti aggiuntivi, decommenta e modifica:
  #- exec: ssh-import-id username
  #- exec: ssh-import-id anotherusername

  - exec: echo "Fine dei comandi personalizzati"
  - exec: awk -F\# '{print $1;}' ~/.ssh/authorized_keys | awk 'BEGIN { print "Chiavi SSH autorizzate per questo container:"; } NF\u003e=2 {print $NF;}'

Anche quando aggiungo un blocco rm -rf nel file yml:

- rm -rf discourse-chat-integration  
- rm -rf discourse-openid-connect         
- rm -rf discourse-calendar         
- rm -rf discourse-events         
- rm -rf discourse-data-explorer         
- rm -rf discourse-reactions         
- rm -rf discourse-chat         
- rm -rf discourse-ai         
- rm -rf discourse-topic-voting         
- rm -rf discourse-post-voting         
- rm -rf discourse-user-notes         
- rm -rf discourse-solved         
- rm -rf discourse-assign         
- rm -rf discourse-templates

Il bootstrap continua a fallire con:

/usr/local/lib/ruby/gems/3.3.0/gems/pups-1.3.0/lib/pups.rb
/usr/local/bin/pups --stdin

FAILED
--------------------
Pups::ExecError: cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate' fallito con return #<Process::Status: pid 669 exit 1>
Posizione del fallimento: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.3.0/lib/pups/exec_command.rb:131:in `spawn'
exec fallito con i parametri {"cd"=>"$home", "tag"=>"migrate", "hook"=>"db_migrate", "cmd"=>["su discourse -c 'bundle exec rake db:migrate'"]}

Interpretarei questo come un errore nella migrazione del database durante “bundle exec rake db:migrate”. Ma qual è la causa principale? Il database discourse2 ha già l’estensione vector richiesta per il plugin discourse-ai (già installato in precedenza):

postgres=# \c discourse2  
psql (15.12 (Ubuntu 15.12-1.pgdg22.04+1), server 13.20 (Ubuntu 13.20-1.pgdg22.04+1))  
Ora sei connesso al database "discourse2" come utente "postgres".  
discourse2=# \dx  
                                   Lista delle estensioni installate  
  Name   | Version |   Schema   |                            Description                               
----------+---------+------------+-------------------------------------------------------------------  
hstore   | 1.7     | public     | tipo di dato per memorizzare insiemi di coppie (chiave, valore)  
pg_trgm  | 1.5     | public     | misurazione della similarità del testo e ricerca di indici basata sui trigrammi  
plpgsql  | 1.0     | pg_catalog | linguaggio procedurale PL/pgSQL  
unaccent | 1.1     | public     | dizionario di ricerca testuale che rimuove gli accenti  
vector   | 0.8.0   | public     | tipo di dato vettoriale e metodi di accesso ivfflat e hnsw  
(5 righe)

In seguito vedo anche gli avvisi sui plugin, sebbene le righe “git clone” siano tutte commentate nel file yml:

---
HINT: Il plugin 'discourse-openid-connect' è ora incluso in Discourse e non dovrebbe essere incluso nella configurazione del tuo container.
Rimuovi la riga 'git clone https://github.com/discourse/discourse-openid-connect' dal tuo file containers/web_only.yml, quindi riprova.
Per ulteriori informazioni, vedi https://meta.discourse.org/t/373574
---

A dire il vero, ora sono un po’ perso ::sleepy_face:

cosa restituisce free -h?

root@docker3a:/var/discourse/containers# free -h
totale utilizzati libero condiv. buffer/cache disponibili
Memoria: 3,8Gi 2,0Gi 1,1Gi 3,8Mi 969Mi 1,8Gi

probabilmente 4 GB di swap

Scusa, colpa mia, l’output è stato troncato

root@docker3a:~# free -h
total used free shared S.b./cache available
Mem: 3.8Gi 2.0Gi 1.1Gi 3.8Mi 971Mi 1.8Gi
Swap: 974Mi 0B 974Mi

La VM ha già 4 GB di memoria. Ne ho aggiunti altri 2 GB e ho avviato un altro ./launcher rebuild web_only^, con lo stesso errore. Quindi dubito che qui ci sia un problema di spazio durante la compilazione…

Beh, avevo bisogno di 2 GB di swap con 8 GB di RAM.

Ho riprovato con 8 GB di RAM, con lo stesso risultato di errore. Si noti che questa è una macchina virtuale basata su kernel (KVM) su un host proxmox (Features - Proxmox Virtual Environment).

Un guest QEMU/KVM richiede memoria all’host man mano che il sistema operativo guest ne ha bisogno, ma non restituisce la memoria all’host automaticamente se il sistema operativo guest non ne ha più bisogno. Se l’host ha bisogno di memoria, il kernel chiederà ai processi di restituire la RAM inutilizzata, quindi QEMU cercherà di recuperare un po’ di memoria, ma dipende dal sistema operativo guest per rilasciarla prima.

Non ho mai avuto problemi di memoria con la configurazione da 4 GB di RAM e 4 CPU, nemmeno con il plugin discourse-ai. I problemi di bootstrap sono apparsi solo dopo questo annuncio di bundling…

Aspetta, questo plugin discourse-openid-connect è presente nel tuo file yml?

Questo è un problema di migrazione, puoi scorrere verso l’alto per trovare cosa non è riuscito a migrare?

Il plugin discourse-openid-connect è presente nel tuo file yml?

Questo è un problema di migrazione, puoi scorrere verso l’alto per trovare cosa non è stato migrato?

Fino ad ora avevo discourse-openid-connect nella mia lista di plugin. L’ho rimosso per la “build post-bundling”. Ora ho solo questi plugin rimasti nello yml di build:

## plugin non inclusi nel bundle
- git clone https://github.com/discourse/docker_manager.git\\`
- git clone https://github.com/discourse/discourse-shared-edits.git`
- git clone https://github.com/discourse/discourse-docs-card-filter.git`
- git clone https://github.com/discourse/discourse-doc-categories.git`
- git clone https://github.com/discourse/discourse-saved-searches.git`
- git clone https://github.com/discourse/discourse-tooltips.git`
- git clone https://github.com/discourse/discourse-category-experts.git`
- git clone https://github.com/discourse/discourse-activity-pub.git`

  • git clone https://github.com/discourse/discourse-follow.git
  • git clone ``https://github.com/nathan-nz/discourse-wikified-posts.git
  • git clone https://github.com/discourse/discourse-whos-online.git
  • git clone \\\https://github.com/merefield/discourse-workflow.git\\

La build sembra bloccarsi su ‘bundle exec rake db:migrate’. Ma poche righe sopra vedo un

Gem::LoadError: can't activate multipart-post-2.4.0, already activated multipart-post-2.4.1 (Gem::LoadError)

[…]
discourse-wikified-posts è già alla sua ultima versione compatibile discourse-workflow è già alla sua ultima versione compatibile docker_manager è già alla sua ultima versione compatibile I,
[2025-07-28T06:34:13.916393 #1] INFO -- : `> cd /var/www/discourse & su discourse -c 'bundle exec rake db:migrate' rake aborted! Gem::LoadError: can't activate multipart-post-2.4.0, already activated multipart-post-2.4.1 (Gem::LoadError) /var/www/discourse/lib/plugin_gem.rb:25:in `load' /var/www/discourse/lib/plugin/instance.rb:861:in `gem' […]

Non ho conoscenze di ruby, ma forse questo è un conflitto di pacchetti tra multipart-post-2.4.0 e multipart-post-2.4.1?

Grazie!
Thommie

È e ha causato il crollo di due delle mie build. Almeno uno dei plugin di CDCK sta utilizzando una vecchia versione.

Questo è il sistema funzionante come previsto.

Quando gestiamo le dipendenze delle gemme usando Gemfile e un Gemfile.lock, abbiamo dependbot che scansiona gli aggiornamenti, ci manteniamo aggiornati usando i nostri processi interni.

Come progettista di plugin, ora puoi dipendere dalle dipendenze delle gemme che spediamo nel core.

Ciò significa che dovresti eliminare multipart-post dal tuo plugin plugin.rb e semplicemente richiederlo da dove lo stai usando.

Una cosa in meno di cui preoccuparsi per gli autori di plugin.

Feedback utile, grazie.

@Thomas_Rother Ho rimosso la dipendenza dal plugin, riprova a compilarlo.

@merefield @sam :smiley: - successo!! Con il commit 6be7a44 nel plugin di Robert GitHub - merefield/discourse-workflow: A workflow system for Topics that implements a configurable multi-stage process la build è andata a buon fine. Grazie per l’analisi e la correzione!