Então, usei a documentação de instalação padrão e tudo pareceu correr bem. Em seguida, editei o app.yml para alterar as portas utilizadas, comentei o LetsEncrypt e reconstruí. Parece que tudo funcionou corretamente.
Mas, quando tento me conectar pelo método mais direto:
root@hestia-app:/shared/log/rails# tail -f *.log
==> production_errors.log <==
==> production.log <==
==> sidekiq.log <==
==> unicorn.stderr.log <==
I, [2021-08-06T00:56:35.859967 #85] INFO -- : master concluiu a reabertura dos logs
I, [2021-08-06T00:56:50.911700 #142] INFO -- : worker=0 concluiu a reabertura dos logs
I, [2021-08-06T00:56:50.911698 #152] INFO -- : worker=1 concluiu a reabertura dos logs
I, [2021-08-06T00:56:50.935834 #162] INFO -- : worker=2 concluiu a reabertura dos logs
I, [2021-08-06T00:56:50.941733 #233] INFO -- : worker=7 concluiu a reabertura dos logs
I, [2021-08-06T00:56:50.945447 #203] INFO -- : worker=5 concluiu a reabertura dos logs
I, [2021-08-06T00:56:50.947354 #172] INFO -- : worker=3 concluiu a reabertura dos logs
I, [2021-08-06T00:56:50.949949 #187] INFO -- : worker=4 concluiu a reabertura dos logs
I, [2021-08-06T00:56:50.953453 #213] INFO -- : worker=6 concluiu a reabertura dos logs
==> unicorn.stdout.log <==
Sidekiq PID 131 concluiu a reabertura dos logs...
Eu entrei no aplicativo novamente, executei o comando ps ax e parece que tudo está funcionando. Apenas parece que o contêiner não está aceitando conexões.
root@hestia-app:/var/www/discourse# ps ax
PID TTY STAT TIME COMMAND
1 pts/0 Ss+ 0:00 /bin/bash /sbin/boot
43 pts/0 S+ 0:00 /usr/bin/runsvdir -P /etc/service
44 ? Ss 0:00 runsv cron
45 ? Ss 0:00 runsv rsyslog
46 ? Ss 0:00 runsv redis
47 ? Ss 0:00 runsv postgres
48 ? Ss 0:00 runsv unicorn
49 ? Ss 0:00 runsv nginx
50 ? S 0:00 cron -f
51 ? Sl 0:00 rsyslogd -n
52 ? S 0:00 nginx: master process /usr/sbin/nginx
53 ? S 0:00 svlogd /var/log/redis
54 ? S 0:00 svlogd /var/log/postgres
55 ? S 0:00 /usr/lib/postgresql/13/bin/postmaster -D /etc/postgresql/13/main
56 ? Sl 0:33 /usr/bin/redis-server *:6379
57 ? S 0:04 /bin/bash config/unicorn_launcher -E production -c config/unicorn.conf.rb
64 ? S 0:00 nginx: worker process
65 ? S 0:00 nginx: worker process
66 ? S 0:00 nginx: worker process
67 ? S 0:00 nginx: worker process
68 ? S 0:00 nginx: cache manager process
79 ? Ss 0:00 postgres: 13/main: checkpointer
80 ? Ss 0:00 postgres: 13/main: background writer
81 ? Ss 0:03 postgres: 13/main: walwriter
82 ? Ss 0:00 postgres: 13/main: autovacuum launcher
83 ? Ss 0:00 postgres: 13/main: stats collector
84 ? Ss 0:00 postgres: 13/main: logical replication launcher
85 ? Sl 0:13 unicorn master -E production -c config/unicorn.conf.rb
113 ? Ss 0:01 postgres: 13/main: discourse discourse [local] idle
131 ? SNl 0:48 sidekiq 6.2.1 discourse [0 of 5 busy]
142 ? Sl 0:06 unicorn worker[0] -E production -c config/unicorn.conf.rb
152 ? Sl 0:06 unicorn worker[1] -E production -c config/unicorn.conf.rb
162 ? Sl 0:07 unicorn worker[2] -E production -c config/unicorn.conf.rb
172 ? Sl 0:06 unicorn worker[3] -E production -c config/unicorn.conf.rb
180 ? Ss 0:00 postgres: 13/main: discourse discourse [local] idle
187 ? Sl 0:07 unicorn worker[4] -E production -c config/unicorn.conf.rb
203 ? Sl 0:07 unicorn worker[5] -E production -c config/unicorn.conf.rb
213 ? Sl 0:07 unicorn worker[6] -E production -c config/unicorn.conf.rb
233 ? Sl 0:07 unicorn worker[7] -E production -c config/unicorn.conf.rb
11733 pts/1 Ss 0:00 /bin/bash --login
11748 ? S 0:00 sleep 1
11749 pts/1 R+ 0:00 ps ax
Certo, então eu entrei no app e instalei o lynx dentro do Docker do Discord, e eu consegui acessar a página de boas-vindas lá! Então a instalação está funcionando; o problema é o mapeamento de rede de dentro do Docker para fora, até o servidor.
Aqui está a saída do docker ps:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c6d0209e4e72 local_discourse/app "/sbin/boot" 51 minutes ago Up 51 minutes 127.0.0.1:8880->80/tcp, 127.0.0.1:4443->443/tcp app
…e aqui estão as informações do app.yml:
templates:
- "templates/postgres.template.yml"
- "templates/redis.template.yml"
- "templates/web.template.yml"
- "templates/web.ratelimited.template.yml"
expose:
- "127.0.0.1:8880:80" # http
- "127.0.0.1:4443:443" # https
params:
db_default_text_search_config: "pg_catalog.english"
db_shared_buffers: "2048MB"
env:
LC_ALL: en_US.UTF-8
LANG: en_US.UTF-8
LANGUAGE: en_US.UTF-8
UNICORN_WORKERS: 8
DISCOURSE_HOSTNAME: [redacted]
DISCOURSE_SMTP_ADDRESS: [redacted]
DISCOURSE_SMTP_PORT: 587
DISCOURSE_SMTP_USER_NAME: [redacted]
DISCOURSE_SMTP_PASSWORD: "[redacted]"
#DISCOURSE_SMTP_ENABLE_START_TLS: true # (opcional, padrão true)
DISCOURSE_SMTP_DOMAIN: [redacted]
DISCOURSE_NOTIFICATION_EMAIL: [redacted]
## O contêiner Docker é sem estado; todos os dados são armazenados em /shared
volumes:
- volume:
host: /var/discourse/shared/standalone
guest: /shared
- volume:
host: /var/discourse/shared/standalone/log/var-log
guest: /var/log
## Plugins vão aqui
## veja https://meta.discourse.org/t/19157 para detalhes
hooks:
after_code:
- exec:
cd: $home/plugins
cmd:
- git clone https://github.com/discourse/docker_manager.git
## Quaisquer comandos personalizados para executar após a construção
run:
- exec: echo "Início dos comandos personalizados"
- exec: echo "Fim dos comandos personalizados"
Ah, entendi o que fiz. O 8880:80 funciona bem, eu estava apenas testando o lado do 4443:443. Ele não funcionou porque há um erro de certificado. Tenho a intenção de instalar e gerenciar o certificado no nível do servidor web, no host virtual. Vou postar uma solução final para os interessados assim que conseguir fazer tudo funcionar.
Instalar ambiente
Hestia Control Panel (para gerenciamento de servidor)
Apache2 (servidor web)
Discourse em Docker, com proxy reverso para o Apache2
Let’sEncrypt não está em proxy reverso, mas gerenciado pelo Hestia no www_root
Configure sockets Unix em app.yml (e reconstrua):
- "templates/web.socketed.template.yml"
Remova o mapeamento de portas e o Let’sEncrypt de app.yml (e reconstrua)
Crie templates alternativos de apache2.conf para o HestiaCP conforme a seguir (para quem não usa o HestiaCP, apenas saiba que as tags %{replace tags}% são bastante padrão e óbvias se você olhar qualquer outro arquivo apache2.conf. As partes mais importantes não usam muitas tags %{replace tags}%. Note também que o texto standalone poderia ser socket-only, dependendo da sua configuração. Verifique o que está no diretório /var/discourse/shared/ se não se lembrar.
{Custom Template}.stpl
<VirtualHost %ip%:%web_ssl_port%>
ServerName %domain_idn%
ProxyPreserveHost On
ProxyRequests Off
ProxyPass / unix:/var/discourse/shared/standalone/nginx.http.sock|http://localhost/
ProxyPassReverse / unix:/var/discourse/shared/standalone/nginx.http.sock|http://localhost/
ServerAdmin %email%
Alias /vstats/ %home%/%user%/web/%domain%/stats/
Alias /error/ %home%/%user%/web/%domain%/document_errors/
CustomLog /var/log/%web_system%/domains/%domain%.bytes bytes
CustomLog /var/log/%web_system%/domains/%domain%.log combined
ErrorLog /var/log/%web_system%/domains/%domain%.error.log
<Directory %home%/%user%/web/%domain%/stats>
AllowOverride All
</Directory>
<Directory %sdocroot%>
AllowOverride All
SSLRequireSSL
Options +Includes -Indexes +ExecCGI
</Directory>
SSLEngine on
SSLVerifyClient none
SSLCertificateFile %ssl_crt%
SSLCertificateKeyFile %ssl_key%
%ssl_ca_str%SSLCertificateChainFile %ssl_ca%
IncludeOptional %home%/%user%/conf/web/%domain%/%web_system%.ssl.conf_*
</VirtualHost>
{Custom Template}.tpl
<VirtualHost %ip%:%web_port%>
ServerName %domain_idn%
%alias_string%
ProxyPreserveHost On
ProxyRequests Off
ProxyPass / unix:/var/discourse/shared/standalone/nginx.http.sock|http://localhost/
ProxyPassReverse / unix:/var/discourse/shared/standalone/nginx.http.sock|http://localhost/
RewriteEngine On
RewriteCond %{REQUEST_URI} !^.well-known/acme-challenge
RewriteRule ^(.*) https://%domain_idn%/$1 [R=301,L]
Alias /vstats/ %home%/%user%/web/%domain%/stats/
Alias /error/ %home%/%user%/web/%domain%/document_errors/
CustomLog /var/log/%web_system%/domains/%domain%.bytes bytes
CustomLog /var/log/%web_system%/domains/%domain%.log combined
ErrorLog /var/log/%web_system%/domains/%domain%.error.log
<Directory %home%/%user%/web/%domain%/stats>
AllowOverride All
</Directory>
<Directory %sdocroot%>
AllowOverride All
Options +Includes -Indexes +ExecCGI
</Directory>
IncludeOptional %home%/%user%/conf/web/%domain%/%web_system%.conf_*
</VirtualHost>