Container restart - discourse tries to reinstall

A side conversation with @rosscdh revealed his main end-goal is Discourse on Kubernetes. This is not a supported configuration here. Thereā€™s valid criticism with the way we do things in relation to Docker/Kubernetes; however, weā€™ve chosen to take this approach with launcher for ease of use in the self-hosting world.

Iā€™ve reopened this topic but please keep it civil and constructive.

2 Likes

But it wasnā€™t a thing until after ./launcher was developed. :wink:

If you want to launch to k8s or similar then what I do is use launcher to build the image and push it somewhere and then have k8ts launch that image. Launcher does some stuff like migrate the database on upgrades, so you need to pay attention to how that works.

1 Like

Thanks for that,

The goal is to make it more docker like so it can run on kube as well as jsut using docker with stand alone containers.

Iā€™ve managed to use the launcher and generate an image 2+Gb in size (4 plugins, cant do 6 because limits)

Iā€™ve also docker composed it so its now a clean runbook
am familiar with GlobalSettings and have slightly modified the application.rb and routes.rb so im just mounting customizations.

version: '3'

networks:
  discourse-net:

services:
  mailhog:
    image: mailhog/mailhog:latest
    networks:
      - discourse-net
    ports:
      - 8025:8025

  postgres:
    image: postgres:9.6
    networks:
      - discourse-net
    environment:
      POSTGRES_PASSWORD: password
      POSTGRES_USER: discourse
      POSTGRES_DB: discourse

  redis:
    image: redis:alpine
    networks:
      - discourse-net

  discourse:
    image: discourse-monkey:latest
    working_dir: /var/www/discourse
    command: bash /var/www/discourse/entrypoint.sh
    # ports:
    #   - 3000:3000 # use the nginx entrypoint
    networks:
      - discourse-net
    volumes:
      - ./entrypoint.sh:/var/www/discourse/entrypoint.sh
      - ./config/unicorn.rb:/var/www/discourse/config/unicorn.rb
      - ./config/application.rb:/var/www/discourse/config/application.rb
      - ./envs/production.rb:/var/www/discourse/config/environments/production.rb
      - ./overrides/routes.rb:/var/www/discourse/config/routes.rb
      - ./generated/public/assets:/var/www/discourse/public/assets
      - ./generated/public/images:/var/www/discourse/public/images
      - ./generated/public/uploads:/var/www/discourse/public/uploads
      - ./generated/public/javascripts:/var/www/discourse/public/javascripts
      - ./generated/public/svg-sprite:/var/www/discourse/public/svg-sprite

    environment:
      LANG: en_US.UTF-8
      DISCOURSE_DEFAULT_LOCALE: en
      RAILS_ENV: production
      ## How many concurrent web requests are supported? Depends on memory and CPU cores.
      ## will be set automatically by bootstrap based on detected CPUs, or you can override
      UNICORN_WORKERS: 3

      ## TODO: The domain name this Discourse instance will respond to
      DISCOURSE_HOSTNAME: discuss.monkey.tech:3001
      DOCKER_USE_HOSTNAME: "true"

      ## Uncomment if you want the container to be started with the same
      ## hostname (-h option) as specified above (default "$hostname-$config")
      #DOCKER_USE_HOSTNAME: true

      ## TODO: List of comma delimited emails that will be made admin and developer
      ## on initial signup example 'user1@example.com,user2@example.com'
      DISCOURSE_DEVELOPER_EMAILS: 'me@example.com,you@example.com'

      ## TODO: The SMTP mail server used to validate new accounts and send notifications
      # SMTP ADDRESS, username, and password are required
      # WARNING the char '#' in SMTP password can cause problems!
      DISCOURSE_SMTP_ADDRESS: mailhog
      #DISCOURSE_SMTP_PORT: 587
      DISCOURSE_SMTP_USER_NAME: mailhog
      DISCOURSE_SMTP_PASSWORD: password
      #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (optional, default true)

      ## If you added the Lets Encrypt template, uncomment below to get a free SSL certificate
      #LETSENCRYPT_ACCOUNT_EMAIL: me@example.com

      ## TODO: configure connectivity to the databases
      # DISCOURSE_DB_SOCKET: ''
      DISCOURSE_DB_HOST: postgres
      DISCOURSE_DB_USERNAME: discourse
      DISCOURSE_DB_PASSWORD: password
      DISCOURSE_REDIS_HOST: redis

      ## The http or https CDN address for this Discourse instance (configured to pull)
      ## see https://meta.discourse.org/t/14857 for details
      DISCOURSE_CDN_URL: http://discuss.monkey.tech:3001
      DISCOURSE_SERVE_STATIC_ASSETS: "true"

      SKIP_ENFORCE_HOSTNAME: '0'
      ENABLE_ASSETS_PIPELINE: '0'
      ENABLE_DB_MIGRATE: '0'

      DISCOURSE_ENABLE_CORS: 'false'
      DISCOURSE_CORS_ORIGIN: '*'
      #SKIP_DB_AND_REDIS: '1'

  nginx:
    image: fholzer/nginx-brotli
    # command: /bin/sh -c "envsubst < /etc/nginx/conf.d/discourse.template.conf > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'" 
    ports:
      - 3001:80
    depends_on:
      - discourse
    networks:
      - discourse-net
    volumes:
      - ./config/nginx.application.conf:/etc/nginx/conf.d/default.conf
      - ./generated/public:/var/www/discourse/public
      - ./generated/nginx/cache:/var/nginx/cache

Works beautifully; and all traffic routes via nginx which also shares the assets:precompile output

next steps is simply to have a set of calls to the image to precompile assets and db:migrate ā€œon demandā€ or jsut use exec to do the same (as those items dont change that often) and maybe see if i can reduce this 2.6 Gb image sizeā€¦

Its feeling quite a bit cleaner, as mentioned before the pup functioanlity is ok; and i can appreciate what it offers. I have quite a few reservations about the build where you run it and using sudo strategiesā€¦ (this is very rarely how I/anyone i know works) usually images are built independently and deployed elsewhere (kube, saltstack, nomad, docker-compose)

Iā€™ve got a potential PR to add a sample/kube.yml and applications/kubernetes.template.yml as there are certain items, overrides and settings to disable db and redis and then actually disable redis and db at build as well as disable precompileā€¦ if thats interesting.

Was an interesting experience thanks for the bumpā€¦

There is only one small weirdness todo with the fixtures (perhaps from calling migrate a few times)
see attached image

3 Likes

I believe docker-compose was based on a tool called ā€œfigā€.

1 Like