I faced a hard time configuring multisites on Discourse. Standalone install was fine and straight forward. Here are some important points from my trials.

1) Docker will run properly only on KVM or XEN with AUFS supported kernal

2) Multisite install worked for me only after I successfully installed the standalone version and then rebuilding it appending the hooks in app.yml file

3) YML is so delicate that even minor space can return error.

Here are the steps I followed

Install Ubuntu 14.10 64 bit on 2 GB VPS

Then update the OS

sudo apt-get update && sudo apt-get upgrade

Install GIT

apt-get install git

Install Docker

wget -qO- https://get.docker.io/ | sh

Create folder for discourse , where all the discourse-related files will be saved

mkdir /var/discourse

Clone the Discourse Docker Image into this /var/discourse folder:

git clone https://github.com/discourse/discourse_docker.git /var/discourse

Switch to the /var/discourse directory:

cd /var/discourse

Copy the samples/standalone.yml file into the containers folder as app.yml:

cp samples/standalone.yml containers/app.yml

Edit the app.yml as follows

vi ./containers/app.yml
##
## After making changes to this file, you MUST rebuild for any changes
## to take effect in your live Discourse instance:
##
## /var/discourse/launcher rebuild app
##
## Make sure to obey YAML syntax! You can use this site to help check:
## http://www.yamllint.com/
## this is the all-in-one, standalone Discourse Docker container template
# You may add rate limiting by uncommenting the web.ratelimited template.
# Out of the box it allows 12 reqs a second per ip, and 100 per minute per ip
# This is configurable by amending the params in this file
templates:
 - "templates/postgres.template.yml"
 - "templates/redis.template.yml"
 - "templates/web.template.yml"
 - "templates/sshd.template.yml"
 - "templates/web.ratelimited.template.yml"
## which TCP/IP ports should this container expose?
expose:
- "80:80" # fwd host port 80 to container port 80 (http)
- "2222:22" # fwd host port 2222 to container port 22 (ssh)
params:
db_default_text_search_config: "pg_catalog.english"
## Set db_shared_buffers to 1/3 of the memory you wish to allocate to postgres
## on 1GB install set to 128MB on a 4GB instance you may raise to 1GB
#db_shared_buffers: "256MB"
#
## Which Git revision should this container use? (default: tests-passed)
#version: tests-passed
env:
LANG: en_US.UTF-8
# DISCOURSE_DEFAULT_LOCALE: en
## TODO: How many concurrent web requests are supported?
## With 2GB we recommend 3-4 workers, with 1GB only 2
UNICORN_WORKERS: 4
## 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: '<user@domain.ext>'
## TODO: The domain name this Discourse instance will respond to
DISCOURSE_HOSTNAME: '<forum.domain.com>'
## TODO: The mailserver this Discourse instance will use
DISCOURSE_SMTP_ADDRESS: smtp.mandrillapp.com # (mandatory)
DISCOURSE_SMTP_PORT: 587 # (optional)
DISCOURSE_SMTP_USER_NAME: <user@domain.ext> # (optional)
DISCOURSE_SMTP_PASSWORD: <API KEY> # (optional)
## The CDN address for this Discourse instance (configured to pull)
#DISCOURSE_CDN_URL: //discourse-cdn.example.com
## These containers are stateless, all data is stored in /shared
volumes:
- volume:
host: /var/discourse/shared/standalone
guest: /shared
- volume:
host: /var/discourse/shared/standalone/log/var-log
guest: /var/log

## The docker manager plugin allows you to one-click upgrade Discourse
## 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
## 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:
#- exec: apt-get -y install whois # for mkpasswd
## 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;}'

Once it is saved – ESC ( Shit: wq)

Before boot strapping the app Edit

vi /etc/default/docker

Uncomment the DOCKER_OPTS line so that Docker can use Google DNS Servers:

# Use DOCKER_OPTS to modify the daemon startup options.
DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"

Restart Docker to apply the changed setting:

service docker restart

Now we can boot Strap App

./launcher bootstrap app

Once this is done and the installation succeed

Start the App

./launcher start app

This conclude the standalone Installation

Now we will be able to access the site on http://forum.domain.com

Now we can go to the steps involved in configuring additional domains, here I have added two additional domains making total 3 forums running on the single install, if you are planning to add more, try to do this at one go otherwise later rebuild may return error.

Edit the app.yml file we edited before

vi ./containers/app.yml

Replace the Hooks Part as follows. Remember to keep the correct indentation as YML is very strict on this 🙂

If you are adding more just repeat the commands and add like c_discourse and keep the db_id incremented making it unique.

hooks:
 after_postgres:
 - exec: sudo -u postgres createdb b_discourse || exit 0
 - exec:
 stdin: |
 grant all privileges on database b_discourse to discourse;
 cmd: sudo -u postgres psql b_discourse
 raise_on_fail: false
 - exec: /bin/bash -c 'sudo -u postgres psql b_discourse <<< "alter schema public owner to discourse;"'
 - exec: /bin/bash -c 'sudo -u postgres psql b_discourse <<< "create extension if not exists hstore;"'
 - exec: /bin/bash -c 'sudo -u postgres psql b_discourse <<< "create extension if not exists pg_trgm;"'
 - exec: sudo -u postgres createdb c_discourse || exit 0
 - exec:
 stdin: |
 grant all privileges on database c_discourse to discourse;
 cmd: sudo -u postgres psql c_discourse
 raise_on_fail: false
 - exec: /bin/bash -c 'sudo -u postgres psql c_discourse <<< "alter schema public owner to discourse;"'
 - exec: /bin/bash -c 'sudo -u postgres psql c_discourse <<< "create extension if not exists hstore;"'
 - exec: /bin/bash -c 'sudo -u postgres psql c_discourse <<< "create extension if not exists pg_trgm;"'
 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: |
 secondsite:
 adapter: postgresql
 database: b_discourse
 pool: 25
 timeout: 5000
 db_id: 2
 host_names:
 -<forum.site2.com>
 thirdsite:
 adapter: postgresql
 database: c_discourse
 pool: 25
 timeout: 5000
 db_id: 3
 host_names:
 - <forum.site3.com>
 after_bundle_exec:
 - exec: cd /var/www/discourse && sudo -E -u discourse bundle exec rake multisite:migrate

Save the file

Then rebuild the app by issuing command

./launcher rebuild app

It will take some time to rebuild the app based on the number of domains added, once complete voila you have 3 domains setup on single discourse installation

Discourse Multisite Install

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.