This howto documents broadly how to set up a multisite setup with 2 additional hosts (3 total).
It assumes that you have already set up a 2-container installation (Move from standalone container to separate web and data containers - #48 by neounix - sysadmin - Discourse Meta).
This uses Topic Template Placeholder Text theme component - theme-component - Discourse Meta, so the information you include in the fields below is reflected in the sections of code that you will copy and paste.
Domain name for primary site
subdomain for the 2nd site
Suddomain for the 3rd site
Database password (same as DISCOURSE_DB_PASSWORD
) or discourse
in app.yml
For the sake of simplicity, this is for a main site called =domain=, with two additional sites =two=.=domain= and =three=.=domain=. You can use whatever names you want, but for the sake of this template, not having a different short name
(for the database name and title for the sub-forum) and full hostname
is a bit easier.
This has been tested for the two-container setup, but apparently doesn’t work for the one-container version, so I recommend that you go with the two-container setup!
add in hooks
after the plugins in app.yml
or web_only.yml
before_bundle_exec:
- file:
path: $home/config/multisite.yml
contents: |
=two=:
adapter: postgresql
database: =two=
pool: 25
timeout: 5000
host: data
password: NThmZTNjZjZhOTczNmVj
host_names:
- =two=.=domain=
=three=:
adapter: postgresql
database: =three=
pool: 25
timeout: 5000
host: data
password: NThmZTNjZjZhOTczNmVj
host_names:
- =three=.=domain=
after_db_migrate:
- exec: cd /var/www/discourse && sudo -E -u discourse bundle exec rake multisite:migrate
after_ssl:
# tell letsencrypt what additional certs to get
- replace:
filename: "/etc/runit/1.d/letsencrypt"
from: /--keylength/
to: "-d =two=.=domain= -d =three=.=domain= --keylength"
# do not redirect all hosts back to the main domain name
- replace:
filename: "/etc/nginx/conf.d/discourse.conf"
from: /if \(\$http_host[^\}]*\}/m
to: ""
- replace:
filename: "/etc/nginx/conf.d/discourse.conf"
from: /return 301.*$/
to: "return 301 https://$host$request_uri;"
Add to the after_postgres
section in app.yml
or data.yml
- exec:
- cmd: sudo -u postgres psql
stdin: |
create database =two= ;
grant all privileges on database =two= to discourse;
cmd: sudo -u postgres psql =two=
raise_on_fail: false
- exec: /bin/bash -c 'sudo -u postgres psql =two= <<< "alter schema public owner to discourse;"'
- exec: /bin/bash -c 'sudo -u postgres psql =two= <<< "create extension if not exists hstore;"'
- exec: /bin/bash -c 'sudo -u postgres psql =two= <<< "create extension if not exists pg_trgm;"'
- exec: sudo -u postgres createdb =three= || exit 0
- exec:
stdin: |
grant all privileges on database =three= to discourse;
cmd: sudo -u postgres psql =three=
raise_on_fail: false
- exec: /bin/bash -c 'sudo -u postgres psql =three= <<< "alter schema public owner to discourse;"'
- exec: /bin/bash -c 'sudo -u postgres psql =three= <<< "create extension if not exists hstore;"'
- exec: /bin/bash -c 'sudo -u postgres psql =three= <<< "create extension if not exists pg_trgm;"'
After that,
./launcher rebuild app
or
./launcher rebuild data
./launcher rebuild web_only