How to Deploy Laravel on Heroku (2026 Guide)
요약
본 가이드는 Laravel 앱을 Heroku에 배포하는 과정을 안내하며, 단순한 '로컬에서 작동함' 수준을 넘어 프로덕션 환경에서 필수적인 8단계 구성 요소를 다룹니다. 핵심 내용은 Procfile 생성, Git 푸시를 통한 배포, Config Vars를 이용한 환경 변수 설정, 그리고 데이터베이스 애드온 추가 및 마이그레이션 실행 등입니다. 특히 큐 워커너(Queue Worker), 파일 시스템 관리, 스케줄러 처리 등 프로덕션에서 놓치기 쉬운 중요한 구성 요소들을 상세히 다루고 있습니다. 결론적으로, 이 가이드는 Heroku 환경의 기술적 제약 사항과 비용 구조를 명확히 제시하며, 개발자들이 더 자동화된 플랫폼으로 이동하는 이유와 Heroku가 요구하는 정확한 프로덕션 구성을 이해하도록 돕습니다.
핵심 포인트
- Laravel 앱을 Heroku에 배포하려면 Procfile 생성이 필수적이며, 이는 웹 서버의 진입점을 지정합니다 (예: `web: vendor/bin/heroku-php-apache2 public/`).
- 로컬 `.env` 파일 대신 모든 환경 변수는 Heroku Config Vars를 통해 설정해야 하며, 이는 프로덕션 배포의 핵심입니다.
- Heroku는 기본 데이터베이스를 제공하지 않으므로, PostgreSQL 또는 MySQL과 같은 애드온을 추가하고 `DATABASE_URL` 등의 Config Var를 업데이트해야 합니다.
- 프로덕션 환경에서는 큐 워커너(Queue Worker), 스케줄러, 파일 시스템 관리 등 로컬에서 간과하기 쉬운 여러 구성 요소를 별도로 처리해야 합니다.
- 이 가이드는 Heroku의 기술적 제약 사항과 비용 구조를 투명하게 공개하며, 개발자들이 더 현대적이고 자동화된 플랫폼으로 이동하는 추세를 논합니다.
Heroku 에서 Laravel 앱을 배포하는 데는 올바른 단계를 따르면 약 15~20 분이 소요됩니다. 간략한 버전: Apache 를 public/ 디렉토리로 지시하는 Procfile 생성, Git 을 통한 푸시, Heroku Config Vars 로 환경 변수 설정, 데이터베이스 add-on 추가, 그리고 one-off dyno 를 통해 마이그레이션 실행. 앱이 라이브 상태입니다. 하지만 이것이 이야기의 절반에 불과합니다. 대부분의 Laravel 배포 가이드는 "localhost 에서 작동함"으로 끝내고 실제 프로덕션에서 중요한 부분을 생략합니다: 자체 dyno 가 필요한 큐 워크러너, 각 배포마다 자신을 지워버리는 파일 시스템, 분당 실행할 수 없는 스케줄러, 그리고 3 번의 add-on 을 포함한 5MB 무료 티어로 작업해야 하는 MySQL 우회법. 이 가이드는 Laravel 11 과 12 를 Heroku 에서 실행하기 위한 모든 8 단계와 튜토리얼에서 생략하는 구성을 다룹니다. 또한 프로덕션에서 무엇이 깨지는지, 모든 것을 더할 때 비용이 얼마나 되는지, 그리고 점점 더 많은 Laravel 개발자가 자동으로 이 설정을 처리하는 플랫폼으로 이동하는 이유를 다룹니다. 마지막에 Heroku 가 실제 프로덕션 Laravel 앱에 대해 정확히 무엇을 요구하는지, 그리고 그것이 프로젝트에 적합한 선택인지 알게 될 것입니다. 사전 지식 시작하기 전에 다음이 준비되어 있는지 확인하세요: PHP 8.2 또는 그 이상과 로컬 컴퓨터에 설치된 Composer Laravel 11 또는 12 프로젝트가 로컬에서 설정되고 실행됨 Heroku 계정 (없다면 heroku.com 에서 가입) Heroku CLI 설치. heroku --version 을 실행하여 확인 Git 이 Laravel 프로젝트 루트 안에 초기화됨 Heroku 에서 Laravel 앱을 배포하는 단계별 가이드 Heroku 에서 Laravel 앱을 배포하는 단계별 가이드 1 단계: Procfile 생성 기본적으로 Heroku 는 프로젝트의 루트 디렉토리에서 파일을 제공합니다. Laravel 의 진입점은 public/ 하위 디렉토리가 아니라 루트입니다. Procfile 이 없으면 Heroku 는 잘못된 디렉토리를 서비스하려고 시도하고 앱이 로드되지 않습니다. Laravel 프로젝트 루트에 Procfile (확장 없음) 을 생성하세요: web: vendor/bin/heroku-php-apache2 public/ Nginx 를 Apache 대신 선호하는 경우: web: vendor/bin/heroku-php-nginx public/ 둘 다 작동합니다. Apache 는 Heroku 의 PHP buildpack 이 기본적으로 사용하는 것이므로 더 안전한 기본값입니다. 배포 전에 Procfile 을 Git 에 추가하세요: git add Procfile git commit -m "add Procfile for Heroku" 2 단계: Heroku 앱 생성 및 환경 변수 설정 CLI 를 사용하여 Heroku 앱을 생성하세요: heroku create your-app-name Heroku 는 https://your-app-name.herokuapp.com 과 같은 URL 을 생성하고 프로젝트에 heroku 라는 Git 원격 저장소를 추가합니다.
자동으로 설정됩니다. 다음으로 로컬에서 Laravel APP_KEY 를 생성하고 Heroku 에 Config Var 로 설정합니다: php artisan key:generate --show heroku config:set APP_KEY=base64:your-generated-key-here 다른 필요한 환경 변수도 설정합니다: heroku config:set APP_ENV=production heroku config:set APP_DEBUG=false heroku config:set APP_URL= https://your-app-name.herokuapp.com .env 파일은 gitignore 되어 Heroku 에 절대 푸시되지 않습니다. Config Vars 는 Heroku 의 대용량으로, 로컬의 .env 와 동일하게 런타임에 환경 변수로 주입됩니다. Laravel 앱이 production 에서 .env 에서 읽는 모든 변수는 Config Var 로 설정해야 합니다.
3 단계: 데이터베이스 설정
Heroku 는 기본적으로 데이터베이스를 포함하지 않습니다. Addon 으로 하나를 추가해야 합니다. 여전히 수동으로 데이터베이스, config vars, buildpacks 를 연결하는가? 더 빠른 방법이 있습니다. Kuberns 의 AI agent 로 Laravel 앱을 배포하고 설정을 완전히 생략하세요.
PostgreSQL (추천)
Heroku Postgres 는 네이티브 옵션이며 가장 신뢰할 수 있습니다. Mini 플랜 추가: heroku addons:create heroku-postgresql:essential-0 이는 DATABASE_URL Config Var 를 자동으로 설정합니다. config/database.php 를 업데이트하여 이를 파싱합니다:
'pgsql' => [
'driver' => 'pgsql',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '5432'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'sslmode' => 'require',
], DB_CONNECTION=pgsql 을 Config Var 로 설정합니다: heroku config:set DB_CONNECTION=pgsql
MySQL (ClearDB 를 통해)
앱이 MySQL 기반으로 구축된 경우: heroku addons:create cleardb:ignite Heroku 는 CLEARDB_DATABASE_URL Config Var 를 설정합니다. 이를 수동으로 파싱하고 개별 DB 변수를 설정합니다:
heroku config:set DB_CONNECTION=mysql
heroku config:set DB_HOST=your-cleardb-host
heroku config:set DB_DATABASE=your-cleardb-db
heroku config:set DB_USERNAME=your-cleardb-user
heroku config:set DB_PASSWORD=your-cleardb-password
어떤 것을 선택해야 할까요?
Postgres 는 Heroku 에 네이티브이며, 신뢰할 수 있는 connection pooling 이 있는 적절한 플랜 티어를 제공합니다. ClearDB 의 무료 Ignite 플랜은 5MB 로 제한되며, 데모에는 충분하지만 실제 앱에는 부족합니다. 동일한 저장량을 가진 ClearDB 의 유료 플랜은 Heroku Postges 와 동등한 비용보다 더 비쌉니다.
4 단계: Git Push 를 통해 배포
코드에 Heroku 를 푸시합니다:
git add .
git commit -m "heroku deployment config"
git push heroku main
빌드 중에는 Heroku 가 PHP buildpack 을 감지하고, composer install 을 실행하며, Procfile 을 파싱하고 dyno 를 시작할 것입니다. 출력은 w
성공 시 URL 을 표시합니다. 앱을 여세요: heroku open 만약 Laravel 환영 화면이나 앱의 홈페이지를 보인다면, 배포가 성공했습니다.
5 단계: 마이그레이션 실행
데이터베이스는 존재하지만 아직 테이블이 없습니다. 일회용 dyno 를 통해 마이그레이션을 실행하세요:
heroku run php artisan migrate --force
--force 플래그가 필요합니다. Heroku 는 APP_ENV=production 를 설정하고, Laravel 의 Artisan 은 명시적 확인 없이 production 에서 마이그레이션을 실행을 거부합니다. --force 플래그는 비상호작용적으로 이 확인을 제공합니다.
앱이 필요하면 시드러를 실행하세요:
heroku run php artisan db:seed --force
Laravel 앱을 Kuberns 에 배포합니다.
6 단계: 큐 워커 처리 (대부분의 튜토리얼은 이를 생략함)
이게 제대로 작동하는 Laravel 앱을 얻기 위해 이렇게 많은 수작업으로 느껴진다면, 그것은 사실입니다. Kuberns 가 AWS 에서 Laravel 배포를 자동화하는 방법을 확인하세요. 큐, 스토리지, cron 이 바로 작동합니다.
만약 당신의 Laravel 앱이 큐를 사용한다면 (Mail::queue, dispatch(), jobs, notifications), Heroku 에서는 전용 워커 프로세스 없이 처리되지 않습니다. 웹 dyno 는 HTTP 요청만 처리합니다. 배경에서 queue:work 를 실행하지 않습니다.
Procfile 에 워커 프로세스 타입을 추가하세요:
web: vendor/bin/heroku-php-apache2 public/
worker: php artisan queue:work --sleep=3 --tries=3 --timeout=90
워커 dyno 를 확장하세요:
heroku ps:scale worker=1
각 dyno 는 별도로 청구됩니다. Basic 레벨에서 워커 dyno 를 추가하면 웹 dyno 에 $7/월이 추가됩니다. Standard dyno 는 더 비쌉니다.
웹과 워커 dyno 두 가지를 실행 중이라면, 비용 계획부터 시작하여 이를 고려하세요.
7 단계: 파일 스토리지 처리 (일시적 파일시스템 문제)
이는 Heroku 에서 Laravel 의 가장 일반적인 프로덕션 이슈이며 대부분의 튜토리얼은 이를 다루지 않습니다. Heroku dyno 는 일회용 파일 시스템을 사용합니다. dyno 가 재시작할 때마다 (배포, 재시작, 그리고 일상적인 사이클링 동안 하루에 약 한 번), 로컬 파일 시스템은 마지막 Git push 의 상태로 되돌립니다. 배포 후 스토리지/app/ 에 작성된 모든 파일이 사라집니다.
이는 다음에 영향을 줍니다:
사용자가 업로드한 파일
생성된 PDF 나 엑스포트
디스크에 작성된 캐시 응답
storage:link 심볼 링크 (재구성되지만, 이를 지목한 파일은 사라짐)
해결책은 dyno 에서 파일 스토리지를 완전히 제거하는 것입니다.
Laravel 을 S3 나 Cloudflare R2 를 사용하도록 구성하세요:
heroku config:set FILESYSTEM_DISK=s3
heroku config:set AWS_ACCESS_KEY_ID=your-key
heroku config:set AWS_SECRET_ACCESS_KEY=your-secret
heroku config:set AWS_DEFAULT_REGION=ap-south-1
heroku con
fig:set AWS_BUCKET=your-bucket-name
Install the AWS SDK: composer require league/flysystem-aws-s3-v3
Now Storage::put() and file uploads write to S3 instead of the local disk.
Step 8: Set Up Laravel Scheduler
Laravel's task scheduler expects to run php artisan schedule:run every minute via a system cron. Heroku does not give you a cron daemon. The workaround is the Heroku Scheduler addon. Add it from the dashboard or CLI:
heroku addons:create scheduler:standard
heroku addons:open scheduler
In the Scheduler dashboard, create a job:
Command: php artisan schedule:run
Frequency: Every 10 minutes (the minimum Heroku supports)
The limitation here is real: Laravel's scheduler is designed for minute-level precision. On Heroku you get 10-minute polling at best. Any scheduled job that needs to fire every minute will not work correctly.
If your app depends on precise scheduling, the alternative is to run php artisan schedule:work as a third Procfile process type. It is a persistent process that checks the schedule every minute. This costs another dyno.
_ Already running Laravel in production and tired of managing dynos, addons, and S3 workarounds? See how developers are deploying Laravel apps with an AI agent and going live on AWS without the manual config. _
Why Heroku Is Not Ideal for Laravel in Production
The steps above will get a Laravel app live on Heroku. The problem is not getting it live. The real issue is what happens when you try to run it properly in production.
Ephemeral filesystem forces extra infrastructure
Every file your app writes to disk is gone on the next deploy or dyno restart. File uploads, generated exports, cached views, storage symlinks. All of it disappears. You have to route everything through S3 or an equivalent, which means additional AWS setup, additional credentials to manage, and additional monthly cost before your app does anything meaningful.
Queue workers cost extra by design
A Laravel background worker is a persistent process. On Heroku, every persistent process needs its own dyno. That is a separate billing line every month just to run queue:work. Most Laravel apps beyond a basic CRUD need queues: emails, notifications, imports, anything async. On Heroku, that feature costs extra by default.
The scheduler is approximate, not exact
Laravel's task scheduler is built on the assumption that schedule:run fires every minute. Heroku Scheduler's minimum interval is 10 minutes. Any job that needs minute-level precision will not work.
Workaround (a schedule:work process dyno) 는 또 다른 유료 dyno 입니다. MySQL 은 쓸모없는 무료 티어를 가진 제 3 자 addon 을 필요로 합니다. Heroku 의 원생 데이터베이스는 PostgreSQL 입니다. 기존 Laravel 앱이 MySQL 에서 실행 중이라면, ClearDB 나 JawsDB 를 사용해야 하며, 둘 다 제 3 자 addon 입니다. ClearDB 의 무료 플랜은 5MB 의 스토리지 를 제공합니다. 이는 실제 데이터 가 있는 순간 채워집니다. 첫 번째 유료 티어는 $9.99/월 에서 시작하며 여전히 제한된 것입니다. 기본 dyno 에서는 제로 다운타임 배포가 없습니다. 표준 git push heroku main 은 빌드 및 릴리스 단계 동안 웹 dyno 를 일시적으로 오프라인으로 만듭니다. 제로 다운타임 롤링 배포는 Preboot 기능을 필요로 하며, 이는 더 비싼 Basic 보다 비용이 높은 Standard dyno 에서만 이용 가능합니다. 비용은 예상보다 빠르게 누적됩니다. $12/월 (Basic web dyno + Postgres Mini) 에서 시작합니다. Queue worker dyno 를 추가하면: $19. Heroku Scheduler 를 추가하여 정밀한 cron 을 얻으면 (process dyno): $26. Redis 를 추가하여 큐 백엔드를 얻으면: $29. S3 스토리지 비용을 추가합니다. MySQL 이 필요하면 유료 ClearDB 플랜을 추가합니다. 사용자를 한 명도 가지고 있지 않은 Laravel 앱에 대해 $60-80/월 까지 도달하며, 이는 모니터링, CDN, 또는 기본 이상의 SSL 관리 를 포함하지 않습니다. ** 이는 에지 케이스가 아닙니다. 실제 사용자 를 처리하는 모든 Laravel 앱의 표준 요구 사항 입니다. ** 여기서는 개발자들이 Heroku 에서 벗어나고 대신 사용하는 플랫폼 들에 대한 완전한 분석이 있습니다. Kuberns 로 Laravel 앱을 한 번 클릭으로 배포하세요. Kuberns 는 AWS 인프라 위에서 Laravel 앱을 배포하고 관리하는 에이전트 AI 클라우드 플랫폼 입니다. Heroku 가 수동으로 설정하도록 하는 모든 것을 처리합니다. 여기서는 프로세스 가 어떻게 보이는지 설명합니다: GitHub 저장소를 연결합니다. Kuberns 는 자동으로 Laravel 앱 을 감지합니다. Procfile 없음. 빌드팩 선택 없음. dyno 타입 선택 없음. AI 에이전트가 프로비저닝을 처리합니다. AWS 에서 서버, PHP 런타임, 웹 서버 설정, 환경 변수, 데이터베이스 를 배경에서 설정합니다. 인프라를 만지지 않습니다. 영구 스토리지는 내장되어 있습니다. 앱 이 스토리지 에 작성하는 파일은 배포 간에 보존됩니다. S3 설정이 필요하지 않으며, 클라우드 객체 스토리지를 특별히 원할 경우에만 필요합니다. 큐 워커 는 자동으로 실행됩니다. Kuberns 는 앱 이 큐 를 사용함을 감지하고 배포의 일부로 워크 프로세스 를 프로비저닝합니다. 별도의 청구 라인 없음. 기억해야 할 Procfile 엔트리 없음. 진정한 cron 스케줄링. Laravel Scheduler 는 설계대로 분당마다 실행됩니다. Heroku 가 제공하는 근사 10 분 간격 폴링 이 아닙니다. 제로 다운타임 배포가 기본입니다. 모든 푸시
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기