Symfony
Symfony를 관리형 FrankenPHP 컨테이너로 배포하고 정적 파일은 CDN에서 제공합니다.
배포 루트에 bin/console이 있고 composer.json이 symfony/framework-bundle에 의존하면 나이트로쉽이 Symfony를 감지합니다. 관리형 프리셋이 컨테이너 빌드를 준비하고 PHP 애플리케이션 서버인 FrankenPHP로 HTTP 앱을 실행합니다.
배포하기
CLI 설치
curl -fsSL https://nitroship.co/install.sh | bash
ntro login이미 설치했다면 다음 단계로 넘어가세요. 설치 옵션, PATH 설정 및 업데이트는 CLI 설치에서 확인하세요.
콘솔이나 nitroship.json에서 컴퓨트 리전을 설정하세요. Symfony 프리셋을 명시적으로 선택하려면 다음과 같이 적습니다.
{
"build": {"framework": "symfony"},
"compute": {"regions": ["kr-icn"]}
}먼저 프로덕션 비밀값을 설정한 뒤 배포하세요.
ntro apps create my-symfony-app
ntro deploy . --prodSymfony는 관리형 컨테이너를 사용하므로 호스팅 빌더가 필요합니다. 명령에 --local이 있다면 빼세요. PHP 런타임을 위한 컴퓨트 리전도 꼭 설정해야 합니다.
빌드와 결과물
빌더는 composer install --no-dev --no-scripts로 프로덕션 의존성을 설치하고, package.json에 build 스크립트가 있으면 Node 22로 프런트엔드 파일도 빌드합니다. assets:install public을 비롯한 Composer 자동 스크립트와 설치 훅은 자동으로 실행하지 않습니다. 필요한 정적 파일 준비 과정은 프런트엔드 빌드 스크립트에 넣거나 직접 만든 Dockerfile로 처리하세요. FrankenPHP는 public/을 문서 루트로 사용하고 0.0.0.0:$PORT에서 요청을 받습니다. 기본 포트는 3000입니다. Symfony의 var/는 /tmp/nitroship/var를 가리키므로 캐시와 로그를 쓸 수 있습니다. 서버 시작 시 실행 환경 변수를 읽은 상태에서 cache:warmup을 실행합니다.
public/ 아래에서 허용된 브라우저용 확장자를 가진 파일은 최종 이미지의 /nitroship/static으로 복사한 뒤 자동으로 추출해 CDN에서 제공합니다. CDN이 이 파일을 먼저 제공하고 동적 페이지·API는 컴퓨트의 Symfony가 처리합니다. 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로 시작하는 파일도 추출하지 않습니다.
추출 시 경로와 확장자를 검사할 뿐 파일 내용을 판단하지는 않습니다. 서버 소스·템플릿·비밀값·빌드 설정은 공개 문서 루트 밖에 두세요. 공개하면 안 되는 파일이라도 허용된 확장자가 있으면 CDN에 게시될 수 있습니다.
PHP와 도구 버전
프리셋은 먼저 composer.json의 require.php를 읽고, 없으면 .tool-versions의 PHP 선언을 확인합니다. 지원하는 PHP 버전은 8.2·8.3·8.4·8.5이며, 선언된 메이저 버전 안에서 가장 가까운 지원 버전과 버전이 고정된 FrankenPHP 기반 이미지·도구를 선택합니다. 선언이 없거나 지원하지 않는 버전이면 현재 기본값인 PHP 8.5를 씁니다. 프로젝트에서 요청했다고 해서 지원하지 않는 릴리스나 임의의 이미지 태그를 설치하지는 않습니다.
추가 PHP 확장 모듈·시스템 패키지·별도 프런트엔드 빌드 과정·다른 시작 순서가 필요하면 직접 만든 Dockerfile을 사용하세요. 프리셋이 커스텀 커널의 디렉터리 설정이나 앱 코드를 자동으로 바꾸지는 않습니다.
프로덕션 환경 변수
실행 시 필요한 설정과 비밀값은 환경 변수로 넣으세요. 프로덕션 .env 파일을 저장소에 넣지 마세요. 관리형 빌드는 .env 파일을 제외하고 Symfony의 APP_RUNTIME_OPTIONS를 {"disable_dotenv":true}로 설정합니다. 이미지 안의 dotenv 파일에 의존하지 말고 필요한 프로덕션 값을 주입되는 환경 변수로 제공하세요.
| 변수 | 설정할 값 |
|---|---|
APP_ENV | prod |
APP_DEBUG | 0 |
APP_SECRET | 안전하게 생성한 앱 비밀값입니다. 배포가 바뀌어도 유지하세요. |
DATABASE_URL | 앱에서 이 변수를 사용한다면 외부 DB의 연결 URL을 설정하세요. |
DEFAULT_URI | 라우터 설정에서 이 변수를 참조한다면 앱의 공개 HTTPS 주소를 설정하세요. |
메일·Redis·오브젝트 스토리지 접속 정보 등 Symfony 설정에서 참조하는 변수도 설정하세요. 나이트로쉽이 이 서비스들을 만들거나, 앱이 읽지 않는 환경 변수를 쓰도록 설정을 바꿔 주지는 않습니다.
인스턴스 사이에 상태를 공유하거나 교체 뒤에도 유지해야 한다면 외부 세션·캐시 저장소를 권장합니다. 로컬 캐시·로그·파일 세션은 임시 데이터입니다. 업로드는 public/·var/·/tmp 대신 S3 같은 오브젝트 스토리지에 저장하세요.
운영 시 주의할 점
생성된 컨테이너는 루트가 아닌 사용자로 실행됩니다. 인스턴스 파일시스템은 임시 저장소이며 /tmp는 임시 파일을 위한 공간입니다. 영구 데이터를 저장하지 마세요. 로그를 오래 보관해야 한다면 적절한 외부 저장소로 보내세요.
나이트로쉽은 데이터베이스 마이그레이션·큐 워커·스케줄러를 자동으로 실행하지 않습니다. 외부 DB의 프로덕션 연결 정보를 사용해 CI나 로컬 컴퓨터에서 마이그레이션을 실행하세요. Symfony Messenger 소비자 등 백그라운드 워커는 별도로 운영해야 합니다. 정기적인 HTTP 작업은 Cron 작업을 참고하세요. 이 프리셋은 스케줄러 프로세스를 시작하지 않습니다.
직접 만든 Dockerfile 사용하기
build.framework를 적지 않았고 프로젝트에 Dockerfile이 있으면, 나이트로쉽은 프리셋보다 Dockerfile을 먼저 사용합니다. 전체 감지 순서는 빌드 방식 선택에 있습니다.
반대로 build.framework: "symfony"를 적으면 Dockerfile이 있어도 관리형 프리셋을 씁니다. build.framework와 build.dockerfile은 함께 쓸 수 없으니, 직접 만든 이미지를 쓰려면 build.framework를 지우고 Dockerfile 가이드를 따르세요.