Unable to upgrade discourse with separate data container

Continuing the discussion from Connectivity/Configuration issue with separate data container:

I have a working discourse install and I tried to perform an upgrade by going to /admin/upgrade and got the following error:

$ bundle exec rake multisite:migrate
URGENT: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket “/var/run/postgresql/.s.PGSQL.5432”?
Failed to initialize site squadwars

And as I explained before I don’t understand why it is trying to connect to a local database when the web_only.yml file clearly indicates it is a separate database, here is my web_only.yml:

# IMPORTANT: SET A SECRET PASSWORD in Postgres for the Discourse User
# TODO: change SOME_SECRET in this template

templates:
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"

expose:
  - "80:80"
  - "2222:22"

# Use 'links' key to link containers together, aka use Docker --link flag.
links:
  - link:
      name: data
      alias: data

# any extra arguments for Docker?
# docker_args:

params:
  ## Which Git revision should this container use? (default: tests-passed)
  #version: tests-passed

env:
  LANG: en_US.UTF-8
  ## TODO: How many concurrent web requests are supported?
  ## With 2GB we recommend 3-4 workers, with 1GB only 2
  ## If you have lots of memory, use one or two workers per logical CPU core
  #UNICORN_WORKERS: 3

  ## TODO: configure connectivity to the databases
  DISCOURSE_DB_SOCKET: ''
  DISCOURSE_DB_USERNAME: discourse
  DISCOURSE_DB_PASSWORD: REDACTED
  PGHOST: data
  PGPASSWORD: REDACTED
  DISCOURSE_DB_HOST: data
  DISCOURSE_REDIS_HOST: data
  ##
  ## 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: 'REDACTED@example.com'
  ##
  ## TODO: The domain name this Discourse instance will respond to
  DISCOURSE_HOSTNAME: 'despicable.squadwars.org'
  ##
  ## TODO: The mailserver this Discourse instance will use
  DISCOURSE_SMTP_ADDRESS: smtp.mailgun.org         # (mandatory)
  #DISCOURSE_SMTP_PORT: 587                        # (optional)
  DISCOURSE_SMTP_USER_NAME: discourse@mg.squadwars.org      # (optional)
  DISCOURSE_SMTP_PASSWORD: REDACTED               # (optional)
  ##
  ## The CDN address for this Discourse instance (configured to pull)
  #DISCOURSE_CDN_URL: //discourse-cdn.example.com

volumes:
  - volume:
      host: /var/discourse/shared/web-only
      guest: /shared
  - volume:
      host: /var/discourse/shared/web-only/log/var-log
      guest: /var/log

## The docker manager plugin allows you to one-click upgrade Discouse
## http://discourse.example.com/admin/docker
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - mkdir -p plugins
          - git clone https://github.com/discourse/docker_manager.git
  before_bundle_exec:
    - file:
        path: $home/config/multisite.yml
        contents: |
         squadwars:
           adapter: postgresql
           database: squadwars
           pool: 25
           timeout: 5000
           db_id: 2
           host_names:
             - discourse.squadwars.org

  after_bundle_exec:
    - exec: cd /var/www/discourse && sudo -E -u discourse bundle exec rake multisite:migrate
## Remember, this is YAML syntax - you can only have one block with a name
run:
  - exec: echo "Beginning of custom commands"

  ## If you want to configure password login for root, uncomment and change:
  ## Use only one of the following lines:
  #- exec: /usr/sbin/usermod -p 'PASSWORD_HASH' root
  #- exec: /usr/sbin/usermod -p "$(mkpasswd -m sha-256 'RAW_PASSWORD')" root

  ## If you want to authorized additional users, uncomment and change:
  #- exec: ssh-import-id username
  #- exec: ssh-import-id anotherusername

  - exec: echo "End of custom commands"
  - exec: awk -F\# '{print $1;}' ~/.ssh/authorized_keys | awk 'BEGIN { print "Authorized SSH keys for this container:"; } NF>=2 {print $NF;}'

I was getting the same error during installation until I added the PGHOST and PGPASSWORD variables into my web_only.yml file – but perhaps these variables aren’t being picked up for the upgrade?

Thanks for any help!

Oh, and now when I go into /admin/upgrade I get “The page you requested doesn’t exist or is private.”

:confused:

Okay, I was able to do a ./launcher rebuild web_only and now everything is working. I suppose that is what you have to do for a multisite install instead of using the /admin/upgrade page? I also added the PGHOST and PGPASSWORD environment variables in front of the command ‘sudo -E -u discourse bundle exec rake multisite:migrate’. Not sure if that was necessary or if the rebuild would have worked on its own.

Looks like you need to add host and password to the multisite.yml configuration and you’ll be fine:

  before_bundle_exec:
    - file:
        path: $home/config/multisite.yml
        contents: |
         squadwars:
           adapter: postgresql
           database: squadwars
           host: data
           password: REDACTED
           pool: 25
           timeout: 5000
           db_id: 2
           host_names:
             - discourse.squadwars.org

See the sample multisite.yml at https://raw.githubusercontent.com/discourse/discourse/master/config/multisite.yml.production-sample

mlp:
  adapter: postgresql
  database: discourse_mlp
  username: discourse_mlp
  password: applejack
  host: dbhost
  pool: 5
  timeout: 5000
  db_id: 1	# ensure db_id is unique for each site
  ### If you change this setting you will need to
  ###   - restart sidekiq if you change this setting
  ###   - rebake all to posts using: `RAILS_ENV=production bundle exec rake posts:rebake`
  host_names:
    - discourse.equestria.com
    - discourse.equestria.internal

drwho:
  adapter: postgresql
  database: discourse_who
  username: discourse_who
  password: "Up the time stream without a TARDIS"
  host: dbhost
  pool: 5
  timeout: 5000
  db_id: 	# ensure db_id is unique for each site
  ### If you change this setting you will need to
  ###   - restart sidekiq if you change this setting
  ###   - rebake all to posts using: `RAILS_ENV=production bundle exec rake posts:rebake`
  host_names:
    - discuss.tardis.gallifrey
2 Likes