Skip to content

Instantly share code, notes, and snippets.

@otnansirk
Created August 23, 2025 14:18
Show Gist options
  • Select an option

  • Save otnansirk/fa30bcb1df84235e585af43ae13d69ca to your computer and use it in GitHub Desktop.

Select an option

Save otnansirk/fa30bcb1df84235e585af43ae13d69ca to your computer and use it in GitHub Desktop.

πŸš€ Deploy Laravel 8 + PostgreSQL di VPS Contabo (Ubuntu)

1. Login ke VPS

ssh root@IP_VPS

2. Update & Install Dependensi

sudo apt update && sudo apt upgrade -y
sudo apt install -y software-properties-common unzip curl git ufw
  1. 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

4. Install Composer

cd ~
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer

Cek versi:

composer -V

5. Install PostgreSQL

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

6. Clone Project Laravel

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

Permission ini perlu kalian perhatikan:

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.

7. Konfigurasi Environment

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

8. Install & Konfigurasi Nginx

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

9. Setup Firewall (opsional)

sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable

10. (Opsional) Pasang SSL (Let’s Encrypt)

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!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment