Il y a plusieurs sites Web sur mon serveur existant, PostgreSQL (dans Docker) et Redis (également dans Docker). Je voudrais réutiliser Postgres et Redis existants avec Discourse.
Voici mon containers/app.yml de Discourse :
templates:
# - "templates/postgres.template.yml"
#- "templates/redis.template.yml"
- "templates/web.template.yml"
## Uncomment the next line to enable the IPv6 listener
#- "templates/web.ipv6.template.yml"
- "templates/web.ratelimited.template.yml"
## Uncomment these two lines if you wish to add Lets Encrypt (https)
#- "templates/web.ssl.template.yml"
#- "templates/web.letsencrypt.ssl.template.yml"
- "templates/web.socketed.template.yml" # Added
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
D’autres sites Web fonctionnent sans docker, et ils peuvent se connecter avec succès à Redis et PostgreSQL via localhost. Voici le fichier docker-compose de postgres/redis :
version: "1.0"
services:
postgres:
container_name: postgres_db
build: postgres_th
# some settings were removed, to make file shorter for this example
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
Lorsque j’essaie de construire l’image Docker de Discourse, j’obtiens l’erreur suivante :
./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.
J’ai trouvé une solution ici Configure Discourse to use a separate PostgreSQL server pour utiliser docker avec le réseau hôte.
./launcher rebuild app --docker-args --net=host --skip-mac-address
et en définissant DISCOURSE_DB_HOST sur localhost
dans ce cas, tout fonctionne bien, le seul problème restant est que l’image Discourse s’exécute sans port exposé car elle utilise le réseau hôte au lieu du pont.
Existe-t-il un moyen de se connecter à un serveur Postgres externe sans configurer le docker de Discourse pour utiliser le réseau hôte ? En solution alternative, si j’utilise le réseau hôte, comment connecter nginx externe (qui s’exécute sur le même serveur mais sans Docker) à nginx à l’intérieur du docker de Discourse ?