How to create a Ghost Blog on DigitalOcean: A Technical Guide
Ghost is a popular open-source blogging platform known for its simplicity and performance. This guide will walk you through the process of setting up a Ghost blog on DigitalOcean, a cloud infrastructure provider. We'll cover everything from creating a droplet to configuring Ghost on your droplet.
Step 1: Create a DigitalOcean Droplet
- Log in to your DigitalOcean account.
- Head over to the official Ghost app in the Digital Ocean marketplace.
- Click on the “Create Ghost Droplet” button.
- Choose a datacenter region close to your target audience.
- Select a CPU plan (minimum 1GB RAM recommended).
- Add SSH keys for secure access.
- All other options for the Droplet can be selected based on preference.
- Click "Create Droplet" to initialize your server.
Step 2: Connect to Your Droplet
Use SSH to connect to your droplet:
ssh root@your_droplet_ip
Step 3: Update and Upgrade the System
sudo apt update && sudo apt upgrade -y
Step 4: Install Node.js
Ghost requires Node.js. Install it using the NodeSource repository:
curl -sL https://deb.nodesource.com/setup_14.x | sudo -E
sudo apt-get install -y nodejs
Step 5: Install MySQL
sudo apt install mysql-server -y
sudo mysql_secure_installation
Follow the prompts to secure your MySQL installation.
Step 6: Create a MySQL Database for Ghost
sudo mysql
In the MySQL prompt, run:
CREATE DATABASE ghost_prod; CREATE USER 'ghost'@'localhost' IDENTIFIED BY 'your_password'; GRANT ALL PRIVILEGES ON ghost_prod.* TO 'ghost'@'localhost'; FLUSH PRIVILEGES; EXIT;
Step 7: Install Ghost-CLI
sudo npm install ghost-cli@latest -g
Step 8: Create a Directory for Ghost and Set Permissions
sudo mkdir -p /var/www/ghost
sudo chown $USER:$USER /var/www/ghost
sudo chmod 775 /var/www/ghost
cd /var/www/ghost
Step 9: Install Ghost
Follow the prompts, providing your blog URL, MySQL database details, and other configuration options.
Step 10: Configure Nginx (Optional)
If you chose to use Nginx during the Ghost installation:
- Ghost-CLI should have installed and configured Nginx for you.
- Verify the configuration:
sudo nano /etc/nginx/sites-available/ghost.conf
- If needed, adjust the server_name directive to match your domain.
Step 11: Set Up SSL with Let's Encrypt
Ghost-CLI can automatically set up SSL:
sudo ghost setup ssl
Step 12: Start Ghost
If Ghost isn't already running:
ghost start
Step 13: Access Your Ghost Admin Panel
Navigate to https://your_domain/ghost to access the admin panel and start customizing your blog.
Conclusion
You now have a fully functional Ghost blog running on DigitalOcean. Remember to keep your system and Ghost installation updated regularly for security and performance improvements.
For ongoing maintenance:
- Start Ghost site:
ghost start
- View Ghost status:
ghost status
- Restart Ghost:
ghost restart
- Stop Ghost process:
ghost stop
Troubleshooting Common Issues
When setting up a Ghost blog on DigitalOcean, you might encounter some issues. Here are common problems and their solutions:
1. Ghost Installation Fails
If the Ghost installation fails, it's often due to system requirements or permissions.
Fix:
- Ensure your droplet meets the minimum requirements (1GB RAM, Ubuntu 20.04 LTS).
- Check that you have the correct permissions:
sudo chown -R $USER:$USER /var/www/ghost
2. Database Connection Errors
These can occur if MySQL isn't properly configured or if the credentials are incorrect.
Fix:
- Double-check your MySQL credentials.
- Ensure MySQL is running:
sudo systemctl status mysql
If it's not running, start it:
sudo systemctl start mysql
3. Nginx Configuration Issues
Sometimes, Nginx might not be properly configured to serve your Ghost blog.
Fix:
- Check the Nginx configuration:
sudo nano /etc/nginx/sites-available/ghost.conf
- Ensure the
server_name
directive matches your domain. - Test the Nginx configuration:
sudo nginx -t
If there are no errors, restart Nginx:
sudo systemctl restart nginx
4. SSL Certificate Issues
If you're having trouble setting up SSL:
Fix:
- Ensure your domain's DNS is properly configured and pointing to your DigitalOcean droplet.
- Try setting up SSL manually:
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install python-certbot-nginx
sudo certbot --nginx -d yourdomain.com
- Check the Nginx configuration:
sudo nano /etc/nginx/sites-available/ghost.conf
- Ensure the
server_name
directive matches your domain. - Test the Nginx configuration:
sudo nginx -t
- If there are no errors, restart Nginx:
sudo systemctl restart nginx
4. SSL Certificate Issues
If you're having trouble setting up SSL:
Fix:
- Ensure your domain's DNS is properly configured and pointing to your DigitalOcean droplet.
- Try setting up SSL manually:
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install python-certbot-nginx
sudo certbot --nginx -d yourdomain.com
5. Ghost Unable to Start
If Ghost fails to start after installation:
Fix:
- Check the Ghost logs:
ghost log
- Ensure Node.js is properly installed:
node --version
- If necessary, reinstall Node.js following Step 4 in the main guide.
6. "ghost" Command Not Found
This can happen if Ghost-CLI isn't properly installed or isn't in your PATH.
Fix:
- Reinstall Ghost-CLI:
sudo npm uninstall ghost-cli -g
sudo npm install ghost-cli@latest -g
7. Out of Memory Errors
If your blog crashes with out of memory errors:
Fix:
- Consider upgrading your DigitalOcean droplet to a higher tier with more RAM.
- Alternatively, set up a swap file:
sudo fallocate -l 1G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
Then add the following line to /etc/fstab
:
/swapfile none swap sw 0 0
8. Permissions Issues When Updating Ghost
If you encounter permissions errors when trying to update Ghost:
Fix:
- Ensure the Ghost directory has the correct ownership:
sudo chown -R ghost:ghost /var/www/ghost
- Then run the update command with sudo:
sudo -u ghost ghost update
Remember, when troubleshooting, always check the Ghost and Nginx error logs for specific error messages. These can provide valuable clues about the root cause of any issues.
Comments ()