Existem vários sites no meu servidor existente, PostgreSQL (no Docker) e Redis (também no Docker). Gostaria de reutilizar o Postgres e o Redis existentes com o Discourse.
Aqui está o meu containers/app.yml do Discourse:
templates:
# - "templates/postgres.template.yml"
# - "templates/redis.template.yml"
- "templates/web.template.yml"
## Descomente a próxima linha para habilitar o ouvinte IPv6
# - "templates/web.ipv6.template.yml"
- "templates/web.ratelimited.template.yml"
## Descomente estas duas linhas se desejar adicionar o Lets Encrypt (https)
# - "templates/web.ssl.template.yml"
# - "templates/web.letsencrypt.ssl.template.yml"
- "templates/web.socketed.template.yml" # Adicionado
extra_hosts:
- "host.docker.internal:host-gateway"
expose:
- "8881:80" # http
# - "443:443" # https
env:
DISCOURSE_DB_NAME: discourse
DISCOURSE_DB_USERNAME: discourse
DISCOURSE_DB_HOST: host.docker.internal
DISCOURSE_DB_PASSWORD: XXXXXXXXXXX
DISCOURSE_REDIS_HOST: host.docker.internal
DISCOURSE_REDIS_PORT: 6379
Outros sites rodam sem docker, e eles conseguem se conectar com sucesso ao Redis e PostgreSQL através de localhost. Aqui está o arquivo docker-compose do postgres/redis:
version: "1.0"
services:
postgres:
container_name: postgres_db
build: postgres_th
# algumas configurações foram removidas, para tornar o arquivo mais curto para este exemplo
ports:
- "5432:5432"
restart: unless-stopped
networks:
- main_network
redis:
container_name: redis
image: redis:7.2.1
ports:
- "6379:6379"
healthcheck:
test: ["CMD", "redis-cli", "--raw", "incr", "ping"]
restart: unless-stopped
networks:
- main_network
networks:
main_network:
external: true
Quando tento construir a imagem docker do Discourse, recebo o seguinte erro:
./launcher rebuild app
FAILED
--------------------
Pups::ExecError: cd /var/www/discourse & su discourse -c 'bundle exec rake db:migrate' failed with return #<Process::Status: pid 358 exit 1>
Location of failure: /usr/local/lib/ruby/gems/3.2.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
exec failed with the params {"cd"=>"$home", "hook"=>"db_migrate", "cmd"=>["su discourse -c 'bundle exec rake db:migrate'"]}
bootstrap failed with exit code 1
** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.
Encontrei uma solução aqui Configure Discourse to use a separate PostgreSQL server para usar docker com rede host.
./launcher rebuild app --docker-args --net=host --skip-mac-address
e definindo DISCOURSE_DB_HOST para localhost
neste caso tudo funciona bem, o único problema que resta é que a imagem do Discourse está rodando sem porta exposta porque usa a rede host em vez de bridge.
Existe alguma maneira de conectar a um servidor Postgres externo de alguma forma sem configurar o docker do Discourse para usar a rede host? Como uma solução alternativa, se eu usar a rede host, como conecto o nginx externo (que roda no mesmo servidor mas sem Docker) ao nginx dentro do docker do Discourse?