Self-hosting with Docker: The definitive handbook
This self-hosting handbook’s goal is to teach you how to use a virtual private server (VPS) to self-host a variety of mostly free (and sometimes paid) websites, applications, and services.
If you’re new to self-hosting, scroll down for an introduction. If you’re ready to get started, you can hop straight down into the Self-hosting quickstart: Docker, domains, and DNS section.
In this handbook, I’ll show you how to set up your VPS to use Docker containers, configure your domain and its DNS communicate with your VPS, build a “reverse proxy” with Nginx, encrypt everything with SSL certificates from Let’s Encrypt, and use
docker-compose to create an entire self-hosted infrastructure that’s as extensive as you want.
Table of contents
- Self-hosting quickstart: Docker, domains, and DNS (look below!)
- A docker-compose tutorial
- Using docker-compose to add web apps
- Self-hosting administration
- Self-hosting Nextcloud with Docker
Self-hosting is an old term that’s been around computing for a long time. In recent years, given the acceleration of Software as a Service (SaaS) web applications, we’ve seen the interest around self-hosting grow significantly.
You are self-hosting when you put a web application on a VPS you own instead of relying on another business to host the application for you.
For a comprehensive explanation of self-hosting, visit What the Heck is Self-Hosting? A Guide to ‘Owning’ Your Webapps.
I still don’t know what self-hosting is Expand
You can visit WordPress.com and have a
yourname.wordpress.com blog in a matter of minutes. WordPress.com is hosting your blog for you, as they control the web app, the server, and the data.
Or, you can visit WordPress.org and download a copy of the WordPress source code for yourself. You can install WordPress on top of a web server and self-host your blog. In this case, you control the web app, the server, and the data.
Today, you can self-host far more than blogs. Be sure to check out our ultimate guide to self-hosted alternatives for dozens of ideas.
About SSD Nodes
We’re the first honest-value cloud computing platform. Our 16GB RAM VPS, running on a KVM platform, is only $[price]/mo when billed annually. That’s around 90% lower than Digital Ocean, Linode, or Vultr, with all the same power and resiliency.
Continue to a comprehensive self-hosting handbook
You can find the first steps to this self-hosting handbook below. The other pages will be published and linked to over the course of a few weeks, beginning on June 19, 2018.
Be sure to bookmark this guide and follow us on Twitter to get updates and check back when new sections are relevant to your self-hosting needs.
Self-hosting quickstart: Docker, domains, and DNS
This is the first page of an in-progress handbook.
- Let’s make this easy. You need a VPS with an operating system/kernel on which you can install Docker. Once we’re working primarily with Docker/docker-compose, all the steps are independent of your operating system.
- You also need a registered domain name with a registrar that allows you to change DNS settings.
Get up to 80GB of free NVMe bonus storage!
For a limited time, get a 50% storage bonus (up to 80GB) with any Performance VPS plan featuring NVMe. Load websites up to 10x faster. Blaze through database applications. And deliver a silky smooth user experience. But what will 10x IOPS performance cost you?
Right now, get 24GB RAM with 180GB of hyperspeed NVMe storage for just $12.99/month.
Install Docker and docker-compose
Installing Docker used to be a more involved process, but the maintainers now offer an installation script you can download and execute in a single command. Type in the following into your VPS, and you’ll have a functional Docker installation in a matter of minutes.
$ sudo curl -sS https://get.docker.com/ | sh
The script checks your operating system, downloads and installs package repositories, installs Docker itself alongside any dependencies, and starts the Docker service.
Let’s quickly hammer out a few customizations that will make using Docker a little easier. We’ll start the Docker service and allow running Docker as a non-
sudo user. See our getting started with Docker tutorial for details.
$ sudo systemctl enable docker $ sudo groupadd docker $ sudo usermod -aG docker $USER
Log out of your VPS and back in again, and you’ll be able to run
docker commands with your normal user.
To install docker-compose, type in the following commands to download the latest version of docker-compose and set the executable flag so that you can run it from the terminal on your VPS.
$ sudo -i # curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose # chmod +x /usr/local/bin/docker-compose
Now what you have the necessary software installed on your VPS, it’s time to take a step back and
Register your domain(s)
Self-hosting works best if you have a domain name at which you, or others, can access your services and content. Without a domain name, the only method of accessing your VPS will be via IP address and port numbers. No one wants to type
https://18.104.22.168:4545 into their browser’s address bar.
No matter which registrar you choose, make sure that you can change both nameserver and DNS settings once you register your domain.
From this point on, I’ll refer to your domain as
SUBDOMAIN.DOMAIN.TLD. For example, this blog is at
blog is the
ssdnodes is the
com is the
Create a Cloudflare account
This step is optional but recommended. If you’d prefer not using Cloudflare to manage your DNS, you can skip down to the Set up your DNS step and adopt the recommendations to your registrar’s DNS dashboard.
If you don’t already have a Cloudflare account, go ahead and create one, choosing the free plan as you go through the steps. It will be more than enough for self-hosting services that you, friends, or family will use on a regular basis.
When prompted to add a site to your new Cloudflare account, enter in the domain name you registered in the previous step.
You’ll then be asked to change your domain’s nameservers, as seen in the screenshot below.
In a new tab, open up your registrar’s dashboard and navigate to the nameserver configuration area. Replace the existing nameservers with the ones Cloudflare has assigned to your site. Don’t use the nameservers in the above image, as Cloudflare will likely assign different servers to you.
This is what it looks like on Namecheap, my current registrar of choice:
Once Cloudflare has added your domain/site to its infrastructure, nameserver propagation begins and can take some time to go into effect. Give yourself a break from the computer and take your dog on a walk. Or take yourself on a walk. Your heart will thank you either way.
Set up your DNS via Cloudflare
In this step, we’ll set up our DNS so that the domain you registered will send traffic toward your server, along with any subdomains you want to use. If you’re using another DNS service, follow the directions on the registrar’s DNS settings page.
Click on the
DNS tab in the Cloudflare dashboard and look at the first DNS record in the table. An
A record for the name
DOMAIN.TLD will have the value of
points to IP_ADDRESS. That IP address probably leads to a parking page that your registrar puts up by default. Replace the IP address with that of your VPS.
Status column, you’ll see an orange cloud icon. Click it, and it will turn gray, disabling Cloudflare’s HTTP proxy/CDN, but keeping the DNS settings in place. You must disable the HTTP proxy for your reverse proxy to work properly. Don’t be like me and spend days trying to figure out why you’re getting redirect loops.
Why can’t I use Cloudflare’s CDN? Expand
There is an issue with
nginx-proxy and Cloudflare in which Cloudflare and the server are unable to coordinate whether to communicate over HTTP or HTTPS. Because of this miscommunication, the server sends HTTPS traffic back while Cloudflare is expecting HTTP traffic. Cloudflare then continues to re-send the same request, which results in a redirect loop.
Disabling the HTTP proxy is one solution. You can also try editing the Nginx configuration, but I have not yet tested that solution.
I don’t think the CDN offers much of a benefit for most self-hosted applications, and thus I’m okay with it being disabled. I’ll update this step when I can figure out a solution that allows you to use the Cloudflare CDN.
Try out your domain for the first time
Wait a few minutes for the DNS changes to go into effect, and give your new DNS a try with SSH.
Before, you probably logged into your VPS using its IP address.
$ ssh [email protected]_ADDRSESS
Now, you can replace the IP address with your domain.
$ ssh [email protected]
That’s pretty neat! No more trying to remember your IP address every time you need to log in.
Add your subdomains
Now is an excellent opportunity to configure Cloudflare’s DNS settings with any other subdomains you would like to set up.
Let’s go ahead and add a
docker subdomain, as one of the first services we’ll add to our self-hosted stack is Portainer, an excellent management dashboard for Docker containers.
In the input area just above the table of DNS records, select an
A record from the drop-down (it should be selected by default), type
docker into the
Name input, and then your VPS’ IP address into the
IPv4 address field. Leave
Automatic TTL enabled, and click the cloud icon so that it turns gray. You can then click
Add Record to enable it.
Once we have our reverse proxy and Portainer running, you’ll be able to access it via
Follow the same process for any other subdomains you know you’re going to use in the future. If you’re unsure, don’t worry—you can add more DNS records at any time.
Table of contents
Like what you saw? Subscribe to our weekly newsletter.