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.

If you have not already, please read the Advanced Troubleshooting with Docker guide, as it covers the basics on the separation between host and 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"
  - "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 on;
    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
Error: listen tcp bind: address already in use
[Solved] Help setting other websites on the same DigitalOcean droplet
Can't make Discourse accessible through Apache
Setting up nginx for use with Discourse
Discourse + Nginx reverse Proxy
A better "site not available" page
Disable direct access with port (nginx)
NGINX proxy in front of the Docker container.errors
Nginx configuration for discourse
Nginx + discourse
Using Multiple Websites with Nginx + Discourse
Using Discourse With Other Sites on Same Droplet
Discourse not working through separate nginx docker
Faster rebuilds?
Wordpress and Discourse in a single droplet
Which performance is better if discourse or phpbb hosts on a same vps?
Installing docker on an already running web server?
Adding an offline page when rebuilding
Port already in use, what to do?
NGINX proxy in front of the Docker container.errors
Custom Intro page for discourse
403 forbidden after installation
IP adress for two web servers
Problem with discourse in a subfolder
Wordpress and discourse on the same server
Nginx configuration for discourse
Setting up Discourse on a VPS with other sites
Preview pane uses local docker container IP address
Starting a second Discourse forum on the same VPS
Discourse doesn't deliver webpages, fresh install on Linode Ubuntu 14.04
Launcher rebuild app failing: repository name must be lowercase [SOLVED]
Add subdomain exception to nginx to host another site on same host
Error install. Help please!
How do I do what I did in htaccess in nginx?
How do I do what I did in htaccess in nginx?
Advice on integrating into a Docker-Compose setup?
How to install discourse on hosting?
CDN causes white screen
Generals Subfolder recommendations and tips
Multisite configuration with Docker
Multiple Standalone containers instead of multisite?
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
[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
Broken images inside posts
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
Deploying discourse on server already running another rails app
How to upload files in root directory?
WordPress, Discourse and Local SMTP Server
Default app.yml file anywhere?
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
Unable to start docker service (latest step)
Difference between socket- and port-based connection to outer NGINX?
Nginx configuration for discourse
Advanced Troubleshooting with Docker
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
How to move my Discourse instance LOCALLY? Or at least the big files?
Put forum under sub-domain and have website
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
E-mail didn't delivered in the easyengine(nginx) proxy mandrill environment
Run other php script
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
Docker0 Missing (OpenVZ)
Sandbox and test discourse on host?
Error while doing discourse setup
Email configuration debugging
Can I run wordpress in the same VPS with a second IP?
Best approach for test and production instance of discourse
Wanting to run Discourse alongside apache
How to add a subdomain on a different droplet/server?
[SOLVED] How do you install Discourse and Ghost on the same server using Nginx?
Mixed content for icon using http on https setup
Install Order on CentOS
Install Problem on a Custom Server with Nginx
Setting up Discourse on a machine with existing Nginx
Using a certificate when Discourse is installed behind a reverse proxy
Using a certificate when Discourse is installed behind a reverse proxy
[SOLVED] How do you install Discourse and Ghost on the same server using Nginx?
Discourse must be the only software on the server?
429 too many connections issue with NGINX in front of NGINX
URLs for avatars & emoticons adding :80 to the end of the domain
Regenerating LetsEncrypt keys from behind nginx
Discourse socketed: Nginx in front of discourse: no IP adresses
After upgrade, Connection refused while connecting to upstream
Installation fails on my Debian server
Installed discourse on a server that already runs a webserver, domain just redirects to subdomain
OpenID Connect extension not creating new Discourse users
Discourse site loads via IP but via domain only header
Changing Max Attachment Size
How do I install multiple discourse forums on a root server?
Can I install Discourse on existing server that uses Nginx?
Problem installing, with nginx
Adding an offline page when rebuilding
Not able to send email Net::ReadTimeout
I have a VPS and it nginx installed and now i want install discourse in subdomain how i can do that
Remote users IPV6 address shows as localhost
Blank pages, 500 errors and no logs
Discourse, Docker, Container question
Site doesn't launch after bringing back nginx reverse proxy
Configuring Website with Discourse and Wordpress?!
SSL received a record that exceeded the maximum permissible length
Installation Help required
Oauth2 redirect_uri uses HTTP when my forum is using HTTPS
Moved from PluXml and phpBB to Wordpress and Discourse, my all-new experience :tada:
Installed OK. Working fine for one day. Suddenly stopped working
Can't log in on Android Chrome
Install discourse alongside WordPress in a dedicated server
Where to put custom content?
Domain names pointing with shared AWS instance
Domain names pointing with shared AWS instance
Site & SSH inaccessible after Discourse installation
Moving to subdomain
Install on vps problem?
Serving public files
Unsure About How to Start a Website Project
Wordpress + Discourse using Digital Ocean and Serverpilot

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?

1 Like

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