Overview
Ghost on Infralane
Create a blog or independent publication with Ghost's writing, publishing, and membership tools.
Included
- Ghost 6.73.0 running in production mode.
- A private MySQL 8.4 database.
- Generated database passwords.
- Persistent content and database storage.
- SMTP configuration for transactional email using STARTTLS, with port 587 as the default.
- Service health checks.
Before deployment
Provide your final HTTPS site address and SMTP credentials. You create the publication owner's account after deployment.
Email and subscriptions
Transactional email covers messages such as invitations, password resets, and member sign-in links.
Bulk newsletters use a separate Mailgun API configuration. Paid memberships require a supported Stripe account. Neither service is connected automatically.
Deployment model
This template runs one Ghost service and one database service. It does not deploy ActivityPub, Tinybird analytics, a CDN, or automatic backups. It is a self-hosted installation rather than a Ghost(Pro) subscription.
Getting started
Prepare your address and email
- Choose a hostname you control, such as
blog.example.com. - Enter its final HTTPS address as
SITE_URL, without a trailing slash. - Obtain SMTP credentials and a STARTTLS port supported by your provider: 587 or 2525.
- Authorize the sender address with your email provider.
Do not enter an Infralane-generated hostname unless you already know the exact address that will belong to this application.
Deploy Ghost
- Select a resource pool with enough available resources.
- Enter the site URL, SMTP hostname, SMTP port, SMTP username, SMTP password, and sender email address.
- Deploy the template. Database passwords are generated automatically.
- Connect your chosen hostname to the Ghost application and complete the required DNS setup.
- Confirm that HTTPS works at the exact address supplied in
SITE_URL.
Create the owner's account
Open /ghost/ on your site's HTTPS address and complete the first-run setup immediately, before sharing the address.
Choose the publication title, owner's name, email address, and a strong password.
If you intend to complete setup using the assigned application hostname first, use that exact hostname in SITE_URL. Update the setting and redeploy Ghost when you later move to your final domain.
Verify email
Test password reset or an invitation to an email address you control. Also test member signup and its sign-in email before enabling public memberships.
If messages do not arrive, check SMTP credentials, sender authorization, provider logs, and outbound access to the selected SMTP port.
Configure your publication
Choose a theme, configure navigation, and publish a test post with an image.
For newsletters, configure the Mailgun API separately in Ghost Admin. SMTP credentials alone do not configure newsletter delivery.
For paid memberships, connect an eligible Stripe account and test the customer flow before launch.
Operations and maintenance
Persistent data
The ghost-content volume stores Ghost's content directory, including uploaded images, themes, and other content files.
The database-data volume stores MySQL data, including publication records, users, settings, and membership records.
Persistent storage is not a backup. Removing either volume can permanently remove publication data.
Backups
Back up a consistent MySQL export and the matching Ghost content directory. Keep the deployment configuration and credentials securely available for recovery.
Store backups outside this stack and test restoration into an isolated installation.
Ghost Admin exports are useful for content portability, but do not replace a full database and file backup.
Automatic backup scheduling is not configured by this template.
Updates
Ghost and MySQL images are pinned to exact digests. New versions require a reviewed image update and redeployment.
Back up and test updates before changing a live publication. Ghost may migrate its database during startup.
Do not assume that deploying an older image reverses database migrations. Recovery may require restoring a matching backup.
Follow Ghost's major-version upgrade instructions. MySQL major upgrades require a supported database upgrade or export-and-restore procedure.
Domain changes
Keep SITE_URL aligned with the publication's actual HTTPS address.
When moving domains, connect the new domain, update SITE_URL, redeploy Ghost, and test publication pages, images, Ghost Admin, email links, and integrations.
Email and credentials
This configuration uses authenticated SMTP with STARTTLS on the selected port and requires encryption. Providers offering only implicit TLS on port 465 need a different mail configuration.
Update deployment credentials when rotating the SMTP password and redeploy Ghost.
MySQL initialization variables do not rotate existing database account passwords. Update the account password and the corresponding service environment value together.
Configure and monitor Mailgun separately for newsletters. If payments are enabled, verify Stripe integration behavior after significant updates.
Capacity and troubleshooting
Keep one Ghost application instance for this deployment. Monitor CPU, memory, storage, and service logs.
- Redirects to the wrong address: check
SITE_URL. - HTTPS redirect loops: check domain configuration and forwarded HTTPS headers.
- Database startup failure: check MySQL health, available memory, and credentials.
What will be deployed
2 services · amd64
View the reviewed stack configuration
{
"volumes": {
"database-data": {},
"ghost-content": {}
},
"services": {
"ghost": {
"image": "docker.io/library/ghost:6.73.0-bookworm@sha256:3e62a20e7f172af9c313bcd74c67098359c4fa7f7121a20ebd740c9f6cd0c0b9",
"restart": "unless-stopped",
"volumes": [
"ghost-content:/var/lib/ghost/content"
],
"depends_on": {
"database": {
"condition": "service_healthy"
}
},
"environment": {
"url": "${SITE_URL}",
"NODE_ENV": "production",
"mail__from": "${MAIL_FROM}",
"server__host": "${GHOST_BIND_HOST:-0.0.0.0}",
"server__port": "${GHOST_PORT:-2368}",
"mail__transport": "${GHOST_MAIL_TRANSPORT:-SMTP}",
"database__client": "${GHOST_DB_CLIENT:-mysql}",
"logging__transports": "${GHOST_LOG_TRANSPORTS:-[\"stdout\"]}",
"mail__options__host": "${SMTP_HOST}",
"mail__options__port": "${SMTP_PORT}",
"mail__options__secure": "${GHOST_SMTP_SECURE:-false}",
"mail__options__auth__pass": "${SMTP_PASSWORD}",
"mail__options__auth__user": "${SMTP_USER}",
"mail__options__requireTLS": "${GHOST_SMTP_REQUIRE_TLS:-true}",
"database__connection__host": "${GHOST_DB_HOST:-database}",
"database__connection__port": "${GHOST_DB_PORT:-3306}",
"database__connection__user": "${GHOST_DB_USER:-ghost}",
"database__connection__database": "${GHOST_DB_NAME:-ghost}",
"database__connection__password": "${DATABASE_PASSWORD}"
},
"healthcheck": {
"test": [
"CMD",
"node",
"-e",
"require('http').get('http://127.0.0.1:2368/', r => { r.resume(); process.exit(r.statusCode >= 200 && r.statusCode < 400 ? 0 : 1); }).on('error', () => process.exit(1));"
],
"retries": 12,
"timeout": "5s",
"interval": "15s",
"start_period": "60s"
},
"x-infralane": {
"cpu": 1,
"http_port": 2368,
"memory_mb": 1024,
"description": "Ghost publication and administration"
}
},
"database": {
"image": "docker.io/library/mysql:8.4.13@sha256:a0225d1ea6631c8bc2385dc4c2faba17bbf1834ecf369e1659a9a382bd8d5dd7",
"expose": [
"3306"
],
"restart": "unless-stopped",
"volumes": [
"database-data:/var/lib/mysql"
],
"environment": {
"MYSQL_USER": "ghost",
"MYSQL_DATABASE": "ghost",
"MYSQL_PASSWORD": "${DATABASE_PASSWORD}",
"MYSQL_ROOT_PASSWORD": "${DATABASE_ROOT_PASSWORD}"
},
"healthcheck": {
"test": [
"CMD-SHELL",
"MYSQL_PWD=\"$${MYSQL_PASSWORD}\" mysql --protocol=TCP --connect-timeout=3 -h 127.0.0.1 -u \"$${MYSQL_USER}\" \"$${MYSQL_DATABASE}\" -Nse \"SELECT 1\""
],
"retries": 12,
"timeout": "5s",
"interval": "10s",
"start_period": "30s"
},
"x-infralane": {
"cpu": 0.5,
"memory_mb": 1024,
"description": "Private MySQL database for Ghost"
}
}
}
}Release history
1.0.0
available · Oct 30, 2026
1.0.0
Initial Ghost template for Infralane.
- Ghost 6.73.0 in production mode.
- MySQL 8.4.13 on a private connection.
- Container images pinned to exact SHA-256 digests.
- Generated database passwords.
- Required public site URL and transactional email configuration.
- SMTP with STARTTLS on port 587 or 2525.
- Persistent content and database storage.
- Service health checks and setup documentation.
Newsletter delivery, paid memberships, ActivityPub, and analytics require separate configuration or services.