Running other websites on the same machine as Discourse

If you want to run other websites on the same machine as Discourse, you need to set up an extra NGINX or HAProxy proxy in front of the Docker container.

This guide assumes you already have Discourse working - if you don’t, it may be hard to tell whether or not the configuration is working.

Install nginx outside the container

First, make sure the container is not running:

cd /var/discourse
./launcher stop app

Then install nginx from its PPA (Ubuntu ships by default a very old version, 1.4.0):

sudo add-apt-repository ppa:nginx/stable -y
sudo apt-get update && sudo apt-get install nginx

Change the container definition

This is where we change how Discourse actually gets set up. We don’t want the container listening on ports - instead, we’ll tell it to listen on a special file.

Change your /var/discourse/containers/app.yml to look like this:

# base templates used; can cut down to include less functionality per container templates:
  # - "templates/cron.template.yml" # cron is now included in base image
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/sshd.template.yml"
  - "templates/web.template.yml"
  # - "templates/web.ssl.template.yml" # remove - https will be handled by outer nginx
  - "templates/web.ratelimited.template.yml"
  - "templates/web.socketed.template.yml"  # <-- Added
# which ports to expose?
# expose: comment out entire section

Be sure to remove the next line containing

- "80:80" # fwd host port 80 to container port 80 (http)

Create an NGINX ‘site’ for the outer nginx

For an HTTPS site, put this in /etc/nginx/sites-enabled/discourse.conf, making sure to change the server_name:

server {
    listen 80; listen [::]:80;
    server_name;  # <-- change this

    return 301 https://$host$request_uri;

server {
    listen 443 ssl http2;  listen [::]:443 ssl http2;
    server_name;  # <-- change this

    ssl_certificate      /var/discourse/shared/standalone/ssl/ssl.crt;
    ssl_certificate_key  /var/discourse/shared/standalone/ssl/ssl.key;
    ssl_dhparam          /var/discourse/shared/standalone/ssl/dhparams.pem;
    ssl_session_tickets off;

    http2_idle_timeout 5m; # up from 3m default

    location / {
        proxy_pass http://unix:/var/discourse/shared/standalone/nginx.http.sock:;
        proxy_set_header Host $http_host;
        proxy_http_version 1.1;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Real-IP $remote_addr;

For an HTTP-only site:

server {
	listen 80; listen [::]:80;
	server_name;  # <-- change this

	location / {
		proxy_pass http://unix:/var/discourse/shared/standalone/nginx.http.sock:;
		proxy_set_header Host $http_host;
		proxy_http_version 1.1;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header X-Forwarded-Proto $scheme;
		proxy_set_header X-Real-IP $remote_addr;

Make sure that the default site is either disabled or has the correct server_name set.

Then, in a shell:

# Make sure that Discourse isn't running
/var/discourse/launcher stop app || true

# test configuration
sudo nginx -t
# Important: If nginx -t comes back with an error, correct the config before reloading!
sudo service nginx reload

# Rebuild the container to apply changes
/var/discourse/launcher rebuild app

Create your other sites

You’re done with the Discourse section!

Make other NGINX “sites”, then link and enable them, as in the last step above.

Port already in use, what to do?
Best way to install Discourse on my server?
Multisite configuration with Docker
Installing Discourse Under Nginx
Nginx configuration for discourse
[Solved] Help setting other websites on the same DigitalOcean droplet
Setting up nginx for use with Discourse
Can't make Discourse accessible through Apache
Using Multiple Websites with Nginx + Discourse
Nginx + discourse
Error: listen tcp bind: address already in use
Faster rebuilds?
Discourse + Nginx reverse Proxy
Using Discourse With Other Sites on Same Droplet
A better "site not available" page
Wordpress and Discourse in a single droplet
NGINX proxy in front of the Docker container.errors
Disable direct access with port (nginx)
Discourse not working through separate nginx docker
Adding an offline page when rebuilding
Wordpress and discourse on the same server
Nginx configuration for discourse
Installing docker on an already running web server?
Port already in use, what to do?
Problem with discourse in a subfolder
Which performance is better if discourse or phpbb hosts on a same vps?
NGINX proxy in front of the Docker container.errors
Custom Intro page for discourse
Broken images inside posts
Discourse doesn't deliver webpages, fresh install on Linode Ubuntu 14.04
Starting a second Discourse forum on the same VPS
Setting up Discourse on a VPS with other sites
Multiple container setup problems
403 forbidden after installation
Nginx configuration for discourse
Launcher rebuild app failing: repository name must be lowercase [SOLVED]
Can Discourse ship frequent Docker images that do not need to be bootstrapped?
Can Discourse ship frequent Docker images that do not need to be bootstrapped?
IP Spoofing Attack
Error while doing discourse setup
Run other php script
Where to put custom content?
Domain names pointing with shared AWS instance
How to install discourse on hosting?
Can not visit again after port change to container/app/yml
Error connecting to Redis
Advice on integrating into a Docker-Compose setup?
Installation on v-server as a subfolder with other services in subfolders using apache
Installation on v-server as a subfolder with other services in subfolders using apache
Installation on v-server as a subfolder with other services in subfolders using apache
Wanting to run Discourse alongside apache
Install Order on CentOS
Add subdomain exception to nginx to host another site on same host
Docker0 Missing (OpenVZ)
[SOLVED] How do you install Discourse and Ghost on the same server using Nginx?
Domain names pointing with shared AWS instance
Nginx rate limiting outside of container - any tips?
Sandbox and test discourse on host?
Best approach for test and production instance of discourse
Mixed content for icon using http on https setup
How do I do what I did in htaccess in nginx?
How do I do what I did in htaccess in nginx?
CDN causes white screen
[SOLVED] How do you install Discourse and Ghost on the same server using Nginx?
Using a certificate when Discourse is installed behind a reverse proxy
Can I run wordpress in the same VPS with a second IP?
Using a certificate when Discourse is installed behind a reverse proxy
Generals Subfolder recommendations and tips
Wordpress + Discourse using Digital Ocean and Serverpilot
Unsure About How to Start a Website Project
Install on vps problem?
Install discourse alongside WordPress in a dedicated server
Can't log in on Android Chrome
Installation Help required
Installed OK. Working fine for one day. Suddenly stopped working
SSL received a record that exceeded the maximum permissible length
Changing Max Attachment Size
Moved from PluXml and phpBB to Wordpress and Discourse, my all-new experience :tada:
Discourse site loads via IP but via domain only header
Configuring Website with Discourse and Wordpress?!
Site doesn't launch after bringing back nginx reverse proxy
Looking for a tutorial on discourse/wordpress 1 machine install
Discourse, Docker, Container question
Blank pages, 500 errors and no logs
Remote users IPV6 address shows as localhost
I have a VPS and it nginx installed and now i want install discourse in subdomain how i can do that
Not able to send email Net::ReadTimeout
Adding an offline page when rebuilding
[SOLVED] 502 Gateway Error on Nginx?
URLs for avatars & emoticons adding :80 to the end of the domain
OpenID Connect extension not creating new Discourse users
Installed discourse on a server that already runs a webserver, domain just redirects to subdomain
Installation fails on my Debian server
After upgrade, Connection refused while connecting to upstream
Discourse new Base Image
How to install Discourse on Plesk?
Straightforward direct-delivery incoming mail
Discourse with Traefik 2.0
How to add a subdomain on a different droplet/server?
More than one site as different container running on the same do server
Can I have two domains pointing towards the same IP address without redirect?
Postgres already running
Install Discourse on a droplet with WordPress served by Apache?
OpenID Connect Authentication Plugin
How to collect all static assets (js, css) used by discourse
Avatar, Site Logos, and Cert Errors
Can I Host More Than 1 Thing On My VPS?
Discourse won't start because port 80 is in use
How to make Discourse coexist with nginx on a Debian 9 server?
Is it possible the certbot inside the container can affect new certbot outside it?
Prometheus exporter plugin for Discourse
Discourse + web server. Possible or better to avoid?
Help for installing Discourse alongside Apache2
502 Gateway Error: Discourse Installation with SSL form Cloudflare
Installation of Wordpress and Discourse same domain same server?
I can't set nginx: [emerg] cannot load certificate "/var/discourse/shared/standalone/ssl/ssl.crt": BIO_new_file() failed
Discourse with other websites, SMTP issue: End of file reached
Setting up Discourse on a machine with existing Nginx
Links in emails are using http instead of https
Google auth error
Anything else on same Digital Ocean droplet as Discourse?
Multiple discourse installation on single droplet
Global rate limits and throttling in Discourse
Multiple discourse installation on single droplet
Checking domain name fails behind NGINX proxy
OpenID Connect Authentication Plugin
Changing force_https does not update the url of uploaded images causing a mixed content warning
Discourse on LAMP
Error: Slow down, too Many Requests from this IP Address
Can I install Discourse on existing server that uses Nginx?
Multisite configuration with Docker
Multiple Standalone containers instead of multisite?
Discourse socketed: Nginx in front of discourse: no IP adresses
Address already in use during setup
Address already in use during setup
How should I enable letsencrypt while discourse is beside other websites
How to Docker+Discourse and Apache too?
Help understanding the structure of using discourse + static website
Discourse not showing up at specified hostname
Success - New Multisite Install on Dedicated server using ServerPilot, Nginx and Apache
Error in installing
Install Problem on a Custom Server with Nginx
Regenerating LetsEncrypt keys from behind nginx
[Solved] Dev instance with nginx: topic preview not working
Installation on Ubuntu 14.04 LTS + Apache 2 + Plesk 12
Webhooks/Sidekiq issue on dev instance
Discouse passes localhost uri as oauth redirect_uri
What is the recommended practice for WordPress and Discourse on the same server?
Redirecting old forum URLs to new Discourse URLs
Nginx + discourse
Discourse with zpanel
Backup uploads terribly slow
How to install wordpress in the Secondary directory?
How should I enable letsencrypt while discourse is beside other websites
Moving to subdomain
Deploying discourse on server already running another rails app
How do I install multiple discourse forums on a root server?
How to upload files in root directory?
WordPress, Discourse and Local SMTP Server
Default app.yml file anywhere?
Oauth2 redirect_uri uses HTTP when my forum is using HTTPS
502 Bad gateway error after switching to SSL
Wrong sending domain used
Wrong sending domain used
Wordpress integration with mini forums
How can one install a panel with discourse?
Bad gateway when trying to use SSL
Adding an offline page when rebuilding
Accessing to the database from outside the container
How to change the port from docker - help
Discourse stopped working after installing Plesk
Discourse blocking with password reset
Difference between socket- and port-based connection to outer NGINX?
Nginx configuration for discourse
Custom Layouts Plugin
Setting up HTTPS support with Let's Encrypt
Setting up HTTPS support with Let's Encrypt
Setting up Discourse on a VPS with other sites
Put forum under sub-domain and have website

The guide in the first post is great and, on the whole, still works just fine :sunny:

There are three things worth noting:

  1. I initially missed some of the app.yml changes. There are 3 things you need to change in your app.yml. If you miss any of these things it won’t work:

    1. Comment out all ssl templates in the templates. If you are using letsencrypt you will have two:
      # - "templates/web.ssl.template.yml"
      # - "templates/web.letsencrypt.ssl.template.yml"
    2. Add a socket template:
      - "templates/web.socketed.template.yml" 
    3. Comment out all exposed ports:
      # - "80:80"   # http
      # - "443:443" # https
  2. As others mentioned, I had to change the ssl cert and key names in the discourse.conf:

    ssl_certificate      /var/discourse/shared/standalone/ssl/;
    ssl_certificate_key  /var/discourse/shared/standalone/ssl/;
  3. Turns out my site didn’t have a dhparams.pem key (dh stands for Diffie Hellman, there’s some good explanations of what this is here). You can generate this yourself:

    openssl dhparam -out /var/discourse/shared/standalone/ssl/dhparams.pem 2048

Some other things you may find useful:

  • sudo netstat -tulpn: This will tell you what ports are being used

  • /var/log/nginx/error.log: Is the location of the nginx log on ubuntu. This will tell you what the error is when you get a 502 Bad Gateway error.

  • You may finish a ./launcher rebuild app, excitedly go to your domain to see if it worked and be greeted with a depressing 502 Bad Gateway error. Before giving up in frustration, try restarting nginx one more time:

    sudo service nginx restart

    This clinched it for me.

Now my sandbox is using nginx outside the container (although I haven’t added the extra website yet).


Hi, I’m a bit puzzled.
I have a server with several web applications (Wordpress).

When I try to Install Discourse, I got this message:
root@canapin:/var/discourse# ./discourse-setup
Port 80 appears to already be in use.

This will show you what command is using port 80
nginx   16526  root   26u  IPv4 2931156      0t0  TCP (LISTEN)
nginx   17035 nginx   26u  IPv4 2931156      0t0  TCP (LISTEN)

If you are trying to run Discourse simultaneously with another web
server like Apache or nginx, you will need to bind to a different port


This topic and several others I read ask to edit containers/app.yml as a first step, but I have no such a file in my containers directory.
What am I supposed to do?

If I’m not mistaken your app.yml is generated after you have successfully bootstrapped.

You may have to stop your running webserver (apache/nginx/whatever) until discourse is installed and you have modified app.yml to use either an alternative port or an alternative method e.g. sockets to make your forum run behind a proxy i.e. your webserver.


The app.yml is generated during discourse-setup - you can bootstrap/rebuild separately by following the old Docker install instructions.


From the official installation guide, on the /discourse-setup part:

This will generate an app.yml configuration file on your behalf, and then kicks off bootstrap.

And I can’t go past the ./discourse-setup part since the installation stops because of the port thing.

I’ll try to stop my webserver as you suggest.

Just stop the webserver beforehand and complete the ./discourse-setup script. You’ll have an app.yml file in the containers folder when the script completes successfully.


Yes I stopped apache and nginx and the install is working, thanks guys. :slight_smile:

1 Like

Well I then followed the steps on this thread and:
from /var/discourse/containers/app.yml,
- "templates/cron.template.yml" > I didn’t have this line and I didn’t add it since this guide doesn’t tell to add it.

Then the guide tells:

# expose: comment out entire section

And then

Be sure to remove the next line containing

- "80:80" # fwd host port 80 to container port 80 (http)

So, should I remove nor comment this line since it is from the # expose section? I commented it by the way.

For an HTTPS site, make /etc/nginx/sites-enabled/discourse.conf look like this:

I didn’t have such a file and I created it. Is the file supposed to be already here after installing Discourse, or is it normal that I had to create it?

Then I followed the remaining steps and I didn’t forget to restart nginx, but my Discourse installation doesn’t show up (I created my subdomain from Plesk):

Finally, I see that this guide mention:

This guide assumes you already have Discourse working

But what if we don’t have Discourse working, especially because we already have other web apps running? Is there another guide intended for this configuration?


Try searching for “offline page while rebuilding” guide here on meta and observe it’s nginx configuration.

1 Like

Thank you. I don’t have any error message of any kind, my subdomain just shows up the default home page for any new subdomain created from plesk.

That is because it can’t reach discourse which is trapped inside docker until you show it the way to interact with outside world.

1 Like

Hi, I started back from the beginning and I have Discourse working now :slight_smile:; I just need to read and apply this guide again, but still, I have quick questions before doing so. I don’t want to mess up.
I don’t have the /etc/nginx/sites-enabled/discourse.conf file. Is it supposed to be that way and do I have to create it?
Also the -templates/cron.template.yml" line in app.yml file which I don’t know if I have to add it or not since it’s not present in my own config file.


If it’s not there and you don’t know the use of it then don’t bother about it.

1 Like

Thank you again for your reply.

From what I see, the /sites-enabled/ directory is not included in my nginx.conf. However, this file contains :

include /etc/nginx/conf.d/*.conf;

So I created a discourse.conf file in this /conf.d/ directory. My discourse.conf contains among other lines these copy-pasted from the guide:

    ssl_certificate      /var/discourse/shared/standalone/ssl/ssl.crt;
    ssl_certificate_key  /var/discourse/shared/standalone/ssl/ssl.key;
    ssl_dhparam          /var/discourse/shared/standalone/ssl/dhparams.pem;

nginx tells me that these files don’t exist.
I replaced ssl.crt by and ssl.key by as I these ones exist. But I can’t find any dhparams.pem.

Any idea?

If you’ve installed letsencrypt certificate then dhparams.pem should be generated in your working directory /etc/letsencrypt you can copy it from there.


Thank you, I’ve been able to get this file.

I think I’m very close to having Discourse working :slight_smile: I had no error message whatsoever which is a new thing compared to my previous config attempts and I’ve been able to start the app after making all this configuration.

However, still shows the default page generated by Plesk.

So I guess I’m missing a little something somewhere…

1 Like

Hmm … That sums it down. You may have to stop nginx from proxying requests for to apache2 and rather proxy them to the socket instead.

I’d hint on modifying the default nginx config (the other config in the conf.d folder) to be domain agnostic and specifically not handle requests for subdomain.

1 Like


I thought that’s what the checkbox unchecked would do since it mentions “turn off to stop using Apache”.
The only other files that I have in my conf.d folder are ssl.conf and zz010_psa_nginx.conf, the latter containing:

include /etc/nginx/plesk.conf.d/server.conf;
include /etc/nginx/plesk.conf.d/webmails/*.conf;
include /etc/nginx/plesk.conf.d/vhosts/*.conf;
include /etc/nginx/plesk.conf.d/forwarding/*.conf;
include /etc/nginx/plesk.conf.d/wildcards/*.conf;

I’m not a plesk user so I don’t know much details about how it handles request but if nginx is responsible for everything after that checkbox is unchecked then it should definitely read the discourse.conf but looks like it’s not reading that.

I’ve gone through your configurations and both look okay so I don’t have much to say. I’d like to know if you have some way to alter configurations inside of your plesk panel. if so, try to edit the configuration from there.

1 Like