Laravel Forge je odličan alat, ali nije obavezan. €15-39 mjesečno + cijena servera + reci dodatak compliance ako trebaš EU lokalitet — može se brzo akumulirat. Plus, Forge te zaključa u svoj workflow. Za većinu Laravel projekata ne treba — Git deploy na cPanel sa par bash skripti daje isto, bez recurring trošak i bez vendor lock-in-a.
Ovaj vodič pokriva kompletan deploy pipeline za Laravel aplikaciju na cPanel hosting (kao WMD-ov), bez Forge-a — od Git repo setupa, pre-deploy provjera, do post-deploy migracija i queue restarta.
Što tipičan Laravel deploy treba
- Git pull najnovijeg koda iz main/production branche
- Composer install (bez dev dependencies)
- NPM install + build (ako su frontend asseti)
- Migracije baze (
php artisan migrate --force) - Clear + rebuild cachea (config, route, view)
- Restart queue workera (
php artisan queue:restart) - Optional: maintenance mode za vrijeme deploya
- Health check nakon deploya
Forge to radi kroz svoj UI. Mi to radimo kroz cPanel Git Version Control + jednostavnu deploy.sh skriptu.
Setup — korak po korak
1. Pripremi Laravel projekt
Lokalna razvojna postavka:
laravel new mojaapp
cd mojaapp
git init
git add .
git commit -m "initial"
git remote add origin git@github.com:user/mojaapp.git
git push -u origin main
U .gitignore dodaj/provjeri:
/vendor
/node_modules
/public/build
.env
.phpunit.result.cache
storage/*.key
storage/logs/*
storage/framework/cache/data/*
storage/framework/sessions/*
storage/framework/views/*
2. cPanel — postavi Git Version Control
- U cPanelu otvori Git Version Control.
- Klikni Create.
- Clone URL: tvoj GitHub/GitLab SSH URL.
- Repository Path:
/home/user/laravel-app(NE upublic_html!). - Branch:
main. - Repository Name:
mojaapp. - Klikni Create.
Provjeri da Git može pull-at iz tvog repo-a (deploy SSH key u GitHub repo settings).
3. Simbolički link public foldera
Laravel-ov public/ folder mora biti dostupan kroz web. Standardni cPanel servira iz ~/public_html. Dva pristupa:
Opcija A — simbolic link (preporučeno)
cd ~
rm -rf public_html
ln -s /home/user/laravel-app/public public_html
Opcija B — addon domain
Postaviš poseban subdomain (npr. app.tvojsajt.hr) koji pokazuje na laravel-app/public. Korisno ako na istom hosting paketu vrtiš više aplikacija.
4. Postavi .env na serveru
Ne commitaš .env u Git. Na serveru:
cd ~/laravel-app
cp .env.example .env
nano .env
# Setiraj APP_ENV=production, APP_DEBUG=false, DB credentials, MAIL, REDIS_HOST
php artisan key:generate
Lozinke i secrets nikad u repository.
5. Inicijalni composer + migrate
cd ~/laravel-app
composer install --optimize-autoloader --no-dev
php artisan migrate --force
php artisan storage:link
chmod -R 775 storage bootstrap/cache
Deploy skripta — deploy.sh
Ovo je srce pipeline-a. Snimi kao ~/laravel-app/.cpanel.yml (cPanel ga automatski pokreće nakon Git pull-a):
---
deployment:
tasks:
- export DEPLOYPATH=/home/user/laravel-app/
- cd $DEPLOYPATH
- /bin/php artisan down --retry=15
- /bin/composer install --optimize-autoloader --no-dev
- /bin/php artisan migrate --force
- /bin/php artisan config:cache
- /bin/php artisan route:cache
- /bin/php artisan view:cache
- /bin/php artisan event:cache
- /bin/php artisan queue:restart
- /bin/php artisan up
Tipovi error:
- Path za
phpicomposermože biti drugačiji na različitim hostovima — provjeri krozwhich phpiwhich composer. - Ako nemaš Composer instaliran globalno, instaliraj lokalno u home:
cd ~ curl -sS https://getcomposer.org/installer | php mv composer.phar ~/bin/composer chmod +x ~/bin/composer
Workflow — kako deploy radi u praksi
- Lokalno radiš na
mainbranchi (ili feature → PR → main). git push origin main.- U cPanel Git Version Control, klikni Manage na repo, pa Pull or Deploy tab, pa Update from Remote i Deploy HEAD Commit.
- cPanel pull-a najnoviji kod, izvršava
.cpanel.yml, vidiš log live. - Za 30 sekundi - 2 minute deploy je gotov, app je up.
Možeš i automatizirat preko webhook-a (GitHub → cPanel webhook URL pri push-u), ali za manje aplikacije manual deploy je dovoljan i sigurniji.
Queue worker — supervisor alternativa
Forge koristi Supervisor za queue worker management. Na cPanel hostingu možeš:
Opcija A — cPanel Cron Jobs
# Restart queue worker svakih 5 min ako padne
*/5 * * * * cd /home/user/laravel-app && /bin/php artisan queue:work --tries=3 --max-time=300 > /dev/null 2>&1
Worker se sam pokreće, radi 5 min, izlazi, cron ga pokreće opet. Jednostavno, robust, ne treba Supervisor.
Opcija B — Supervisor (ako provider podržava)
Većina shared cPanel hostova ne pruža Supervisor, ali ako imaš VPS, normalno:
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /home/user/laravel-app/artisan queue:work --sleep=3 --tries=3
autostart=true
autorestart=true
user=user
numprocs=4
Scheduler — Laravel cron
Laravel Scheduler treba master cron entry:
* * * * * cd /home/user/laravel-app && /bin/php artisan schedule:run >> /dev/null 2>&1
U cPanel Cron Jobs, postavi to. Onda u app/Console/Kernel.php definiraj sve scheduled jobove (daily, hourly, etc.) — Laravel ih sam routа.
SSL — Let's Encrypt automatski
cPanel ima AutoSSL. Pri kreiranju domene/subdomain-a, SSL se izda automatski u par minuta. Provjeri kroz SSL/TLS Status u cPanelu.
U .env postavi:
APP_URL=https://tvojsajt.hr
I forc-iraj HTTPS u AppServiceProvider::boot():
if (config('app.env') === 'production') {
URL::forceScheme('https');
}
Optimization — što Forge radi a ti moraš ručno
- OPcache — provjeri da je u php.ini enabled (na WMD-u jest po default-u).
- config:cache + route:cache + view:cache — već su u
.cpanel.ymldeploy task-u. - composer dump-autoload -o — optimizirani autoloader, već kroz
--optimize-autoloaderflag. - Database connection pool — koristi persistent connections u
config/database.phpako trebaš performance.
Monitoring i logovi
- Laravel logs:
storage/logs/laravel.log(ili daily logs po datumu). - cPanel access/error logs:
~/logs/ili kroz Errors u cPanelu. - Sentry, Bugsnag, Flare — integrate za external error tracking.
- Telescope (development) — premoćan za debugging.
Backup strategy
- JetBackup (na WMD-u) — automatski dnevni cijelog accounta.
- Database backup dodatno:
mysqldumpkroz cron, ili Laravel paket spatie/laravel-backup. - Storage (user uploadi) — backup u S3-compatible storage (Bunny, Wasabi) kroz Laravel filesystem driver.
Rollback strategija
Ako deploy razbije app:
- Git revert na production:
cd ~/laravel-app git revert HEAD git push origin main # Onda redeploy kroz cPanel UI - JetBackup restore baze — vrati DB state na pre-deploy.
- Maintenance mode u međuvremenu:
php artisan down.
Što WMD pristup pruža za Laravel
- PHP 5.6 - 8.3, Composer instaliran, NPM/Node dostupan
- cPanel Git Version Control predkonfiguriran
- SSH + WP-CLI + artisan dostupni
- Redis + Memcached za queue, cache, sessions
- MariaDB 10.6+ za bazu
- Let's Encrypt SSL automatski
- JetBackup retention 14-30 dana
- Cron Jobs UI za scheduler i queue worker
- Support koji zna Laravel — pomažemo s setup-om i debugging-om
Najčešća pitanja
Trebam li VPS za Laravel ili dosta managed shared hosting?
Mali Laravel projekti (low traffic, <100k req/dan) — managed shared sa NVMe i Redis dovoljno. Veći (saas, b2c platforma) — dedicated VPS bolji za isolation i resource control.
Mogu li koristit Forge plus cPanel istovremeno?
Tehnički da, ali nepotrebno. Forge upravlja VPS-om direktno, cPanel ima vlastiti management. Bilo Forge bilo cPanel, ne oboje.
Što sa zero-downtime deploy?
Za to ti treba blue-green deploy (Envoyer, Deployer paket). Standardni Git pull deploy ima ~10-30s downtime tijekom composer install i php artisan migrate. Za većinu apps prihvatljivo.
Što ako trebam queue worker koji vrti satima?
Long-running worker u cron + --max-time=3600 flag. Ili koristi --daemon mode + Supervisor (na VPS-u).