본문으로 건너뛰기

Railway 배포

zenoBlog는 Railway에 배포되어 있습니다.

공식 URL:

https://zenoblog-production.up.railway.app/

배포 관련 핵심 파일은 두 개입니다.

Dockerfile
railway.toml

Dockerfile 전체 역할

Dockerfile은 서버 환경을 코드로 만드는 파일입니다.

zenoBlog Dockerfile은 크게 세 단계입니다.

단계역할
vendorComposer로 PHP 패키지 설치
assetsnpm ci 후 Vite로 CSS/JS 빌드
appPHP 실행 환경에 앱 파일과 빌드 결과 복사

vendor 단계

FROM composer:2 AS vendor

WORKDIR /app

COPY composer.json composer.lock ./
RUN composer install --no-dev --no-interaction --prefer-dist --optimize-autoloader --no-scripts

COPY . .
RUN composer dump-autoload --no-dev --optimize

이 단계는 PHP 의존성을 설치합니다.

--no-dev는 배포 환경에서 테스트 도구 같은 개발용 패키지를 제외한다는 뜻입니다.

assets 단계

FROM node:22-bookworm AS assets

WORKDIR /app

COPY package.json package-lock.json ./
RUN npm ci

COPY resources resources
COPY public public
COPY vite.config.js postcss.config.js tailwind.config.js ./
RUN npm run build

이 단계는 프론트엔드 자산을 빌드합니다.

resources/css/app.css
resources/js/app.js
-> Vite build
-> public/build 생성

app 단계

FROM php:8.4-cli-bookworm AS app

최종 실행 이미지는 PHP 8.4 CLI를 사용합니다.

RUN apt-get update \
&& apt-get install -y --no-install-recommends libzip-dev unzip \
&& docker-php-ext-install pdo_mysql zip opcache

Laravel에서 MySQL을 쓰기 위해 pdo_mysql 확장을 설치합니다.

빌드 결과 복사

COPY --from=vendor /app /var/www/html
COPY --from=assets /app/public/build /var/www/html/public/build

PHP 앱 파일과 Vite 빌드 결과를 최종 이미지에 복사합니다.

권한 설정

RUN mkdir -p storage/framework/cache storage/framework/sessions storage/framework/views storage/logs bootstrap/cache \
&& rm -f public/hot \
&& chown -R www-data:www-data storage bootstrap/cache public

Laravel은 storagebootstrap/cache에 파일을 쓸 수 있어야 합니다.
그래서 해당 폴더를 만들고 권한을 맞춥니다.

실행 명령

CMD ["sh", "-c", "php artisan config:clear && php artisan migrate --force && php artisan storage:link --force && php artisan serve --host=0.0.0.0 --port=${PORT}"]

실행 시 하는 일은 다음과 같습니다.

config 캐시 정리
-> DB 마이그레이션 실행
-> public/storage 링크 생성
-> Laravel 서버 실행

railway.toml

[build]
builder = "DOCKERFILE"
dockerfilePath = "Dockerfile"

[deploy]
startCommand = "sh -c 'php artisan config:clear && php artisan migrate --force && php artisan storage:link --force && php artisan serve --host=0.0.0.0 --port=$PORT'"
restartPolicyType = "ON_FAILURE"
restartPolicyMaxRetries = 10

Railway에게 Dockerfile로 빌드하라고 알려줍니다.

PORT 환경변수

Railway는 서버 포트를 직접 고정하지 않고 $PORT 환경변수를 줍니다.

그래서 실행 명령에서 이렇게 씁니다.

php artisan serve --host=0.0.0.0 --port=$PORT

배포에서 조심할 것

.env 파일은 Git에 올리지 않습니다.
Railway에서는 환경변수를 Railway 대시보드에서 설정해야 합니다.

필요한 값은 보통 다음 종류입니다.

APP_KEY
APP_ENV
APP_URL
DB_HOST
DB_DATABASE
DB_USERNAME
DB_PASSWORD
FILESYSTEM_DISK

값 자체는 문서에 쓰지 않습니다.

배포 흐름 요약

GitHub push
-> Railway가 코드 감지
-> Dockerfile 빌드
-> composer install
-> npm ci / npm run build
-> 컨테이너 실행
-> migrate
-> storage:link
-> Laravel serve