Execute Discourse como serviço do Docker Swarm

Estou tentando implantar o Discourse como um serviço de docker swarm.
Usei o método oficial do launcher para implantar o Discourse em uma configuração de contêiner único.
Copiei os arquivos necessários de /var/www/discourse dentro do contêiner standalone para um local nos servidores host para usar no serviço Swarm.
Usei um servidor postgre existente
Criei um contêiner Redis dedicado para o Discourse
O Discourse falha ao iniciar e sai com:
uninitialized constant Discourse::SiteSetting (NameError)
O contêiner se conecta ao PostgreSQL e ao Redis sem problemas.
DISCOURSE_HOSTNAME está corretamente definido como discourse.xyz no ambiente.
Isso pode ser devido a dependências ausentes ou a uma compilação de ativos corrompida?
O Discourse requer alguma modificação para funcionar corretamente dentro de um ambiente Swarm?

version: '3.7'

services:
  app:
    image: discourse-app:latest
    user: "1000:1000"
    working_dir: /var/www/discourse
    deploy:
      replicas: 1
      restart_policy:
        condition: on-failure
      labels:
        - "traefik.enable=true"
        - "traefik.backend=discourse"
        - "traefik.docker.network=service"
        - "traefik.frontend.rule=Host:discourse.xyz"
        - "traefik.port=80"
    command:
      - "/bin/bash"
      - "-c"
      - |
        bundle config set deployment true && \
        bundle config set without 'test development' && \
        RAILS_ENV=production bundle install && \
        RAILS_ENV=production bundle exec rake db:migrate && \
        RAILS_ENV=production bundle exec rails server -b 0.0.0.0
    environment:
      DISCOURSE_DB_HOST: "postgrest1"
      DISCOURSE_DB_PORT: "5432"
      DISCOURSE_DB_USERNAME: "postgres"
      DISCOURSE_DB_PASSWORD: "****"
      DISCOURSE_DB_NAME: "discourse"
      DISCOURSE_REDIS_HOST: "redis-discourse"
      DISCOURSE_REDIS_PORT: "6379"
      DISCOURSE_REDIS_PASSWORD: "****"
      DISCOURSE_HOSTNAME: "discourse.xyz"
      DISCOURSE_DEVELOPER_EMAILS: "abc@xyz.com"
      DISCOURSE_SMTP_ADDRESS: "xyz"
      DISCOURSE_SMTP_PORT: "25"
      DISCOURSE_NOTIFICATION_EMAIL: "donotreply@xyz.com"
    networks:
      - service
    ports:
      - "8080:80"
      - "8443:443"
    volumes:
      - type: bind
        source: /discourse/discourse_files/discourse
        target: /var/www/discourse
        bind:
          propagation: rprivate

      - type: bind
        source: /discourse/shared/standalone
        target: /shared
        bind:
          propagation: rprivate

      - type: bind
        source: /discourse/shared/standalone/log/rails
        target: /data/modulusdata/infra/discourse/shared/standalone/log/rails
        bind:
          propagation: rprivate

      - type: bind
        source: /discourse/shared/standalone/log/var-log
        target: /var/log
        bind:
          propagation: rprivate

networks:
  service:
    external: true

Isso está além do suporte que você pode esperar aqui. Há muitas pequenas coisas que podem estar erradas, por isso a instalação padrão é realmente tudo o que é suportado. Aqui estão algumas dicas. Se você estiver preso e tiver um orçamento, pode entrar em contato comigo ou perguntar em Marketplace

Você não pode usar a imagem base. Você tem que inicializar a sua própria e enviá-la para um repositório. Se você for esperto e tiver muito tempo, pode fazer o github fazer isso por você.

Você precisará colocar seus ativos no S3 (Configurar um provedor de armazenamento de objetos compatível com S3 para uploads)

Você está tentando fazer com que todos eles escrevam nos mesmos arquivos de log? Eu apenas os deixaria no contêiner e os ignoraria.

Eu não acho que você precise das portas 8080 e 8443 — o traefik está cuidando disso, certo? O Discourse não funcionará em uma porta não padrão.

algo como:

./launcher bootstrap app
docker push-that-container-to-your-private-repo
./launcher start-cmd

Então você pode usar as variáveis em start-cmd para iniciar seu swarm com as coisas certas para que ele possa encontrar seu banco de dados, redis e assim por diante. Eu vejo que você tem um monte delas, mas não tenho certeza se é tudo o que você precisa.

2 curtidas