⚠ La porta 443 di questo computer non sembra essere accessibile tramite il nome host: metabolism.logophilia.eu ----

Ciao, ricevo l’errore indicato nell’oggetto (vedi anche sotto) dopo aver ottenuto “ Le porte 80 e 443 sono libere per l’uso” durante l’inizializzazione. Il DNS è configurato, SSL impostato, il sito web è accessibile dall’esterno (fai una prova tu stesso), l’output di curl (truncato) è riportato di seguito, quindi è accessibile anche dalla macchina stessa. Non mi vengono in mente altre idee su cosa possa mancare. Grazie per qualsiasi suggerimento.

PS. AlmaLinux 10.2 - 6.12.0-211.7.4.el10_2.x86_64

# ./discourse-setup  
→ Controllo aggiornamenti immagine procedura guidata di configurazione... 
→ Avvio procedura guidata di configurazione di Discourse... 
 
 
 ___  _ 
|   \(_)___ __ ___ _  _ _ _ ___ ___ 
| |) | (_-\< _/ _ \ || | '_(_-\< -_) 
|___/|_/__/\__\___/\_,_|_| /__/\___| 
                       Procedura guidata di configurazione 
 
 
→ Questa procedura ti aiuterà a configurare l'installazione di Discourse. 
→ Premi Ctrl+C in qualsiasi momento per annullare. 
 
── Controlli di sistema ── 
 
[1/5] Verifica requisiti di sistema 
✓ Eseguito come root 
✓ Docker è disponibile 
✓ Memoria: 8GB, CPU: 4 core 
 
── Configurazione ── 
 
[2/5] Preparazione configurazione 
✓ Le porte 80 e 443 sono libere per l'uso 
→ Creazione nuova configurazione... 
→ Creazione nuova configurazione dal modello... 
 
── Impostazioni del sito ── 
 
[3/5] Inserisci i dettagli del tuo sito 
 
Indirizzo email per gli account amministratore(i)? 
eduard.pech@logophilia.eu▌ 
 
Hai un nome di dominio per il tuo Discourse? 
▸ Sì      No 
 
Hostname per il tuo Discourse? 
metabolism.logophilia.eu▌ 
 
Configurare SMTP per l'invio di email? (Richiede credenziali SMTP) 
  Sì    ▸ No 
 
 
── Revisione configurazione ── 
 
 
╭────────────────────────────────────────────╮ 
│                                            │ 
│  Hostname       metabolism.logophilia.eu   │ 
│  Email admin    eduard.pech@logophilia.eu  │ 
│  SMTP           (non configurato)          │ 
│  Let's Encrypt  Abilitato                  │ 
│                                            │ 
╰────────────────────────────────────────────╯ 
 
 
Sembra corretto? 
▸ Sì      No 
→ Rilevati 8GB di memoria e 4 core CPU 
→ Impostazione db_shared_buffers = 2048MB 
→ Impostazione UNICORN_WORKERS = 8 
 
── Validazione rete ── 
 
[4/5] Verifica configurazione dominio 
→ Controllo del nome di dominio... 
⚠ La porta 443 di questo computer non sembra essere accessibile tramite l'hostname: metabolism.logophilia.eu 
⚠ Anche la connessione a http://metabolism.logophilia.eu (porta 80) fallisce. 
 
Questo suggerisce che metabolism.logophilia.eu risolve a un indirizzo IP che non raggiunge questa 
macchina su cui stai installando Discourse. 
 
La prima cosa da fare è verificare che metabolism.logophilia.eu risolva all'indirizzo IP di questo server. 
Di solito si fa questo nello stesso posto in cui è stato acquistato il dominio. 
 
Se sei sicuro che l'indirizzo IP si risolva correttamente, potrebbe essere un problema del firewall. 
Una ricerca sul web per «apri le porte IL TUO SERVIZIO CLOUD» potrebbe aiutare. 
 
Questo strumento è progettato solo per le installazioni più standard. Se non riesci a risolvere 
il problema sopra, dovrai modificare manualmente containers/app.yml e poi digitare: 
 
    ./launcher rebuild app 
 
 
✗ Verifica DNS fallita per metabolism.logophilia.eu 
[root@logophilia discourse]# dig metabolism.logophilia.eu 
 
; <<<>>> DiG 9.18.33 <<<>>> metabolism.logophilia.eu 
;; opzioni globali: +cmd 
;; Risposta ricevuta: 
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 36726 
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 
 
;; SEZIONE PSEUDO OPT: 
; EDNS: versione: 0, flags:; udp: 512 
;; SEZIONE DOMANDA: 
;metabolism.logophilia.eu.      IN      A 
 
;; SEZIONE RISPOSTA: 
metabolism.logophilia.eu. 300   IN      A       75.119.134.68 
 
;; Tempo di query: 8 msec 
;; SERVER: 213.136.95.10#53(213.136.95.10) (UDP) 
;; ORA: Sab Giu 06 04:52:23 CEST 2026 
;; DIMENSIONI MSG ricevute: 69 
 
[root@logophilia discourse]# curl -v https://metabolism.logophilia.eu 
* Host metabolism.logophilia.eu:443 risolto. 
* IPv6: (nessuno) 
* IPv4: 75.119.134.68 
*   Tentativo di connessione a 75.119.134.68:443... 
* ALPN: curl offre h2,http/1.1 
* TLSv1.3 (IN), handshake TLS, Client hello (1): 
*  CAfile: /etc/pki/tls/certs/ca-bundle.crt 
*  CApath: nessuno 
* TLSv1.3 (IN), handshake TLS, Server hello (2): 
* TLSv1.3 (IN), TLS change cipher, Change cipher spec (1): 
* TLSv1.3 (IN), handshake TLS, Encrypted Extensions (8): 
* TLSv1.3 (IN), handshake TLS, Certificate (11): 
* TLSv1.3 (IN), handshake TLS, CERT verify (15): 
* TLSv1.3 (IN), handshake TLS, Finished (20): 
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1): 
* TLSv1.3 (OUT), handshake TLS, Finished (20): 
* Connessione SSL utilizzando TLSv1.3 / TLS_AES_256_GCM_SHA384 / x25519 / RSASSA-PSS 
* ALPN: server accetta http/1.1 
* Certificato del server: 
*  soggetto: CN=metabolism.logophilia.eu 
*  data inizio: 6 Giu 00:26:43 2026 GMT 
*  data scadenza: 4 Set 00:26:42 2026 GMT 
*  subjectAltName: host «metabolism.logophilia.eu» corrisponde al certificato «metabolism.logophilia.eu» 
*  emittente: C=US; O=Let's Encrypt; CN=YR2 
*  Verifica certificato SSL OK. 
*   Livello certificato 0: Tipo chiave pubblica RSA (2048/112 Bits/secBits), firmato con sha256WithRSAEncryption 
*   Livello certificato 1: Tipo chiave pubblica RSA (2048/112 Bits/secBits), firmato con sha256WithRSAEncryption 
*   Livello certificato 2: Tipo chiave pubblica RSA (4096/152 Bits/secBits), firmato con sha256WithRSAEncryption 
*   Livello certificato 3: Tipo chiave pubblica RSA (4096/152 Bits/secBits), firmato con sha256WithRSAEncryption 
* Connesso a metabolism.logophilia.eu (75.119.134.68) porta 443 
* utilizzando HTTP/1.x 
> GET / HTTP/1.1 
> Host: metabolism.logophilia.eu 
> User-Agent: curl/8.12.1 
> Accept: */* 
>  
* Richiesta completamente inviata 
* TLSv1.3 (IN), handshake TLS, Newsession Ticket (4): 
* TLSv1.3 (IN), handshake TLS, Newsession Ticket (4): 
< HTTP/1.1 200 OK 
< Data: Sab, 06 Giu 2026 02:52:36 GMT 
< Server: Apache 
< Last-Modified: Sab, 06 Giu 2026 01:25:19 GMT 
< ETag: "1325f-6538ba67ff892" 
< Accept-Ranges: bytes 
< Content-Length: 78431 
< Content-Type: text/html; charset=UTF-8 
<  
<!doctype html> 
<html lang="en" data-bs-theme="auto"> 
<head> 
  <title> 
    metabolism.logophilia.eu &mdash;  Pagina di benvenuto dominio per  </title> 
  <meta charset="utf-8">
……


Ciao,

Ho controllato il tuo sito web di persona. Sembra che il tuo provider di hosting stia occupando la porta 443 per visualizzare questa pagina di benvenuto. Dovrai scoprire come liberare completamente le porte 443/80 in modo che Discourse possa controllarle.

L’ho già fatto: il VPS è gestito con Virtualmin ed è solo una spunta. Purtroppo, quando deseleziono “sito web abilitato”, non riesco a eseguire curl sulle porte 443/80 dall’host, e la configurazione di Discourse continua a lamentarsi dello stesso errore. Quindi ho pensato di riabilitare il sito web, così almeno posso dimostrare che l’handshake SSL funziona.
Come puoi vedere nel mio post originale, la configurazione di Discourse afferma inizialmente che la porta 443 è disponibile. È la mia prima installazione e interpreto questo come: tutto verde. Allora perché la configurazione “cambia idea”?
Comunque, non ho davvero bisogno di capire ogni dettaglio. Sto solo dicendo: con Apache disabilitato sul sottodominio, l’esito della configurazione di Discourse è lo stesso.

Grazie per il tempo dedicato; se c’è altro che posso fornire per chiarire, farò (quasi) tutto il possibile.

Ho avuto lo stesso problema qui (sul mio server domestico):

Credo che la soluzione sia semplicemente eseguire questo comando se sei assolutamente sicuro che il DNS sia corretto e le porte funzionino correttamente.

./install-discourse --skip-connection-test

Grazie, sembra che abbia funzionato! :purple_heart:

Lo script va oltre il 5/5 ora e sembra stia caricando/installando molte altre cose. Il certificato SSL è ora errato; immagino stia attendendo il timeout del TTL o forse sarà tutto a posto una volta terminata la configurazione.

Anche se non ho davvero idea di come funzionino Discourse, Docker o persino Ruby… la parte relativa al DNS non è mai un problema :slight_smile: Grazie ancora!

Vedo che è già contrassegnato come soluzione. Ma ho un’altra domanda, se posso.

So che è necessario Postgres, ma non è menzionato in

https://github.com/discourse/discourse/blob/main/docs/INSTALL-cloud.md

Quindi pensavo che l’immagine Docker includesse già Postgres installato. Potreste chiarire se devo installare Postgres sul VPS? Perché le istruzioni di installazione non lo menzionano.

… o forse Docker include Postgres, ma lo script è fallito in qualche modo? Perché si interrompe alla fine:

........
I, [2026-06-06T04:23:49.114769 #1]  INFO -- : File > /etc/runit/1.d/install-ssl  chmod: +x  chown: 
I, [2026-06-06T04:23:49.114999 #1]  INFO -- : Sostituendo # dopo ssl con if [ -z "$DISABLE_LETSENCRYPT" ] || [ -n "$ENABLE_LETSENCRYPT" ]; then
  /usr/local/bin/configure-ssl
  exec /usr/local/bin/configure-letsencrypt
fi
# dopo ssl in /etc/runit/1.d/install-ssl
I, [2026-06-06T04:23:49.125964 #1]  INFO -- : File > /usr/local/bin/configure-ssl  chmod: +x  chown: 
I, [2026-06-06T04:23:49.127031 #1]  INFO -- : > curl https://raw.githubusercontent.com/acmesh-official/acme.sh/3.0.6/acme.sh > /opt/acme.sh
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  215k  100  215k    0     0   635k      0 --:--:-- --:--:-- --:--:--  637k
I, [2026-06-06T04:23:49.514883 #1]  INFO -- : > chmod +x /opt/acme.sh
I, [2026-06-06T04:23:49.554670 #1]  INFO -- : File > /usr/local/bin/configure-letsencrypt  chmod: +x  chown: 
I, [2026-06-06T04:23:49.596808 #1]  INFO -- : File > /usr/local/bin/letsencrypt  chmod: +x  chown: 
I, [2026-06-06T04:23:49.598926 #1]  INFO -- : > echo "Inizio dei comandi personalizzati"
Inizio dei comandi personalizzati
I, [2026-06-06T04:23:49.605809 #1]  INFO -- : > echo "Fine dei comandi personalizzati"
Fine dei comandi personalizzati
I, [2026-06-06T04:23:49.608842 #1]  INFO -- : Terminazione dei processi asincroni
I, [2026-06-06T04:23:49.609015 #1]  INFO -- : Invio di INT a HOME=/var/lib/postgresql USER=postgres exec chpst -u postgres:postgres:ssl-cert -U postgres:postgres:ssl-cert /usr/lib/postgresql/15/bin/postmaster -D /etc/postgresql/15/main pid: 44
I, [2026-06-06T04:23:49.609157 #1]  INFO -- : Invio di TERM a exec chpst -u redis -U redis /usr/bin/redis-server /etc/redis/redis.conf pid: 111
2026-06-06 04:23:49.609 UTC [44] LOG:  richiesta di arresto rapido ricevuta
111:signal-handler (1780719829) SIGTERM ricevuto, programmazione dell'arresto...
2026-06-06 04:23:49.612 UTC [44] LOG:  interruzione di eventuali transazioni attive
2026-06-06 04:23:49.619 UTC [44] LOG:  worker in background "logical replication launcher" (PID 58) uscito con codice di uscita 1
2026-06-06 04:23:49.623 UTC [53] LOG:  arresto in corso
2026-06-06 04:23:49.634 UTC [53] LOG:  checkpoint in avvio: arresto immediato
111:M 06 Jun 2026 04:23:49.683 * Arresto richiesto dall'utente...
111:M 06 Jun 2026 04:23:49.683 * Salvataggio dell'ultimo snapshot RDB prima dell'uscita.
111:M 06 Jun 2026 04:23:49.698 * DB salvato su disco
111:M 06 Jun 2026 04:23:49.700 # Redis è ora pronto per uscire, arrivederci...
2026-06-06 04:23:49.711 UTC [53] LOG:  checkpoint completato: scritti 87 buffer (0.0%); 0 file WAL aggiunti, 0 rimossi, 0 riciclati; write=0.041 s, sync=0.022 s, total=0.088 s; sync files=52, longest=0.008 s, average=0.001 s; distance=86 kB, estimate=86 kB
2026-06-06 04:23:49.735 UTC [44] LOG:  il sistema di database è stato arrestato

Non installare Postgres.

È normale, perché non hai installato Discourse come server web.

Allora (quasi sicuramente) hai ancora il problema per cui la tua VM non ha le porte esposte a Internet.

Non è così. Afferma chiaramente che Discourse non ha accesso alla porta. Inoltre, il tuo comando curl mostra che qualcos’altro ha il controllo della porta 443.

Penso che il container sia stato costruito correttamente, ma non riesca ad avviarsi perché qualcos’altro sta usando la porta 443, oppure non sta facendo nulla perché la porta 443 è instradata altrove.

Puoi provare

docker ps

per vedere se ci sono container in esecuzione e

docker logs app

per vedere cosa ha registrato Discourse tramite Docker.

Grazie per il feedback, apprezzo davvero il tempo dedicato. Non voglio fare lo smargiasso, ma:

[2/5] Preparazione configurazione
✓ Le porte 80 e 443 sono libere per l'uso

Infatti, inizialmente dice proprio «libere per l’uso». Detto questo, ora ho la mia istanza attiva e funzionante, con l’aiuto di Gemini (principalmente per quanto riguarda l’uso di Docker, roba del genere lol). Vorrei offrire il mio «runbook» per qualsiasi altro utente Virtualmin, perché: «liberare la porta 443» non è la soluzione qui. Il resto del mio post sarà proprio questo; se dovessi pubblicarlo altrove, ad esempio in una nuova discussione, per favore indicami dove andare; credo di non essere l’unico con questa configurazione e potrebbe essere utile per altri. Grazie ancora!

Se si utilizza un VPS gestito da Webmin/Virtualmin e si impiega un sottodominio:

Il Runbook Definitivo per Virtualmin + Discourse *

  • (1) Pulizia dei residui (se si sta riprovando, come ho fatto io):

    rm -rf /var/discourse/shared/standalone/ssl/*

    rm -rf /var/discourse/shared/standalone/letsencrypt

    rm -rf /var/discourse/shared/standalone/state

  • (2) Eliminazione dei template:

    Devi eliminare completamente le righe templates/web.ssl.template.yml e templates/web.letsencrypt.ssl.template.yml da app.yml. Il parser personalizzato del launcher le valuterà anche se precedute da #.

  • (3) Configurazione email e variabili:

    Modifica DISCOURSE_SKIP_EMAIL_SETUP da '1' a '0', altrimenti Discourse non potrà connettersi e verificare il DiscordID;

    Aggiungi DISCOURSE_FORCE_HTTPS: true in modo che il backend generi URL sicuri.

    Promemoria amichevole: Assicurati che DISCOURSE_SMTP_USER_NAME sia impostato sul nome dell’account mailbox grezzo (ad esempio 'logophilia'), non sull’indirizzo email completo (ad esempio 'logophilia@logophilia.eu'), e avvolgi le credenziali tra virgolette singole (') per bypassare eventuali bug di analisi dei caratteri YAML.

  • (4) Configurazione del blocco expose:

    Assicurati che il blocco expose: in app.yml contenga un mapping HTTP; mappare 443=>8443 è opzionale/ridondante, poiché Virtualmin termina la logica SSL prima di inoltrarla:

    expose:
      - 8080:80
    

    ora puoi ricominciare a ricostruire:

    cd /var/discourse
    ./launcher rebuild app
    
  • (5) Configurazione del sottodominio e del percorso proxy:

    • Crea il tuo sottodominio in Virtualmin come al solito e proteggilo con un certificato SSL Let’s Encrypt (viene fatto automaticamente, dico solo: assicurati che non generi errori per motivi non correlati).
    • Vai su Proxy Paths (Virtualmin → il tuo sottodominio → Configurazione Web → Proxy Paths), crea un nuovo mapping / verso http://localhost:8080/, lascia «serve locally» deselezionato, ma attiva Proxy WebSocket su per consentire aggiornamenti in tempo reale e flussi di notifiche.
  • (6) Direttive per l’header CSRF:

    • In Webmin ➔ Servers ➔ Apache Webserver ➔ [trova qui la configurazione del tuo sottodominio e clicca sulla configurazione per 443] ➔ Edit Directives, inserisci le seguenti righe proprio sopra il blocco proxy di Virtualmin per Let’s Encrypt (di solito «ProxyPass /.well-known !») per facilitare l’inoltro del token CSRF:
    ProxyPreserveHost On
    RequestHeader set X-Forwarded-Proto "https"
    RequestHeader set X-Forwarded-For %{REMOTE_ADDR}s
    

    ProxyPreserveHost On: Dice a Discourse il nome del tuo dominio effettivo invece di «localhost».
    RequestHeader set X-Forwarded-Proto "https": Dice esplicitamente a Discourse che l’utente sta utilizzando una connessione sicura, in linea con l’impostazione DISCOURSE_FORCE_HTTPS: true.
    RequestHeader set X-Forwarded-For: Passa il vero IP del visitatore al contenitore in modo che i log di sicurezza funzionino.

  • (7) Handshake pulito del contenitore:

    Mentre il lungo (scusa… ma è vero;-) processo di ricostruzione finisce, assicurati che eventuali blueprint di contenitori bloccati vengano rimossi con docker rm -f app in modo che l’esecuzione di ./launcher start app avvii un’istanza completamente nuova legata alla porta 8080. Controlla che docker ps mostri qualcosa sotto «ports» simile a:

    # docker ps
    CONTAINER ID   IMAGE                 COMMAND        CREATED          STATUS          PORTS                                                                                NAMES
    d21772a21e36   local_discourse/app   "/sbin/boot"   45 minutes ago   Up 45 minutes   0.0.0.0:8080->80/tcp, [::]:8080->80/tcp, 0.0.0.0:8443->443/tcp, [::]:8443->443/tcp   app
    

    (Come puoi vedere, ho lasciato la direttiva 443=>8443 nel mio app.yml, funziona in entrambi i modi.)

  • (8) Monitoraggio e avvio:

    Segui il flusso di avvio con docker logs -f app fino al completamento delle migrazioni del database e all’avvio dei worker per l’elaborazione delle richieste. Fondamentalmente, una serie di righe «INFO» in rapida successione.

  • (9) Finalizzazione:

    Apri il tuo sottodominio in un browser, clicca su Register e lascia che il sistema invii un’email di convalida alla tua casella di posta.

*) fino a prova contraria :wink:

Dovevo disattivare il server Nginx prima dell’installazione. È bello vedere che c’è un flag per saltare questo test, comunque :slight_smile: