Deploy REST API Laravel ke Laravel Cloud - Perwira Learning Center


 

1. LATAR BELAKANG

    Setelah lima hari belajar dan membangun REST API yang lengkap—dengan routing, controller, database, validasi, error handling, API Resource, dan autentikasi menggunakan Sanctum—tiba saatnya untuk membawa aplikasi kita ke tahap yang sesungguhnya: deployment.

API yang kita bangun selama ini hanya berjalan di lingkungan lokal (localhost). Tentunya ini tidak bisa diakses oleh orang lain atau digunakan oleh tim frontend/mobile yang membutuhkan backend yang aktif 24/7. Deployment adalah proses memindahkan aplikasi dari lingkungan pengembangan ke lingkungan production yang dapat diakses publik.

Pada artikel tambahan ini, saya akan mempelajari cara mendeploy REST API Laravel ke Laravel Cloud—platform hosting resmi dari Laravel yang dirancang khusus untuk aplikasi Laravel. Mengapa Laravel Cloud?

  • Optimasi untuk Laravel - Konfigurasi otomatis untuk Laravel
  • Mudah digunakan - Tidak perlu pusing dengan konfigurasi server
  • SSL otomatis - HTTPS untuk keamanan API
  • Database terkelola - Tidak perlu setup database manual
  • Environment variables - Mudah mengelola konfigurasi production
  • Auto-scaling - Menyesuaikan dengan traffic


2. ALAT DAN BAHAN

2.1 Perangkat Lunak

  • Laravel 11 - Project API yang sudah selesai (dari artikel 1-5)
  • Git - Untuk version control dan push ke repository
  • Akun GitHub/GitLab/Bitbucket - Menyimpan repository kode
  • Akun Laravel Cloud - Platform deployment (https://cloud.laravel.com)
  • Postman/Thunder Client - Untuk testing API setelah deploy

2.2 Perangkat Keras

  • Laptop dengan koneksi internet stabil
  • Browser untuk mengakses Laravel Cloud dashboard


3. PEMBAHASAN

3.1 Persiapan Sebelum Deployment

Sebelum mendeploy, ada beberapa hal yang perlu kita persiapkan agar API kita siap untuk lingkungan production.

3.1.1 Membersihkan Kode dan Konfigurasi
bash
# Hapus file-file yang tidak diperlukan di production
# Contoh: file dump, file temporary, dll

# Generate key jika belum
php artisan key:generate

# Clear cache
php artisan config:clear
php artisan route:clear
php artisan view:clear
3.1.2 Menyiapkan File .env untuk Production

Buat template file .env.example yang akan digunakan sebagai referensi:

env
# File: .env.example

APP_NAME="Laravel API" APP_ENV=production APP_DEBUG=false APP_URL=https://your-app.laravel.cloud APP_KEY= DB_CONNECTION=mysql DB_HOST= DB_PORT=3306 DB_DATABASE= DB_USERNAME= DB_PASSWORD= SANCTUM_STATEFUL_DOMAINS=your-app.laravel.cloud SESSION_DOMAIN=.laravel.cloud # CORS untuk mengizinkan akses dari frontend
CORS_ALLOWED_ORIGINS=https://your-frontend-domain.com
3.1.3 Mengoptimalkan untuk Production
bash
# Optimasi untuk production
php artisan config:cache
php artisan route:cache
php artisan event:cache

# Optimasi autoloader Composer
composer install --optimize-autoloader --no-dev
3.1.4 Menyiapkan File Penting untuk Deployment

Pastikan file-file berikut ada di project:

composer.json (pastikan sudah lengkap):

json
{
"name": "laravel/laravel",
"type": "project",
"require": {
"php": "^8.1",
"guzzlehttp/guzzle": "^7.2",
"laravel/framework": "^10.0",
"laravel/sanctum": "^3.2",
"laravel/tinker": "^2.8"
},
"require-dev": {
"laravel/pint": "^1.0",
"laravel/sail": "^1.18",
"mockery/mockery": "^1.4.4",
"nunomaduro/collision": "^7.0",
"phpunit/phpunit": "^10.0"
},
"scripts": {
"post-autoload-dump": [
"Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
"@php artisan package:discover --ansi"
],
"post-root-package-install": [
"@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
],
"post-create-project-cmd": [
"@php artisan key:generate --ansi"
]
}
}

3.2 Git dan Repository

3.2.1 Inisialisasi Git
bash
# Inisialisasi git di project
git init

# Buat .gitignore (sudah otomatis dari Laravel)
# Pastikan file berikut masuk .gitignore:
# /vendor
# .env
# .idea/
# node_modules/
# storage/*.key
# .phpunit.result.cache

# Add semua file
git add .

# Commit pertama
git commit -m "Initial commit: Laravel REST API complete"
3.2.2 Push ke GitHub
bash
# Buat repository baru di GitHub (jangan inisialisasi dengan README)
# Lalu jalankan:
git remote add origin https://github.com/username/nama-repo.git
git branch -M main
git push -u origin main

3.3 Deployment ke Laravel Cloud

3.3.1 Mendaftar dan Login ke Laravel Cloud
  1. Buka https://cloud.laravel.com
  2. Daftar/Login menggunakan akun GitHub/Laravel
  3. Setelah login, akan masuk ke dashboard

3.3.2 Membuat Project Baru
  1. Klik tombol "New Project"
  2. Pilih "Deploy from Git"
  3. Pilih provider Git (GitHub, GitLab, atau Bitbucket)
  4. Authorize Laravel Cloud untuk mengakses repository
  5. Pilih repository yang sudah kita push

3.3.3 Konfigurasi Environment Variables

Setelah memilih repository, kita akan diminta mengisi environment variables:

VariableNilaiKeterangan
APP_NAME"My Laravel API"Nama aplikasi
APP_ENVproductionEnvironment
APP_DEBUGfalseMatikan debug di production
APP_KEY(akan digenerate otomatis)Jangan diisi manual
APP_URLhttps://nama-project.laravel.cloudURL aplikasi
DB_CONNECTIONmysqlDatabase connection
DB_DATABASE(disediakan platform)Nama database
DB_USERNAME(disediakan platform)Username database
DB_PASSWORD(disediakan platform)Password database

Tips: Untuk database, Laravel Cloud biasanya menyediakan database terkelola. Kita bisa memilih "Add database" dan environment variables akan terisi otomatis.

3.3.4 Menambahkan Database
  1. Di dashboard project, klik tab "Databases"
  2. Klik "Create Database"
  3. Pilih tipe database (MySQL)
  4. Setelah database dibuat, environment variables akan otomatis terisi

3.3.5 Konfigurasi Build Command

Laravel Cloud akan menjalankan perintah build. Pastikan kita mengatur:

bash
# Build commands (default sudah baik)
composer install --no-interaction --prefer-dist --optimize-autoloader
php artisan migrate --force
php artisan config:cache
php artisan route:cache
3.3.6 Deploy Pertama
  1. Klik "Deploy" atau "Trigger Deployment"
  2. Tunggu proses build selesai (5-10 menit)
  3. Lihat log deployment untuk memastikan tidak ada error

3.4 Post-Deployment Configuration

3.4.1 Menjalankan Migration di Production

Setelah deploy pertama, kita perlu menjalankan migration:

bash
# Bisa melalui terminal di dashboard Laravel Cloud
php artisan migrate --force

Atau jalankan seeder jika perlu:

bash
php artisan db:seed --force
3.4.2 Konfigurasi CORS

Agar API bisa diakses dari frontend (React, Vue, atau mobile app), konfigurasi CORS di file config/cors.php:

php
<?php
// File: config/cors.php

return [
'paths' => ['api/*', 'sanctum/csrf-cookie'],
'allowed_methods' => ['*'],
'allowed_origins' => [
'https://frontend-domain.com',
'http://localhost:3000', // untuk development
'https://mobile-app.com'
],
'allowed_origins_patterns' => [],
'allowed_headers' => ['*'],
'exposed_headers' => [],
'max_age' => 0,
'supports_credentials' => true,
];

Setelah mengubah, deploy ulang aplikasi.

3.4.3 Konfigurasi Sanctum untuk Production

Jika menggunakan Sanctum untuk autentikasi, pastikan konfigurasi sudah benar:

php
// File: config/sanctum.php

'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf(
'%s%s',
'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1',
env('APP_URL') ? ','.parse_url(env('APP_URL'), PHP_URL_HOST) : ''
))),

Di .env production:

env
SANCTUM_STATEFUL_DOMAINS=your-app.laravel.cloud,frontend-domain.com
SESSION_DOMAIN=.laravel.cloud

3.5 Testing API yang Sudah di Deploy

Setelah deploy berhasil, kita akan mendapatkan URL seperti:

text
https://nama-project.laravel.cloud

Sekarang API kita bisa diakses publik. Mari kita test beberapa endpoint:

3.5.1 Test Endpoint Publik

Request:

text
GET https://nama-project.laravel.cloud/api/posts

Response (200):

json
{
"success": true,
"message": "Daftar post berhasil diambil",
"data": [...],
"meta": {
"current_page": 1,
"last_page": 5,
"total": 50
}
}
3.5.2 Test Register

Request:

text
POST https://nama-project.laravel.cloud/api/auth/register
Content-Type: application/json

{ "name": "User Baru", "email": "user@example.com", "password": "password123", "password_confirmation": "password123"
}

Response (201):

json
{
"success": true,
"message": "Registrasi berhasil",
"data": {
"user": {...},
"token": "1|a1b2c3d4e5f6g7h8i9j0..."
}
}
3.5.3 Test Login

Request:

text
POST https://nama-project.laravel.cloud/api/auth/login
Content-Type: application/json

{ "email": "user@example.com", "password": "password123"
}

Response (200):

json
{
"success": true,
"message": "Login berhasil",
"data": {
"user": {...},
"token": "2|k1l2m3n4o5p6q7r8s9t0..."
}
}
3.5.4 Test Protected Endpoint

Request:

text
POST https://nama-project.laravel.cloud/api/posts
Authorization: Bearer 2|k1l2m3n4o5p6q7r8s9t0...
Content-Type: application/json

{ "title": "Post dari Production", "content": "Ini adalah post yang dibuat di server production", "category_id": 1
}

Response (201):

json
{
"success": true,
"message": "Post berhasil dibuat",
"data": {
"id": 51,
"title": "Post dari Production",
"content": "Ini adalah post yang dibuat di server production",
"user_id": 1,
"created_at": "2026-02-28T10:30:00Z"
}
}

3.6 Mengelola Deployment

3.6.1 Deployment Selanjutnya

Setiap kali kita melakukan perubahan pada kode dan push ke repository:

bash
git add .
git commit -m "Fix bug di API posts"
git push origin main

Laravel Cloud akan otomatis mendeteksi perubahan dan melakukan deploy ulang (jika diatur auto-deploy).

3.6.2 Melihat Log dan Monitoring

Di dashboard Laravel Cloud, kita bisa melihat:

  1. Deployment Logs - Riwayat dan status setiap deployment
  2. Application Logs - Log aplikasi (error, info, dll)
  3. Metrics - CPU usage, memory, request count
  4. Database Metrics - Kinerja database

3.6.3 Rollback Jika Terjadi Masalah

Jika deployment baru menyebabkan error, kita bisa rollback ke versi sebelumnya:

  1. Buka tab "Deployments"
  2. Cari deployment yang stabil
  3. Klik "Rollback to this deployment"

3.7 Menambahkan Custom Domain

Laravel Cloud menyediakan domain *.laravel.cloud secara default. Jika ingin menggunakan domain sendiri:

  1. Buka tab "Domains"
  2. Klik "Add Domain"
  3. Masukkan domain (contoh: api.namaproject.com)
  4. Ikuti petunjuk untuk mengatur DNS (biasanya menambah CNAME record)
  5. Tunggu propagasi DNS (bisa 1-24 jam)
  6. SSL certificate akan otomatis terpasang

3.8 Environment-Specific Configuration

3.8.1 Membedakan Konfigurasi Lokal dan Production

Kita bisa memiliki file konfigurasi berbeda untuk environment berbeda:

php
// File: config/app.php

'name' => env('APP_NAME', 'Laravel'),
'env' => env('APP_ENV', 'production'),
'debug' => (bool) env('APP_DEBUG', false),
'url' => env('APP_URL', 'http://localhost'),

Di .env lokal:

env
APP_ENV=local
APP_DEBUG=true
APP_URL=http://localhost:8000

Di Laravel Cloud (environment variables):

env
APP_ENV=production
APP_DEBUG=false
APP_URL=https://api.namaproject.com
3.8.2 Menggunakan Fitur Feature Flags

Untuk mengaktifkan/menonaktifkan fitur di production:

php
// config/features.php
return [
'social_login' => env('FEATURE_SOCIAL_LOGIN', false),
'file_upload' => env('FEATURE_FILE_UPLOAD', true),
'comments' => env('FEATURE_COMMENTS', true)
];

// Di controller
if (config('features.comments')) {
// Tampilkan fitur komentar
}

3.9 Optimasi untuk Production

3.9.1 Caching

Pastikan semua cache sudah dijalankan:

bash
# Jalankan di server setelah deploy
php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan event:cache
3.9.2 Queue untuk Tugas Berat

Jika API kita memiliki tugas berat (mengirim email, proses gambar), gunakan queue:

php
// Contoh: mengirim email setelah registrasi
dispatch(new SendWelcomeEmail($user));

Konfigurasi queue di production:

env
QUEUE_CONNECTION=database
3.9.3 Rate Limiting

Batasi jumlah request untuk mencegah abuse:

php
// File: app/Http/Kernel.php

protected $middlewareGroups = [
'api' => [
'throttle:60,1', // 60 request per menit
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
];

// Atau per endpoint
Route::middleware('throttle:10,1')->group(function () {
Route::post('/posts', [PostController::class, 'store']);
});

3.10 Keamanan di Production

3.10.1 HTTPS

Laravel Cloud otomatis menyediakan SSL, pastikan semua request diarahkan ke HTTPS:

php
// File: app/Providers/AppServiceProvider.php

public function boot()
{
if (env('APP_ENV') === 'production') {
\URL::forceScheme('https');
}
}
3.10.2 Headers Keamanan

Tambahkan middleware untuk security headers:

bash
php artisan make:middleware SecurityHeaders
php
// app/Http/Middleware/SecurityHeaders.php

public function handle($request, Closure $next)
{
$response = $next($request);
$response->headers->set('X-Frame-Options', 'DENY');
$response->headers->set('X-Content-Type-Options', 'nosniff');
$response->headers->set('X-XSS-Protection', '1; mode=block');
$response->headers->set('Referrer-Policy', 'strict-origin-when-cross-origin');
return $response;
}

Daftarkan di Kernel:

php
protected $middleware = [
// ...
\App\Http\Middleware\SecurityHeaders::class,
];
3.10.3 Environment Variables Sensitif

Pastikan tidak menyimpan data sensitif di kode:

  • Jangan hardcode API keys di controller
  • Jangan commit file .env ke Git
  • Simpan semua rahasia di environment variables Laravel Cloud

3.11 Monitoring dan Alert

3.11.1 Setup Monitoring

Laravel Cloud menyediakan monitoring dasar. Untuk monitoring lebih lanjut, bisa integrasi dengan:

  1. Laravel Pulse - Monitoring untuk Laravel
  2. Sentry - Error tracking
  3. New Relic - Application performance monitoring

3.11.2 Setup Alert

Atur notifikasi jika terjadi masalah:

  • Email alert jika 5xx errors meningkat
  • Slack/Discord notification untuk deployment
  • SMS untuk critical issues

3.12 Dokumentasi API di Production

Jangan lupa untuk menyediakan dokumentasi API:

Menggunakan Scribe (paket populer):

bash
composer require --dev knuckleswtf/scribe
php artisan scribe:generate

Hasilnya akan ada di public/docs dan bisa diakses di:

text
https://api.namaproject.com/docs

3.13 Kendala dan Solusi saat Deployment

KendalaSolusi
APP_KEY tidak adaGenerate key: php artisan key:generate lalu set di environment variables
Migration errorCek koneksi database, pastikan database sudah dibuat
CORS errorKonfigurasi CORS dengan benar, tambahkan domain frontend
404 not foundPastikan route sudah di-cache, cek file .htaccess atau Nginx config
500 server errorCek log di dashboard, aktifkan debug sementara untuk tracing
Token Sanctum tidak validPastikan SANCTUM_STATEFUL_DOMAINS sudah benar
File upload gagalCek permission folder storage, set FILESYSTEM_DISK=public
Memory limitUpgrade plan atau optimasi query dan kode

4. KESIMPULAN

Deployment adalah tahap akhir yang mengubah API lokal menjadi produk nyata yang bisa digunakan oleh banyak orang. Dengan Laravel Cloud, proses deployment menjadi sangat mudah dan terstruktur:

Tahapan Deployment yang Sudah Dilakukan:

  1. Persiapan
    • Membersihkan kode
    • Mengoptimalkan untuk production
    • Menyiapkan environment variables
  2. Version Control

    • Inisialisasi Git
    • Push ke repository GitHub
  3. Deployment ke Laravel Cloud

    • Membuat project
    • Konfigurasi database
    • Set environment variables
    • Menjalankan deployment
  4. Post-Deployment

    • Testing endpoint
    • Konfigurasi CORS
    • Setup custom domain
    • Monitoring dan alert
Manfaat yang didapatkan:

  • API bisa diakses publik 24/7
  • HTTPS untuk keamanan data
  • Database terkelola (backup otomatis)
  • Skalabilitas (menyesuaikan traffic)
  • Monitoring dan logging terpusat
  • Mudah rollback jika terjadi masalah

Sekarang API Laravel kita sudah hidup di cloud dan siap digunakan oleh:

  • Frontend developer (React, Vue, Angular)
  • Mobile developer (Android, iOS, Flutter)
  • Third-party applications
  • Integrasi dengan layanan lain


5. DAFTAR PUSTAKA

Posting Komentar

0 Komentar