This guide explains how to deploy Ghost on Render using the included render.yaml Blueprint configuration.
- A Render account
- A fork or clone of this Ghost repository
-
Click the button below to deploy Ghost to Render:
-
In the Render dashboard, you'll be prompted to:
- Connect your GitHub/GitLab repository
- Set required environment variables (see below)
-
Click Apply to start the deployment
- Create a new Blueprint in your Render dashboard
- Connect your repository containing this Ghost codebase
- Render will automatically detect the
render.yamlfile - Configure the required environment variables
- Deploy
After deployment, you must configure these variables in the Render dashboard:
| Variable | Description | Example |
|---|---|---|
url |
Your Ghost site's public URL | https://ghost-xxxx.onrender.com or https://yourdomain.com |
Ghost requires mail configuration to send password resets, member emails, etc.
| Variable | Description | Example |
|---|---|---|
mail__options__host |
SMTP server host | smtp.mailgun.org |
mail__options__port |
SMTP server port | 587 |
mail__options__secure |
Use TLS | true |
mail__options__auth__user |
SMTP username | [email protected] |
mail__options__auth__pass |
SMTP password | your-smtp-password |
Recommended Mail Providers:
- Mailgun - Ghost's recommended provider
- SendGrid
- Amazon SES
For paid memberships and subscriptions:
| Variable | Description |
|---|---|
stripe__secretKey |
Your Stripe secret key (sk_live_...) |
stripe__publicKey |
Your Stripe publishable key (pk_live_...) |
The render.yaml Blueprint deploys a single Ghost web service using the official Ghost Docker image (ghost:5-alpine).
Key features:
- Uses the official Ghost Docker image for reliability
- SQLite database for simplicity (stored on persistent disk)
- Persistent disk for content (images, themes, uploads, database)
- Health check endpoint configured
- Port 10000 (Render's default)
This configuration uses SQLite by default, which is suitable for:
- Personal blogs
- Small to medium traffic sites
- Development and testing
The SQLite database is stored on the persistent disk at /var/lib/ghost/content/data/ghost.db.
For higher traffic sites or production deployments, you may want to use MySQL. You can use an external MySQL-compatible database:
- PlanetScale - Serverless MySQL
- TiDB Cloud - MySQL-compatible, free tier available
- AWS RDS - Managed MySQL
- DigitalOcean Managed Databases
Update the database environment variables in render.yaml:
- key: database__client
value: mysql2
- key: database__connection__host
value: your-external-host.com
- key: database__connection__port
value: "3306"
- key: database__connection__user
value: your-username
- key: database__connection__password
value: your-password
- key: database__connection__database
value: ghostGhost content (images, themes, files, SQLite database) is stored on a Render Disk mounted at /var/lib/ghost/content. The default size is 10GB but can be increased in the Render dashboard.
Important: Render Disks are tied to a single service instance. For high-availability deployments, consider using external object storage like:
- AWS S3
- DigitalOcean Spaces
- Cloudflare R2
- In your Render dashboard, go to your Ghost service
- Click Settings > Custom Domains
- Add your domain and follow DNS configuration instructions
- Update the
urlenvironment variable to match your custom domain
The deployment uses the ghost:5-alpine Docker image. To upgrade:
- Update the
FROMline inDockerfile.renderto a newer Ghost version - Commit and push the changes
- Render will automatically rebuild and deploy
- Check the Render logs for error messages
- Ensure the
urlenvironment variable is set correctly - Ghost may take 1-2 minutes to start on first deployment (database initialization)
- Ghost may take 1-2 minutes to start on first deployment
- The health check has a 60-second start period to allow for initialization
- Check application logs for startup errors
- Verify the disk is properly mounted at
/var/lib/ghost/content - Check disk usage in Render dashboard (may need to increase size)
- For SQLite: Check that the
/var/lib/ghost/content/data/directory exists - For MySQL: Verify connection settings and that the database is accessible