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 '[email protected],[email protected]' DISCOURSE_DEVELOPER_EMAILS: '<[email protected]>' ## 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: <[email protected]> # (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