I didn't want to launch the blog without comments, but I did it anyway, because I'd started working on a DIY self-hosted solution and didn't want to use disqus or any of the other paid / ad-driven / data mined offerings.

Discourse looked awesome, but proved overly complex for my needs and difficult to set up.

It was a fun project, done very simply. I suppose it is not truely self-hosted because it depends on google's Captcha and Gmail, but hey, it works, and since the data is all public anyway, I don't mind using those services.

If you are curious, the email address that you type in will not be stored on my server, it is simply hashed and discarded. Yes, yes, I know, the MD5 used by gravatar is incredibly weak. But, email isn't required to post anyway. You could still get a consistent identity by typing in a short password instead if you wish.

In the future I will probably clean up the project and fully open source it. For now, a lot of stuff is hard-coded and unclean. It was a hack mostly developed in a few days. The source code is here: http://git.sequentialread.com/forest/sequentialread-comments

The comments api can be run via docker, with the provided Dockerfile. I run it together with the rest of my services using docker-compose.

The relevant part of my docker-compose.yml file looks like this:

nginx:
  image: jwilder/nginx-proxy
  ports:
    - "80:80"
  volumes:
    - /var/run/docker.sock:/tmp/docker.sock:ro
	
comments:
  image: forestj/sequentialread-comments
  volumes:
    - /dockerdata/comments/data:/usr/src/app/data
  expose:
    - "2369"
  environment:
    VIRTUAL_HOST: comments.sequentialread.com
    VIRTUAL_PORT: 2369
    RECAPTCHA_SECRET_KEY: xxxxxxxxxxxxxxxxxxx
    GMAIL_USER: xxxxxxxxxxxxxxxxxxx
    GMAIL_PASSWORD: xxxxxxxxxxxxxxxxxxx
    EMAIL_NOTIFICATION_TARGET: xxxxxxxxxxxxxxxxxxx

jwilder/nginx-proxy will ask docker for information about containers, looking for VIRTUAL_HOST and VIRTUAL_PORT environment variables, and then configure its own internal nginx instance with virtual hosts for each container.

So nginx acts as a reverse proxy and only allows connections on port 80. Each container still gets its own port internally via expose, but externally, its all port 80 (and 443 once I get my SSL cert set up!).

forestj/sequentialread-comments is a docker image I built from the Dockerfile. The volumes here mean that a folder inside the container is treated like a mounted disk, but it is "mounted" to a folder outside of the container. That means that I can nuke the container and re-create it without deleting all of my blog comments.

Comments