WordPress
WordPress를 관리형 PHP 컨테이너로 배포하고 외부 DB와 오브젝트 스토리지로 데이터를 보관합니다.
배포 루트에 wp-includes/와 wp-config*.php 파일이 있으면 나이트로쉽이 WordPress를 감지합니다. 관리형 프리셋은 준비된 WordPress를 FrankenPHP 컨테이너로 패키징합니다. WordPress 설치·DB 생성·사이트 설정을 대신하지는 않습니다.
배포하기
CLI 설치
curl -fsSL https://nitroship.co/install.sh | bash
ntro login이미 설치했다면 다음 단계로 넘어가세요. 설치 옵션, PATH 설정 및 업데이트는 CLI 설치에서 확인하세요.
WordPress 설정·외부 DB·프로덕션 비밀값을 준비하세요. 컴퓨트 리전을 설정하고, 프리셋을 명시적으로 고르려면 다음과 같이 적습니다.
{
"build": {"framework": "wordpress"},
"compute": {"regions": ["kr-icn"]}
}ntro apps create my-wordpress-site
ntro deploy . --prod관리형 WordPress 프리셋은 호스팅 빌더가 필요합니다. --local을 붙였다면 빼세요. WordPress의 PHP 요청을 처리할 컴퓨트 리전도 꼭 설정해야 합니다.
데이터베이스·비밀값·사이트 주소
외부 MySQL 호환 DB를 사용하세요. 직접 관리하는 wp-config.php에 DB 연결을 설정하고, 접속 정보는 환경 변수로 넣으세요.
환경 변수가 WordPress 상수로 자동 연결되지는 않습니다. DB_HOST, DB_NAME, DB_USER, DB_PASSWORD 환경 변수는 wp-config.php에서 직접 읽어야 동작합니다. 예를 들어 직접 관리하는 설정에 다음 내용을 넣을 수 있습니다.
define('DB_HOST', getenv('DB_HOST'));
define('DB_NAME', getenv('DB_NAME'));
define('DB_USER', getenv('DB_USER'));
define('DB_PASSWORD', getenv('DB_PASSWORD'));이 예시는 전체 설정 파일이 아닌 일부입니다. WordPress의 나머지 설정은 유지하세요. 프리셋이 설정 파일을 다시 쓰거나 특정 Docker 이미지의 환경 변수 규칙을 적용하지는 않습니다.
다음 설정도 준비하세요.
- 인증 키와 솔트: 안전하게 생성한 WordPress 인증 키와 솔트를 설정에 넣고 유지하세요. 환경 변수에서 읽는다면 설정이 사용하는 정확한 변수 이름으로 등록하세요. 서버를 시작할 때마다 다시 생성하지 마세요.
- 공개 주소: DB에 올바른 HTTPS 사이트·홈 주소를 설정하거나, 설정 파일에서
WP_HOME·WP_SITEURL상수를 지정하세요. 환경 변수는 설정 파일에서 읽을 때만 적용됩니다. - 프로덕션 설정: 디버깅을 끄고, 인스턴스 교체 뒤에도 유지할 상태는 플러그인이 외부 서비스에 저장하도록 설정하세요.
빌드·런타임·CDN
PHP 애플리케이션 서버인 FrankenPHP는 WordPress 루트를 문서 루트로 사용합니다. 0.0.0.0:$PORT에서 요청을 받고 기본 포트는 3000입니다. Composer 의존성이 있으면 composer install --no-dev로 설치하며, package.json에 빌드 스크립트가 있으면 Node 22로 프런트엔드 파일도 빌드합니다.
WordPress 문서 루트에서 허용된 브라우저용 확장자를 가진 파일은 생성된 이미지의 /nitroship/static으로 복사한 뒤 자동으로 추출해 CDN에서 제공합니다. CDN이 이 파일을 먼저 제공하고 페이지 렌더링·관리자 요청·API는 계속 컴퓨트의 WordPress가 처리합니다. build.outputDirectory를 설정할 필요는 없습니다.
허용하는 확장자는 .css, .js, .mjs, .html, .txt, .webmanifest, .png, .jpg, .jpeg, .gif, .webp, .avif, .ico, .svg, .woff, .woff2, .ttf, .otf, .eot, .mp4, .webm, .pdf입니다. PHP 파일·심볼릭 링크·숨김 경로·문서 루트의 vendor/와 node_modules/는 복사하지 않습니다.
app·bootstrap·config·resources·routes·storage·src·templates·tests·test·bin·parts·patterns라는 디렉터리도 제외합니다. 파일 이름에 config나 server가 들어간 JS/MJS, *.blade.html·*.twig.html, 이름이 readme·license·changelog로 시작하는 파일도 추출하지 않습니다. WordPress는 루트를 문서 루트로 사용하므로 JS/MJS는 추가로 assets/·js/·static/·wp-includes/js/·wp-admin/js/·wp-content/ 아래에서만 추출합니다.
추출 시 경로와 확장자를 검사할 뿐 파일 내용을 판단하지는 않습니다. 모든 템플릿·설정·서버 소스 파일을 구별해 줄 것으로 기대하지 마세요. 공개하면 안 되는 파일이라도 허용된 확장자가 있으면 CDN에 게시될 수 있습니다. 테마·플러그인·프로젝트 구성을 확인하고 비공개 파일은 공개 문서 루트 밖에 두세요.
프리셋은 먼저 composer.json의 PHP require.php를 읽고, 없으면 .tool-versions의 PHP 선언을 확인합니다. 선언된 메이저 버전 안에서 가장 가까운 지원 PHP 버전을 선택하며, PHP 8.2·8.3·8.4·8.5용 버전이 고정된 FrankenPHP 기반 이미지를 사용합니다. 선언이 없거나 지원하지 않는 버전이면 현재 기본값인 PHP 8.5를 씁니다. 사용하는 WordPress와 플러그인이 선택된 PHP 버전을 지원하는지 확인하세요. 다른 런타임이 필요하면 직접 만든 Dockerfile을 사용하세요.
업로드와 운영 시 주의할 점
생성된 컨테이너는 루트가 아닌 사용자로 실행됩니다. 인스턴스 파일시스템은 임시 저장소이며, 쓰기 가능한 업로드 디렉터리는 /tmp/nitroship/uploads에 둡니다. 이 디렉터리와 다른 인스턴스 파일은 영구 보관되지 않고 인스턴스 사이에 공유되지도 않습니다. 업로드를 S3 같은 오브젝트 스토리지로 보내는 플러그인을 설정하세요. 재배포는 백업을 대신하지 않습니다. 빌드 시 CDN 추출은 실행 중에 새로 생성한 업로드를 게시하지 않습니다.
플러그인·테마 코드는 배포할 소스에 포함하세요. 실행 중인 컨테이너에서 관리자 화면으로 파일을 바꾸는 데 의존하지 말고 소스를 갱신한 뒤 재배포하세요. 프리셋은 플러그인 캐시·파일 세션을 위한 영구 로컬 저장소를 제공하지 않습니다. 플러그인에 공유 상태가 필요하면 외부 저장소를 사용하세요.
나이트로쉽은 마이그레이션·큐 워커·스케줄러를 자동으로 실행하지 않습니다. 필요한 DB 변경과 업그레이드는 프로덕션 연결 정보를 사용해 CI나 로컬 컴퓨터에서 실행하세요. 백그라운드 워커는 별도로 운영해야 합니다. 안정적인 정기 작업은 Cron 작업을 참고하세요. 프리셋은 스케줄러를 만들지 않습니다. 요청으로 실행되는 WordPress의 WP-Cron은 앱 자체의 기능이며 관리형 스케줄링 서비스가 아닙니다.
직접 만든 Dockerfile 사용하기
build.framework가 없으면 설정된 build.dockerfile, Dockerfile.nitroship, Dockerfile 순서로 우선 선택합니다. Dockerfile이 없으면 Next.js, 감지된 관리형 프리셋 중 우선순위가 가장 높은 것, 일반 정적 출력 순으로 선택합니다.
build.framework: "wordpress"는 이 프리셋을 명시적으로 선택하며 자동으로 발견한 Dockerfile보다 우선합니다. build.dockerfile과 함께 쓸 수 없습니다. 직접 만든 이미지를 선택하려면 build.framework를 지우세요. 별도 PHP 확장 모듈·시작 명령·런타임 구성이 필요하다면 Dockerfile 가이드를 참고하세요.