Publishing · KYC 없음
Ghost를 해외 VPS에 호스팅
Ghost는 빠르고 현대적인 퍼블리싱 플랫폼으로, 해외 VPS에서 몇 분 만에 셀프 호스팅할 수 있습니다. 글과 구독자, 결제 정보를 제3자 클라우드 밖에 안전하게 둘 수 있습니다.
설명
Ghost는 블로그, 뉴스레터, 멤버십 사이트를 위해 만들어진 오픈소스 Node.js CMS로, 네이티브 이메일 구독, 유료 멤버십 등급, 깔끔한 마크다운 에디터를 제공합니다. 공식 Docker 이미지로 배포되며 MySQL 8을 기반으로 리버스 프록시 뒤에서 자체 포트로 사이트를 서비스합니다.
왜 해외에서 호스팅해야 할까요
KYC 없는, 암호화폐 결제 VPS에서 Ghost를 운영하면 여러분의 퍼블리케이션은 신원과 연결되거나, 강제로 서비스 중단당하거나, 요청에 따라 정보가 넘겨질 수 있는 계정에 얽매이지 않습니다. 해외 프라이버시 등급 로케이션과 무제한 트래픽 덕분에 콘텐츠, 회원 목록, Stripe 정산액을 호스팅 제공업체의 개입 없이 완전히 직접 통제할 수 있습니다.
배포
실제로 작동하는 참고 설정
이 내용을 새 ChainVPS 인스턴스에 붙여넣으세요. 자리표시자를 실제 값으로 교체한 뒤 실행하세요.
services:
ghost:
image: ghost:5-alpine
restart: always
ports:
# 로컬호스트에만 바인딩하고, TLS는 리버스 프록시(nginx/Caddy)에서 종료하세요
- "127.0.0.1:2368:2368"
environment:
url: https://blog.example.com
NODE_ENV: production
database__client: mysql
database__connection__host: db
database__connection__port: 3306
database__connection__user: ghost
database__connection__password: CHANGE_ME_DB_PASSWORD
database__connection__database: ghostdb
# 회원/뉴스레터 이메일용 선택적 발신 SMTP:
# mail__transport: SMTP
# mail__options__host: smtp.example.com
# mail__options__port: 587
# mail__options__auth__user: [email protected]
# mail__options__auth__pass: CHANGE_ME_SMTP
volumes:
- ghost-content:/var/lib/ghost/content
depends_on:
- db
db:
image: mysql:8.0
restart: always
command: --default-authentication-plugin=caching_sha2_password
environment:
MYSQL_ROOT_PASSWORD: CHANGE_ME_ROOT_PASSWORD
MYSQL_DATABASE: ghostdb
MYSQL_USER: ghost
MYSQL_PASSWORD: CHANGE_ME_DB_PASSWORD
volumes:
- ghost-db:/var/lib/mysql
volumes:
ghost-content:
ghost-db:
# 배포:
# apt-get update && apt-get install -y docker.io docker-compose-v2
# docker compose up -d
# 그 후 리버스 프록시(Caddy/nginx)를 127.0.0.1:2368로 연결해 HTTPS를 적용하고,
# 최초 부팅 전에 `url:` 값을 실제 https:// 도메인으로 설정하세요.
방화벽
열어야 할 포트
| 포트 | 프로토콜 | 용도 |
|---|---|---|
| 2368 | TCP | Ghost HTTP 앱 포트 - 127.0.0.1에만 바인딩하고 리버스 프록시로 서비스, 절대 공개 노출 금지 |
| 443 | TCP | 리버스 프록시(Caddy/nginx)를 통한 공개 HTTPS |
| 80 | TCP | ACME/Let's Encrypt 인증서 발급 및 443으로의 리다이렉트용 HTTP |
| 3306 | TCP | MySQL - 내부 Docker 네트워크 전용, 호스트에 절대 게시하지 마세요 |
적정 규모 산정
필요한 요금제
VPS Nano/Small (1-2 vCPU, 2 GB RAM)
개인 블로그나 소규모 뉴스레터. Ghost와 MySQL이 여유롭게 동작하며, 안전장치로 1 GB 스왑을 추가하세요.
VPS Pro (2-4 vCPU, 4-8 GB RAM)
유료 멤버십, 이미지가 많은 게시물, 정기적인 이메일 발송이 있는 활발한 퍼블리케이션. MySQL 캐시와 트래픽 급증 대응 여유가 있습니다.
Dedicated (전용 코어, 16 GB+ RAM, NVMe)
트래픽이 많은 사이트나 대용량 미디어 라이브러리를 갖춘 멀티 블로그 구성. MySQL을 분리하고 캐시를 통해 미디어를 서비스해 지연 시간을 일정하게 유지하세요.
추천 로케이션: 테이크다운(삭제 요청) 압박과 무관하게 온라인 상태를 유지해야 하는 퍼블리케이션이라면 ChainVPS의 프라이버시 등급 로케이션을 선택하세요: 아이슬란드(IS), 스위스(CH), 루마니아(RO), 몰도바(MD), 네덜란드(NL), 룩셈부르크(LU). CH와 IS는 강력한 언론·표현의 자유 보호와 프라이버시 법제를 갖추고 있으며, NL과 LU는 무제한 트래픽과 함께 유럽 독자층에 낮은 지연으로 도달할 수 있어 이미지와 뉴스레터 비중이 큰 사이트에 적합합니다.
보안을 강화하세요
보안 강화 체크리스트
- 2368번이나 3306번 포트를 절대 0.0.0.0으로 게시하지 마세요. Ghost는 127.0.0.1에만 바인딩하고 MySQL은 내부 Docker 네트워크 전용으로 유지한 뒤, 사이트는 TLS 리버스 프록시를 통해서만 노출하세요(Caddy는 Let's Encrypt 인증서를 자동 발급하며, nginx + certbot도 사용 가능합니다).
- 최초 부팅 전에 `url` 환경변수를 실제 https:// 도메인으로 설정하세요. Ghost는 URL을 리소스 링크에 고정하므로, 나중에 변경하려면 데이터베이스 업데이트와 캐시 초기화가 필요합니다.
- 관리자 패널을 잠그세요: 최초 설정 시 길고 고유한 비밀번호를 강제하고, 고정된 위치에서 게시하는 경우 프록시 단에서 IP 허용목록이나 기본 인증으로 /ghost/ 접근을 제한하세요. Ghost에 내장된 스태프 2FA를 활성화하세요.
- 두 볼륨을 정기적으로 백업하세요: MySQL을 덤프하고(`docker compose exec db mysqldump -u ghost -p ghostdb`), 콘텐츠 볼륨(`/var/lib/ghost/content`, 이미지와 테마 보관)을 아카이브하세요. 암호화된 백업은 ChainVPS 스토리지나 외부로 전송하세요.
- 이미지 태그(ghost:5-alpine, mysql:8.0)를 고정하고 `docker compose pull && docker compose up -d`로 신중하게 업데이트하세요. Ghost 메이저 버전을 올리기 전에 테마·연동 호환성을 테스트하고, 플랜에 기본 포함된 디도스(DDoS) 방어는 엣지에서 계속 활성화해 두세요.
질문
호스팅 Ghost — FAQ
Ghost는 MySQL이 꼭 필요한가요, SQLite를 사용할 수 있나요?
Ghost 5는 프로덕션 환경에서 공식적으로 MySQL 8을 요구합니다. 위 compose 파일은 MySQL 8을 자동으로 구성합니다. SQLite는 로컬 개발 환경에서만 지원되며, 실서비스용 해외 배포에는 권장하지 않습니다.
HTTPS는 어떻게 적용하나요?
Ghost 자체는 2368번 포트로 일반 HTTP만 서비스합니다. 앞단에 리버스 프록시를 두세요 - Caddy가 가장 간단합니다(Let's Encrypt 인증서를 자동으로 발급·갱신합니다). nginx와 certbot 조합도 사용할 수 있습니다. 127.0.0.1:2368로 연결하고 Ghost의 `url` 값을 실제 https:// 도메인으로 설정하세요.
제3자에게 신원 흔적을 남기지 않고 뉴스레터를 보낼 수 있나요?
Ghost는 어떤 SMTP 제공업체나 Mailgun을 통해서든 회원 이메일을 발송합니다. 프라이버시 중심 구성에서는 암호화폐 결제나 최소한의 가입만 요구하는 SMTP 릴레이를 사용하고, mail__ 환경변수로 설정하세요. 트랜잭션 이메일은 여전히 SPF/DKIM이 적용된 전송 가능한 발신 도메인이 필요합니다.
디스크 용량은 얼마나 필요한가요?
Ghost 코어와 MySQL은 용량이 작습니다(수백 MB 수준). 실제 용량 증가는 콘텐츠 볼륨에 업로드되는 이미지와 동영상에서 발생합니다. 가벼운 블로그는 20-40 GB로도 충분히 운영되며, 이미지 비중이 크거나 멤버십 기반 사이트는 NVMe 스토리지와 콘텐츠 볼륨의 정기 백업을 계획해야 합니다.
트래픽 급증이나 디도스(DDoS) 공격에도 사이트가 버틸 수 있나요?
ChainVPS 플랜에는 네트워크 엣지에서의 디도스 방어가 포함되어 있고, 트래픽이 무제한이라 게시물이 화제가 되어도 초과 요금이 발생하지 않습니다. 순수한 요청 급증에 대비해서는 프록시 단에서 해외 페이지 조회에 대한 캐싱을 활성화하고, 동시 접속이 지속적으로 높다면 VPS Pro나 Dedicated 플랜으로 전환하세요.