docker-compose + self hosting post

How to self host EASILY many things on you own server

I'm new in the hosting world, but I know that self hosting could be very painful if it's not done properly. So I wanted to build a system that prevent (some) failure and I didn't want to have my configuration files and my applications all over my server system. So I've decided to use Docker with docker-compose to make my life easier.

With that said, let's dig in !

The reverse proxy

Because I wanted to have many applications on my server, I have to set up a reverse proxy. My flatmate said to me: "Just grab an nginx and it'll be easy". After some hours of configuration and an epic battle with the cert-bot in order to get my SSL certificates, I've stopped. It was definitely not the easy way.

After few research I've found a nginx reverse proxy with a cert-bot and the promises of easy deployment. So I've tried. And it was easy. Not easy, but VERY VERY EASY to use. Let's look at my `reverse-proxy/docker-compose.yml':

version: '2'

services:
  nginx-proxy:
    image: jwilder/nginx-proxy:alpine
    ports:
      - "80:80"
      - "443:443"
    networks:
      - proxy
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - /etc/nginx/certs:ro
      - /etc/nginx/vhost.d
      - /usr/share/nginx/html
    restart: always
  ssl-compagnion:
    image: jrcs/letsencrypt-nginx-proxy-companion:v1.9
    networks:
      - proxy
    volumes:
      - /etc/nginx/certs:rw
      - /var/run/docker.sock:/var/run/docker.sock:ro
    volumes_from:
      - nginx-proxy
    restart: always

networks:
  proxy:

Well, just basic stuff. I've just declare a new network called proxy so I can call it in other docker-compose.yml. I enter docker-compose up -d in my terminal and my reverse-proxy is running without almost any configuration !

Miniflux

I've just wanted to have my own RSS aggregator. I've found one written in go with a good documentation: miniflux. Here is my docker-compose.yml.

version: '3'

services:
  app:
    image: miniflux/miniflux:2.0.11
    expose:
      - "8080"
    depends_on:
      - db
    networks:
      - proxy
      - miniflux
    environment:
      - DATABASE_URL=postgres://XXXXXXXXXXXXXXXXXX:XXXXXXXXXXXXXXXXXX@db/miniflux?sslmode=disable
      - RUN_MIGRATIONS=1
      - VIRTUAL_HOST=rss.livda.fr
      - VIRTUAL_PORT=8080
      - LETSENCRYPT_HOST=rss.livda.fr
      - LETSENCRYPT_EMAIL=mail@gmail.com
    restart: always
  db:
    image: postgres:10.2
    environment:
      - POSTGRES_USER=XXXXXXXXXXXXXXXXXX
      - POSTGRES_PASSWORD=XXXXXXXXXXXXXXXXXX
    networks:
      - miniflux
    restart: always

networks:
  miniflux:
  proxy:
    external:
      name: reverse-proxy_proxy

The only thing that is not present in the miniflux documentation are those environment variables:

  • VIRTUAL_HOST=rss.livda.fr
  • VIRTUAL_PORT=8080
  • LETSENCRYPT_HOST=rss.livda.fr
  • LETSENCRYPT_EMAIL=mail@gmail.com

They are here for the reverse proxy and it's companion. The VIRTUAL_PORT is optional if your container expose the port 80.

With all of that, I've just run docker-compose up -d in the miniflux folder, I've edited my DNS record to make rss.livda.fr goes to my public IP and ... It worked ! That's all.

All my other applications are exposed like that, so I don't have to manager my SSL certificates, neither my nginx configuration with multiple vhost. I just put 3 or 4 environment variables, and my new application/website is online with a nice HTTPS url.

Categories: self-hosting

Tags: docker-compose, reverse-proxy, ssl