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 admin email and password you specified during the order are already configured. The blog works by IP address right away; the domain you entered when ordering starts working once you point it to the server (Step 2).
Step 1 – Verify Ghost Works
Your server’s IP address and root password are shown in the Server Information section on the Overview tab of your server in the client portal. The application settings you entered when ordering, passwords included, are shown in the Ghost Credentials card on the same tab. Your blog is already accessible by IP address:
- Blog:
https://your.server.ip - Admin panel:
https://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.
For the first minute after the server is created the blog answers 403 Forbidden: it stays closed to visitors until your admin account is set up, so nobody else can claim the blog. Wait a minute and reload.
If you placed the server behind a VyOS router on a private network, the server has only a private address, so it does not get the IP certificate, and Ghost is set up for that private address. You can open the blog over http:// on the private address through a VPN on the router (WireGuard or OpenVPN, on the router’s Configuration tab). To make the blog reachable from the internet, forward ports 80 and 443 to the server on the router’s Configuration tab (Port forwarding), point your domain to the router’s public address and connect the domain (Step 2): until then, the blog’s links point to the private address. Ghost is a public-facing blog that must be reachable from the internet. Forward port 22 as well if you need SSH from the internet.
Firewall. If you turn on the Firewall for this server in the client portal, allow incoming TCP port 80 in its rules, along with 443 (HTTPS). Certificates renew over port 80 – the IP certificate every few days – and without that rule the certificate expires and the browser starts showing a warning.
Step 2 – Configure Domain and SSL (Recommended)
To serve the blog on your own domain, point the domain’s DNS A record to the server IP, then SSH in and run the domain setup script:
ssh root@your.server.ip
HTTPS without a domain. Since January 2026 Let’s Encrypt issues certificates for IP addresses (official announcement), so your server gets a real, browser-trusted certificate on first boot – before you connect any domain. Certificates of this kind are short-lived (about six days) and renew automatically. If your server is not reachable from the internet on port 80 (for example, it sits behind a router), the certificate cannot be issued – in that case use http:// instead.
/opt/setup/get-ssl.sh your-domain.com you@example.com
The email is optional (Let’s Encrypt uses it for expiry notices). The domain you entered when ordering is already saved on the server, so you can run the script without arguments. 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
Point the new domain’s DNS A record to the server IP and run the same script with the new domain: /opt/setup/get-ssl.sh new-domain.com. It reconfigures Nginx, obtains a certificate and switches Ghost to the new address.
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, open the Console on your server’s Overview tab in the client portal 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
Ghost runs as a systemd service, like MySQL and Nginx:
# Check Ghost status
systemctl status ghost
# Restart Ghost
systemctl restart ghost
# View Ghost logs
journalctl -u ghost -n 100
# Stack services
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.130 |
| Node.js | 22.x LTS |
| MySQL | 8.x |
| Nginx | 1.24 |
| Certbot | 5.8 (IP address), 2.9 (domain) |
| Fail2Ban | 1.0.2 |
Troubleshooting
| Problem | Solution |
|---|---|
| 403 Forbidden right after the server is created | The blog stays closed to visitors until your admin account is set up – wait a minute and reload. If the page still shows 403 after five minutes, setup did not complete (for example, Ghost rejected the password: at least 10 characters, not a common one): check /opt/setup/setup.log over SSH and reinstall the server with the Rebuild button on its Overview tab in the client portal |
| 502 Bad Gateway | Ghost may not be running. Restart: systemctl restart ghost |
| 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 the Console on your server’s Overview tab in the client portal to unban your IP |
| Forgot root password | Use the Console on your server’s Overview tab in the client portal to reset it |