π Deploy Laravel 8 + PostgreSQL di VPS Contabo (Ubuntu)
ssh root@IP_VPS
sudo apt update && sudo apt upgrade -y
sudo apt install -y software-properties-common unzip curl git ufw
- Install PHP & Extensions Laravel
Laravel 8 butuh PHP β₯ 7.3 (disarankan PHP 8.1/8.2):
sudo add-apt-repository ppa:ondrej/php -y
sudo apt update
sudo apt install -y php8.1 php8.1-cli php8.1-common \
php8.1-pgsql php8.1-mbstring php8.1-xml php8.1-bcmath php8.1-curl php8.1-fpm
cd ~
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
Cek versi:
composer -V
sudo apt install -y postgresql postgresql-contrib
Buat user & database:
sudo -u postgres psql
Di dalam psql:
CREATE USER laraveluser WITH PASSWORD 'passwordku';
CREATE DATABASE laraveldb OWNER laraveluser;
GRANT ALL PRIVILEGES ON DATABASE laraveldb TO laraveluser;
\q
cd /var/www
git clone https://github.com/username/project.git laravel
cd laravel
composer install --no-dev --optimize-autoloader
Set permission:
sudo chown -R www-data:www-data /var/www/laravel
sudo chmod -R 775 /var/www/laravel/storage /var/www/laravel/bootstrap/cache
Tidak wajib perlu kalian sesuaikan dengan user yang sedang dipakai
Untuk check permission:
ls -la
atau
ls -l /path/foldernya
Pastikan permision /storage sudah sesuai
Cek :
ls -la /var/www/laravel/storage
Cek PHP-fpm jalan dengan user apa:
ps aux | grep php-fpm atau ps aux | grep nginx
Result:
php-fpm: pool USERNAME_KAMU
pastikan USERNAME_KAMU sama dengan yang di pakai oleh app laravel
masuk ke DIR project dan check permission storage dan cache agar laravel bisa write file:
ls -ld storage bootstrap/cache
Idealnya hasilnya
drwxrwxr-x USERNAME_KAMU USERNAME_KAMU ...
kalau belum sama set permissionnya dulu :
chmod -R 775 storage bootstrap/cache
Karena Laravel butuh tulis file di situ:
storage/
- Simpan log (error.log, laravel.log)
- Simpan session kalau pakai file session driver
- Simpan cache aplikasi kalau pakai file cache driver
- Simpan file upload sementara
π Kalau folder ini nggak bisa ditulis, Laravel akan error semacam:
ERROR: file_put_contents(.../storage/logs/laravel.log): failed to open stream: Permission denied
bootstrap/cache/
- Simpan compiled config (config.php)
- Simpan compiled routes (routes.php)
- Simpan compiled services (services.php)
π Kalau folder ini nggak bisa ditulis, Laravel nggak bisa jalan optimal. Command kayak php artisan config:cache bakal gagal.
Edit file .env:
APP_NAME=Laravel
APP_ENV=production
APP_KEY=base64:...
APP_DEBUG=false
APP_URL=http://domain.com
DB_CONNECTION=pgsql
DB_HOST=127.0.0.1
DB_PORT=5432
DB_DATABASE=laraveldb
DB_USERNAME=laraveluser
DB_PASSWORD=passwordku
Jalankan composer
composer install --no-dev --optimize-autoloader
--no-dev β skip package dev (hemat space, lebih aman, lebih cepat).
--optimize-autoloader β Laravel generate classmap autoloader biar resolve class lebih cepat. Ini bikin performanya lebih bagus di server.
Lalu
php artisan config:cache
php artisan route:cache
config:cache β semua file di config/*.php digabung jadi satu file cache β akses config lebih cepat.
route:cache β semua route disimpan di cache β routing jadi super cepat.
Generate app key:
php artisan key:generate
key:generate β cuma perlu sekali kalau .env belum punya APP_KEY. Tanpa ini, enkripsi session & CSRF token bisa error.
Migrasi database:
php artisan migrate --force
--force digunakan untuk skip konfirmasi jadi sangat berguna di env production apalagi ika menggunakan CI/CD
sudo apt install -y nginx
Buat config:
#ubuntu
sudo nano /etc/nginx/sites-available/nama.domainmu.aja.biar.enak
#almalinux
sudo nano /etc/nginx/conf.d/nama.domainmu.aja.biar.enak.conf
Perlu kalian sesuaikan path nya kadang beda OS beda penempatan.
Isi dengan (asic usage):
server {
listen 80;
server_name domain.com;
root /var/www/laravel/public;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.ht {
deny all;
}
}
Save lalu check dulu berhasil atau tidak dengan:
sudo nginx -t
pastikan hasilnya
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Jika ada yang duplicate/ignored. coba check dimana duplicatenya dengan:
grep -R "ISI_DENGAN_TEXT_YANG _KATANYA_DUPLICATE" /etc/nginx/conf.d/
Aktifkan config:
sudo ln -s /etc/nginx/sites-available/laravel /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable
Kalau sudah ada domain:
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d domain.com -d www.domain.com
- Sebelum generate SSL, domain harus resolve ke IP server yang akan dipakai Nginx.
- Letβs Encrypt perlu verifikasi domain: mereka akan coba akses http://domainkamu dan pastikan server yang dijangkau sesuai dengan request. Kalau DNS belum di-setup β Certbot gagal dengan error NXDOMAIN seperti yang kamu lihat.
β Sekarang Laravel 8 dengan PostgreSQL sudah jalan di VPS Contabo!