Railway 배포
zenoBlog는 Railway에 배포되어 있습니다.
공식 URL:
https://zenoblog-production.up.railway.app/
배포 관련 핵심 파일은 두 개입니다.
Dockerfile
railway.toml
Dockerfile 전체 역할
Dockerfile은 서버 환경을 코드로 만드는 파일입니다.
zenoBlog Dockerfile은 크게 세 단계입니다.
| 단계 | 역할 |
|---|---|
vendor | Composer로 PHP 패키지 설치 |
assets | npm ci 후 Vite로 CSS/JS 빌드 |
app | PHP 실행 환경에 앱 파일과 빌드 결과 복사 |
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은 storage와 bootstrap/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