Bagian 12 dari seri

Deploy Sistem Kasir Laravel ke Hosting Production

Diterbitkan 16 September 2026

Pada tahap terakhir kita akan melakukan deployment Sistem Kasir Laravel ke hosting atau server production.

Tahap ini dilakukan setelah aplikasi sudah selesai diuji pada Tahap 11.

Tujuan deployment adalah memindahkan aplikasi dari komputer lokal ke server agar dapat digunakan melalui domain atau jaringan produksi.

Pada tahap ini kita akan membahas:

persiapan production
backup
konfigurasi .env
database production
upload project
Composer dependency
document root ke public
permission storage
storage link
migration
cache production
HTTPS
APP_DEBUG
akun awal
testing setelah deploy
backup berkala

Sebelum memulai, pastikan seluruh fitur utama sudah selesai:

login
role admin/kasir
master data
produk
penjualan
pembelian
stok
kartu stok
adjustment
dashboard
laporan
nota
testing

Hasil yang Akan Dicapai

Setelah tahap ini selesai:

  • aplikasi dapat dibuka dari server;
  • database production terhubung;
  • asset dan route berjalan;
  • storage writable;
  • migration production selesai;
  • APP_DEBUG dimatikan;
  • HTTPS digunakan;
  • cache production aktif;
  • akun awal tersedia;
  • backup disiapkan;
  • aplikasi siap digunakan.

1. Jangan Deploy Sebelum Testing Selesai

Sebelum upload, jalankan:

php artisan test

Pastikan test utama lulus.

Kemudian cek manual:

login
produk
penjualan
pembelian
stok
laporan
nota

Jangan menjadikan server production sebagai tempat pertama kali menguji fitur.

2. Backup Project Lokal

Simpan salinan project sebelum deployment.

Minimal backup:

source code
.env lokal
database lokal jika diperlukan

Jika menggunakan Git, pastikan perubahan sudah dicommit.

Contoh:

git status

Kemudian commit bila diperlukan.

3. Jangan Upload .env Lokal Apa Adanya

File:

.env

berisi konfigurasi lokal.

Contoh lokal:

APP_ENV=local
APP_DEBUG=true
DB_DATABASE=kasir_laravel
DB_USERNAME=root
DB_PASSWORD=

Konfigurasi production harus berbeda.

4. Contoh .env Production

Contoh:

APP_NAME="Sistem Kasir"
APP_ENV=production
APP_KEY=
APP_DEBUG=false
APP_URL=https://kasir.domainanda.com

APP_LOCALE=id
APP_FALLBACK_LOCALE=id
APP_FAKER_LOCALE=id_ID

LOG_CHANNEL=stack
LOG_LEVEL=error

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=nama_database_production
DB_USERNAME=user_database_production
DB_PASSWORD=password_database_production

SESSION_DRIVER=database
SESSION_LIFETIME=120

CACHE_STORE=file

QUEUE_CONNECTION=database

FILESYSTEM_DISK=local

MAIL_MAILER=log

Sesuaikan nilai berdasarkan hosting.

5. APP_ENV Production

Gunakan:

APP_ENV=production

Jangan:

APP_ENV=local

pada server production.

6. Matikan APP_DEBUG

Gunakan:

APP_DEBUG=false

Ini sangat penting.

Jika:

APP_DEBUG=true

error dapat menampilkan informasi teknis sensitif.

Pada production jangan menampilkan stack trace kepada pengguna.

7. APP_URL

Isi:

APP_URL=https://kasir.domainanda.com

Gunakan domain sebenarnya.

Jika aplikasi berada pada subdomain:

kasir.example.com

gunakan URL tersebut.

8. Membuat Database Production

Melalui panel hosting atau server database, buat:

database
database user
password

Contoh:

database : kasir_prod
user     : kasir_user
password : password-kuat

Berikan permission yang diperlukan kepada user database.

9. Jangan Menggunakan User Root Database

Pada production sebaiknya jangan menggunakan:

root

Gunakan user database khusus aplikasi.

10. Upload Project Laravel

Project Laravel dapat diupload melalui:

Git
SSH
FTP
File Manager
deployment tool

Struktur project harus tetap lengkap.

Contoh:

app
bootstrap
config
database
public
resources
routes
storage
vendor
artisan
composer.json

11. Cara Terbaik: Document Root ke Folder public

Web server harus mengarah ke:

project/public

Bukan ke root project Laravel.

Contoh:

/home/user/kasir-laravel/public

Document root domain/subdomain diarahkan ke folder tersebut.

12. Mengapa Harus public?

Folder:

public

berisi file entry:

index.php

File sensitif seperti:

.env
composer.json
app
config

tidak boleh langsung tersedia dari web.

13. Jika Shared Hosting Tidak Bisa Mengubah Document Root

Beberapa shared hosting memiliki batasan.

Cara umum:

Laravel project di luar public_html
isi public Laravel dipindah ke public_html

Jika melakukan ini, path pada:

index.php

harus disesuaikan.

Namun metode ini bergantung pada struktur hosting.

Jika hosting memungkinkan document root custom, lebih baik arahkan langsung ke:

project/public

14. Install Dependency Composer

Jika server memiliki SSH:

composer install --no-dev --optimize-autoloader

Gunakan:

--no-dev

agar dependency development tidak ikut dipasang.

15. Jika Hosting Tidak Memiliki Composer

Alternatifnya dependency dapat diinstall lokal lalu folder:

vendor

ikut diupload.

Namun cara ini kurang ideal jika environment server berbeda.

Jika memungkinkan, jalankan Composer langsung pada server.

16. Membuat APP_KEY

Jika APP_KEY belum tersedia:

php artisan key:generate

Pastikan hasilnya masuk ke .env.

Jangan mengganti APP_KEY pada aplikasi production yang sudah digunakan tanpa memahami dampaknya.

17. Permission Storage

Laravel membutuhkan write access pada:

storage
bootstrap/cache

Pada Linux server, permission dapat disesuaikan.

Contoh umum:

chmod -R 775 storage
chmod -R 775 bootstrap/cache

Owner/group harus sesuai user web server.

Jangan sembarangan menggunakan:

777

jika tidak diperlukan.

18. Membersihkan Cache Lama

Setelah upload:

php artisan optimize:clear

Perintah ini membantu membersihkan cache config, route, view, dan lainnya.

19. Menjalankan Migration Production

Setelah koneksi database benar:

php artisan migrate --force

Pada production Laravel meminta konfirmasi tambahan, sehingga:

--force

digunakan untuk menjalankan migration.

Pastikan database yang dituju benar sebelum menjalankan.

20. Jangan Gunakan migrate:fresh di Production

Jangan jalankan:

php artisan migrate:fresh

pada production.

Perintah tersebut menghapus seluruh tabel.

Gunakan:

php artisan migrate --force

21. Seeder pada Production

Seeder tutorial berisi data contoh seperti:

admin@example.com
kasir@example.com
produk contoh
stok awal

Jangan otomatis menjalankan seluruh seeder pada production jika tidak memang dibutuhkan.

Jika ingin membuat akun awal, lebih aman gunakan seeder khusus production atau buat user manual.

22. Membuat Admin Production via Tinker

Jalankan:

php artisan tinker

Kemudian:

use App\Models\User;
use Illuminate\Support\Facades\Hash;

Buat admin:

User::create([
    'name' => 'Administrator',
    'email' => 'admin@domainanda.com',
    'password' => Hash::make('password-kuat-anda'),
    'role' => 'admin',
    'is_active' => true,
]);

Keluar:

exit

Gunakan password yang kuat dan berbeda dari tutorial.

23. Jangan Gunakan Password Tutorial

Jangan gunakan:

admin12345
kasir12345

di production.

Password tersebut hanya untuk tutorial.

24. Storage Link

Jika aplikasi menggunakan file public storage:

php artisan storage:link

Saat ini tutorial kasir belum banyak menggunakan upload file, tetapi link ini berguna jika fitur upload ditambahkan nanti.

25. Cache Config Production

Setelah .env final:

php artisan config:cache

26. Cache Route

Jika route kompatibel dengan route cache:

php artisan route:cache

27. Cache View

Jalankan:

php artisan view:cache

28. Optimize

Dapat juga menggunakan:

php artisan optimize

Gunakan setelah konfigurasi production stabil.

29. Jika Mengubah .env

Setelah mengubah .env, jangan lupa:

php artisan optimize:clear
php artisan config:cache

Jika config lama masih tercache, perubahan .env mungkin tidak langsung terbaca.

30. HTTPS

Production sebaiknya menggunakan:

https://

Aktifkan SSL pada domain/subdomain.

Contoh:

https://kasir.domainanda.com

HTTPS penting karena aplikasi menangani:

login
session
data transaksi

31. Redirect HTTP ke HTTPS

Konfigurasi dapat dilakukan dari:

hosting panel
web server
reverse proxy

Pastikan pengguna tidak menggunakan koneksi HTTP biasa.

32. Session Production

Pastikan session bekerja.

Login lalu buka beberapa halaman.

Jika user selalu logout sendiri, periksa:

SESSION_DRIVER
cookie
domain
HTTPS
permission

33. Queue

Tutorial dasar belum membutuhkan queue untuk transaksi utama.

Jika:

QUEUE_CONNECTION=database

dan ada job queued, server perlu worker.

Untuk aplikasi dasar yang belum memakai job, hal ini belum kritis.

34. Cron Scheduler

Jika di masa depan menggunakan scheduler, tambahkan cron:

php artisan schedule:run

setiap menit melalui cron server.

Namun tutorial kasir dasar belum membutuhkan scheduler wajib.

35. Cek Route Production

Jalankan:

php artisan route:list

Pastikan route utama tersedia.

36. Cek Migration Status

Jalankan:

php artisan migrate:status

Pastikan migration:

Ran

37. Cek Config

Jalankan:

php artisan about

Periksa environment.

Harus:

production

38. Uji Login Production

Buka domain.

Uji:

login admin
logout
login kasir

Pastikan session stabil.

39. Uji Hak Akses Production

Admin:

master data
produk
pembelian
stok
laporan

Kasir:

penjualan
dashboard

Pastikan route admin tidak dapat dibuka kasir.

40. Uji Produk Production

Tambahkan satu produk percobaan.

Pastikan:

SKU
kategori
satuan
harga
status

berfungsi.

41. Uji Penjualan Production

Buat transaksi kecil.

Periksa:

sale
sale_details
stock berkurang
stock movement
nota

42. Uji Pembelian Production

Buat pembelian kecil.

Periksa:

purchase
purchase_details
stock bertambah
purchase_price
stock movement

43. Uji Kartu Stok

Buka produk yang diuji.

Pastikan movement:

purchase
sale

terlihat.

44. Uji Nota Thermal

Jika printer tersedia, lakukan print nyata.

Periksa:

58mm
80mm
margin
font
kertas

45. Uji Laporan

Pastikan laporan production:

paid
cancelled
filter tanggal
filter kasir
invoice

berjalan.

46. Cek Log Error

Laravel menyimpan log pada:

storage/logs

Periksa jika ada error production.

Jangan menghapus log tanpa alasan saat sedang debugging.

47. Permission Log

Jika Laravel tidak dapat menulis log, cek permission:

storage

48. Backup Database Production

Buat backup berkala.

Minimal:

database

dan jika ada upload:

storage/app

Backup dapat dilakukan melalui:

hosting panel
mysqldump
backup service

49. Backup Sebelum Update

Sebelum deployment update:

backup database
backup source code

terlebih dahulu.

50. Simulasi Restore

Backup yang baik harus pernah diuji restore.

Jangan hanya membuat file backup tanpa memastikan file tersebut dapat digunakan.

51. Strategi Update Aplikasi

Saat ada perubahan source code:

backup
upload/pull code
composer install
migrate
clear/cache config
test cepat

Contoh:

git pull
composer install --no-dev --optimize-autoloader
php artisan migrate --force
php artisan optimize:clear
php artisan optimize

Sesuaikan dengan metode deployment.

52. Maintenance Mode

Saat update besar:

php artisan down

Setelah selesai:

php artisan up

Ini mencegah user melakukan transaksi saat struktur aplikasi sedang berubah.

53. Jangan Maintenance Terlalu Lama

Untuk aplikasi kasir aktif, deployment sebaiknya dilakukan pada waktu aktivitas rendah.

54. Security Checklist

Pastikan:

APP_DEBUG=false
HTTPS aktif
password kuat
.env tidak public
document root ke public
database user khusus
role route benar
backup tersedia
server update

55. .env Tidak Boleh Masuk Git Public

Pastikan:

.env

tidak disimpan di repository public.

Laravel biasanya sudah memasukkannya ke .gitignore.

56. Jangan Menampilkan Error Database ke User

Dengan:

APP_DEBUG=false

pengguna tidak melihat detail exception.

Error teknis dapat diperiksa di log.

57. Batasi Akses Server

Jika menggunakan VPS:

SSH key
firewall
user non-root
update package

sangat disarankan.

Namun detail hardening server berada di luar cakupan tutorial Laravel dasar ini.

58. Production Database dan Testing Database Harus Terpisah

Jangan gunakan database production untuk:

php artisan test

Gunakan database testing terpisah.

59. Jangan Jalankan Seeder Development Setelah Go-Live

Seeder seperti:

KasirSeeder

dapat mengubah data contoh.

Setelah aplikasi production berjalan, jangan menjalankan seeder development sembarangan.

60. Cek Timezone

Pastikan timezone aplikasi sesuai kebutuhan.

Jika bisnis berada di Indonesia tengah misalnya:

Asia/Makassar

konfigurasi dapat diatur pada:

config/app.php

atau sesuai konfigurasi project.

Pastikan waktu:

sale_date
purchase_date
created_at

sesuai lokasi operasional.

61. Cek Format Tanggal

Uji transaksi dan lihat apakah:

tanggal
jam

sesuai.

Jika berbeda, cek timezone server dan aplikasi.

62. Domain atau Subdomain

Sistem kasir sebaiknya dapat ditempatkan pada:

kasir.domainanda.com

atau:

domainanda.com/kasir

Subdomain biasanya lebih mudah untuk mengatur document root langsung ke folder public.

63. LAN / Local Server

Jika aplikasi hanya digunakan di toko lokal, Laravel juga dapat ditempatkan pada server lokal/LAN.

Konsep deployment sama:

production config
database
web server
public root
backup

64. Jika Menggunakan Shared Hosting

Perhatikan:

PHP version
extension PHP
Composer
SSH
document root
database
cron
SSL

Pastikan hosting mendukung versi PHP yang dibutuhkan Laravel 13.

65. Extension PHP

Laravel dan package project dapat membutuhkan extension seperti:

ctype
curl
dom
fileinfo
filter
hash
mbstring
openssl
pcre
pdo
session
tokenizer
xml

Hosting modern biasanya sudah menyediakan sebagian besar kebutuhan.

Jika Composer error karena extension, cek pesan error.

66. Jika 500 Internal Server Error

Periksa:

APP_KEY
permission
.env
storage/logs
PHP version
Composer dependency
document root

Lihat log Laravel.

67. Jika CSS/JS Tidak Tampil

Periksa:

APP_URL
asset path
document root
HTTPS

Jika menggunakan Vite build, asset production harus sudah dibuild.

68. Build Asset Production

Jika project menggunakan Vite:

npm install
npm run build

Hasil build biasanya masuk ke:

public/build

Pastikan folder hasil build ikut tersedia di server.

69. Jika Menggunakan Bootstrap CDN

Pada tutorial ini banyak view menggunakan Bootstrap CDN.

Dalam kondisi tersebut tidak ada build Bootstrap lokal yang wajib.

Namun jika layout sudah diubah menggunakan Vite, ikuti proses build project.

70. Jika Route 404

Pastikan:

document root
rewrite rule
public/.htaccess
web server config

benar.

Pada Apache shared hosting, file:

public/.htaccess

harus tersedia.

71. Jika Storage Tidak Bisa Ditulis

Error dapat muncul saat:

session
cache
log

Pastikan:

storage
bootstrap/cache

writable oleh web server.

72. Jika Login Selalu 419

Periksa:

session
CSRF
APP_URL
HTTPS
cookie
permission

Pastikan session dapat ditulis.

73. Jika Migration Gagal

Jangan menjalankan perintah random.

Periksa:

database credential
database permission
urutan migration
existing table
foreign key

Lihat pesan error secara lengkap melalui terminal/log.

74. Monitoring Setelah Go-Live

Pada beberapa hari awal, periksa:

Laravel log
error 500
stok
transaksi
backup
disk space

75. Audit Stok Setelah Go-Live

Secara berkala bandingkan:

products.stock

dengan:

sum(quantity_in) - sum(quantity_out)

Ini dapat membantu mendeteksi masalah integritas stok.

76. Audit Transaksi Cancelled

Periksa bahwa cancelled:

tidak masuk omzet
stok sudah direversal
tidak diproses dua kali

77. Checklist Go-Live

Sebelum menyatakan aplikasi siap:

[ ] test lulus
[ ] APP_ENV=production
[ ] APP_DEBUG=false
[ ] APP_KEY tersedia
[ ] APP_URL benar
[ ] database production benar
[ ] database user khusus
[ ] document root ke public
[ ] composer install production
[ ] permission storage benar
[ ] migration selesai
[ ] HTTPS aktif
[ ] login bekerja
[ ] role bekerja
[ ] penjualan bekerja
[ ] pembelian bekerja
[ ] stok bekerja
[ ] laporan bekerja
[ ] nota bekerja
[ ] backup tersedia

78. Checklist Setelah Go-Live

Setelah digunakan:

[ ] cek log
[ ] cek transaksi pertama
[ ] cek movement stok
[ ] cek laporan
[ ] cek printer
[ ] cek backup
[ ] cek user role

79. Kesalahan Umum: APP_DEBUG Tetap True

Ini salah satu kesalahan deployment paling umum.

Pastikan:

APP_DEBUG=false

80. Kesalahan Umum: Root Domain Mengarah ke Root Laravel

Document root harus ke:

public

bukan folder project utama.

81. Kesalahan Umum: migrate:fresh di Production

Jangan pernah menggunakan:

php artisan migrate:fresh

pada database production yang berisi data.

82. Kesalahan Umum: Menjalankan Seeder Tutorial

Jangan menjalankan seeder development tanpa mengecek isinya.

Seeder dapat membuat:

akun demo
produk demo
stok demo

83. Kesalahan Umum: Tidak Backup

Jangan menunggu terjadi masalah baru memikirkan backup.

84. Kesalahan Umum: Tidak Menguji Restore

File backup yang tidak pernah diuji restore belum tentu dapat diandalkan.

85. Kesalahan Umum: Password Admin Tutorial Tetap Digunakan

Ganti seluruh credential default.

86. Kesalahan Umum: HTTPS Tidak Aktif

Login dan session sebaiknya melalui HTTPS.

87. Kesalahan Umum: Update Code Tanpa Maintenance

Jika migration dan code berubah bersamaan, user dapat mengakses kondisi aplikasi setengah update.

Gunakan maintenance mode untuk perubahan besar.

88. Struktur Akhir Sistem

Setelah seluruh seri selesai, modul utama sistem adalah:

Autentikasi
Role admin/kasir
Kategori
Satuan
Pelanggan
Supplier
Produk
Penjualan
Pembelian
Stok
Kartu stok
Adjustment
Dashboard
Laporan
Nota
Testing
Deployment

89. Alur Sistem Akhir

Alur utama:

Admin menyiapkan master
        ↓
Admin membuat produk
        ↓
Admin melakukan pembelian
        ↓
Stok bertambah
        ↓
Kasir melakukan penjualan
        ↓
Stok berkurang
        ↓
Movement tercatat
        ↓
Dashboard dan laporan diperbarui
        ↓
Nota dapat dicetak

Jika ada selisih stok:

stock opname
        ↓
adjustment
        ↓
movement tercatat

90. Ringkasan 12 Tahap Tutorial

Struktur final seri:

01 Persiapan dan Login
02 Struktur Database
03 Model, Relasi, dan Seeder
04 CRUD Master Data
05 CRUD Produk
06 Transaksi Penjualan
07 Pembelian dan Stok
08 Kartu Stok dan Penyesuaian Stok
09 Dashboard dan Laporan
10 Cetak Nota Kasir
11 Pengujian Sistem Kasir
12 Deploy Sistem Kasir

URL lama yang sudah publish tetap dipertahankan pada bagian yang sudah ada.

Artikel baru hanya ditambahkan untuk memecah topik yang sebelumnya terlalu padat.

91. Pengembangan Selanjutnya

Sistem masih dapat dikembangkan dengan:

barcode scanner
multi cabang
multi gudang
retur penjualan
retur pembelian
diskon per item
member
poin pelanggan
hutang supplier
piutang pelanggan
shift kasir
closing kasir
cash drawer
payment method
QRIS
export Excel
PDF
API
mobile app

Namun sistem yang dibangun pada seri ini sudah mencakup alur utama kasir sederhana.

92. Ringkasan

Pada tahap terakhir kita telah menyiapkan aplikasi untuk production.

Hal penting deployment:

APP_ENV=production
APP_DEBUG=false
document root ke public
database production
composer install --no-dev
permission storage
migrate --force
cache production
HTTPS
backup
testing setelah deploy

Setelah seluruh checklist selesai, sistem kasir Laravel sudah siap digunakan.

Seri ini dimulai dari project kosong dan berakhir pada aplikasi kasir yang memiliki:

login
role
master data
produk
penjualan
pembelian
stok
kartu stok
dashboard
laporan
nota
testing
deployment

Dengan demikian pengunjung yang mengikuti seluruh seri dapat membangun sistem kasir Laravel secara bertahap dari awal sampai production.

Kembali ke Tutorial Sistem Kasir Laravel

Komentar

Belum ada komentar.

Tulis Komentar

Komentar pengunjung diperiksa sebelum ditampilkan.