Ghost has one of most beautiful interface for both writing and reading post. The only downside that I found was that to leverage the full benefit I had to pay up. Of course Wordpress is an option to self host but only recently did I become aware that Ghost can be self hosted as well and has docker images that I could use.
In this post I will try my best to explaining how I got mine up and working
Prerequisites
I will assume that you have the following already set up
A linux server
Docker installed within it
Cloudflare tunnel or some way of exposing your service to the outside world
Let's start with the docker-compose.yaml
services:
ghost:
image: ghost:latest
container_name: ghost-server
environment:
- url=https://blog.nikhildev.com
- mail__transport=SMTP
- mail__options__host=smtp.eu.mailgun.org
- mail__options__port=587
- mail__options__auth__user=<your_auth_user_email>
- mail__options__auth__pass=<the_password_from_mailgun>
- mail__from=blog@example.com #This probably will need verification
- database__client=mysql
- database__connection__host=db # Name of the service from below
- database__connection__user=ghost
- database__connection__password=ghost # You can choose a better password
- database__connection__database=ghost
volumes:
- /docker_volumes/ghost/content:/var/lib/ghost/content # I prefer to map a different location for the safe keep of the data. The /docker_volumes is mirrored on zpool for redundancy
restart: unless-stopped
depends_on:
- db
ports:
- "2368:2368"
db:
image: mysql:9
container_name: ghost-db
restart: always
networks:
- default
volumes:
- /docker_volumes/ghost/db/data:/var/lib/mysql
environment:
- MYSQL_DATABASE=ghost
- MYSQL_USER=ghost
- MYSQL_PASSWORD=ghost
- MYSQL_ROOT_PASSWORD=ghost
- MYSQL_ROOT_HOST=172.*.*.* ## Ensures the Docker network has access
In the above docker compose files we are defining two service. ghost-server
is the main application and db
is a mysql instance that it would be using.
Now, if you want the newsletter part of ghost be available to you, I would highly recommend signing up with something like Mailgun which has pretty generous free tier. Once you have signed up, use the generated credentials in ghost. Here is a great article on it https://brightthemes.com/blog/ghost-mailgun-config
I'm sticking to exposing the default port of the service as in my entire stack there are no conflicting ones.
The db
service is vanilla mysql without any bells and whistles. The official guide suggests using mysql 8 but I've tried this with mysql 9 and it works just fine. We simply are setting the credentials before hand to be made accessible to the ghost instance. Even here I prefer to mount a redundant local directory just for safe keeps.
And that's it. Go ahead and run the container with docker compose up -d
and run through the setup process. If you run into any issues, please leave a comment and I can probably try and help you out.