Hay varios sitios web en mi servidor existente, PostgreSQL (en Docker) y Redis (también en Docker). Me gustaría reutilizar Postgres y Redis existentes con Discourse.
Aquí está mi containers/app.yml de Discourse:
templates:
# - "templates/postgres.template.yml"
# - "templates/redis.template.yml"
- "templates/web.template.yml"
## Descomenta la siguiente línea para habilitar el oyente IPv6
# - "templates/web.ipv6.template.yml"
- "templates/web.ratelimited.template.yml"
## Descomenta estas dos líneas si deseas agregar Lets Encrypt (https)
# - "templates/web.ssl.template.yml"
# - "templates/web.letsencrypt.ssl.template.yml"
- "templates/web.socketed.template.yml" # Añadido
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
Otros sitios web se ejecutan sin docker y pueden conectarse exitosamente a Redis y PostgreSQL a través de localhost. Aquí está el archivo docker-compose de postgres/redis:
version: "1.0"
services:
postgres:
container_name: postgres_db
build: postgres_th
# se eliminaron algunas configuraciones para acortar el archivo para este ejemplo
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
Cuando intento compilar la imagen docker de Discourse, obtengo el siguiente error:
./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.
Encontré una solución aquí Configure Discourse to use a separate PostgreSQL server para usar docker con la red del host.
./launcher rebuild app --docker-args --net=host --skip-mac-address
y estableciendo DISCOURSE_DB_HOST a localhost
en este caso todo funciona bien, el único problema que queda es que la imagen de Discourse se ejecuta sin un puerto expuesto porque utiliza la red del host en lugar de la red puente.
¿Hay alguna forma de conectarse a un servidor Postgres externo de alguna manera sin configurar el docker de Discourse para usar la red del host? Como solución alternativa, si uso la red del host, ¿cómo conecto nginx externo (que se ejecuta en el mismo servidor pero sin Docker) a nginx dentro del docker de Discourse?