Ghost - Getting Started Guide
Ghost is an open-source blog and publishing platform with a modern editor, memberships, newsletters and built-in SEO. This server comes with Ghost, MySQL, Nginx and Certbot pre-installed - the domain, admin email and password you specified during the order are already configured.
Step 1 - Verify Ghost Works
Your server's IP address and root password are shown on the Server Details page in your client panel. Your blog is already accessible by IP address:
- Blog:
http://your.server.ip - Admin panel:
http://your.server.ip/ghost/
Log in to the admin panel with the email and password you entered during the order. If the page loads and you can sign in, Ghost is working correctly.
If you placed the server behind a VyOS router on a private network, set up port forwarding for ports 22 (SSH), 80 (HTTP) and 443 (HTTPS). Ghost is a public-facing blog that must be reachable from the internet.
Step 2 - Configure Domain and SSL (Recommended)
If you provided a domain during the order, it is already configured in Ghost. Point your domain's DNS A record to the server IP, then SSH in and enable SSL:
ssh root@your.server.ip
/opt/setup/get-ssl.sh your-domain.com
The script will obtain a Let's Encrypt certificate, configure Nginx for HTTPS and update the Ghost URL automatically. After completion:
https://your-domain.com (blog)
https://your-domain.com/ghost/ (admin panel)
Changing the domain later
If you need to change the domain after setup:
cd /var/www/ghost
sudo -u ghost ghost config url http://new-domain.com
sudo -u ghost ghost restart
sed -i "s/server_name .*/server_name new-domain.com;/" /etc/nginx/sites-available/ghost
nginx -t && systemctl reload nginx
Then run /opt/setup/get-ssl.sh new-domain.com to get an SSL certificate for the new domain.
Post-Installation
Fail2Ban - Brute-Force Protection
Your server comes with Fail2Ban pre-configured to protect SSH from brute-force attacks.
| Rule | Max Attempts | Ban Duration |
|---|---|---|
| SSH | 5 failed logins | 10 minutes |
Useful commands:
# Check banned IPs
fail2ban-client status sshd
# Unban an IP
fail2ban-client set sshd unbanip 1.2.3.4
If you accidentally lock yourself out, connect via VNC console in your client panel and unban your IP.
Content Management
In the admin panel you can:
- Posts - create blog articles with the rich editor (Markdown, images, embeds, cards)
- Pages - create static pages (About, Contact, etc.)
- Tags - organize content with tags and internal tags
- Members - manage subscribers and paid memberships
- Newsletters - send email newsletters to subscribers
Theme Customization
Ghost comes with the Casper theme by default. To change or customize themes:
- Settings > Design - customize colors, fonts and branding
- Settings > Design > Change theme - install a new theme from the Ghost Marketplace or upload a ZIP file
Theme files are stored in /var/www/ghost/content/themes/.
Backups
Ghost has a built-in export in Settings > Labs > Export (JSON backup of posts and settings). For a full backup including images and database:
# Content and themes
tar czf /root/ghost-backup-$(date +%Y%m%d).tar.gz /var/www/ghost/content
# MySQL database
mysqldump ghost > /root/ghost-db-$(date +%Y%m%d).sql
Service Management
# Check Ghost status
cd /var/www/ghost && sudo -u ghost ghost status
# Restart Ghost
cd /var/www/ghost && sudo -u ghost ghost restart
# View Ghost logs
cd /var/www/ghost && sudo -u ghost ghost log
# Stack services (managed by systemd)
systemctl status mysql nginx
Updates
# Update Ghost
cd /var/www/ghost
sudo -u ghost ghost update
# Update OS packages
apt update && apt upgrade -y
Software Included
| Component | Version |
|---|---|
| Ubuntu | 24.04 LTS |
| Ghost | 5.x |
| Node.js | 22.x LTS |
| MySQL | 8.x |
| Nginx | 1.24 |
| Certbot | Latest |
| Fail2Ban | 1.0.2 |
Troubleshooting
| Problem | Solution |
|---|---|
| 502 Bad Gateway | Ghost may not be running. Restart: cd /var/www/ghost && sudo -u ghost ghost restart |
| Cannot log in to admin panel | Use the email and password from the order. Password must be at least 10 characters |
| SSL certificate failed | Verify DNS A record points to the server IP. Check /opt/setup/get-ssl.log for details |
| Ghost update fails | Check Node.js compatibility: node --version. See Ghost Node.js support |
| MySQL connection error | Check MySQL: systemctl status mysql. Restart if needed: systemctl restart mysql |
| No space left on device | Check disk: df -h /. Clean unused themes in /var/www/ghost/content/themes/ |
| Blocked by Fail2Ban | Use VNC console in your client panel to unban your IP |
| Forgot root password | Use VNC console in your client panel to reset it |