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
Tulis Komentar