Skip to content
Banner

My First InstanceTutorial

✍️ Ardi Syah | πŸ“… May 15, 2026
πŸ•› 0 menit 0 detik read | ⏳ 0 words

Membuat Proyek Pertama di Virtual Machine ​

Dokumentasi ini merangkum langkah-langkah teknis pemindahan aplikasi otomasi Python (Playwright + Flask) dari lingkungan lokal ke VM Oracle Cloud Infrastructure (OCI) menggunakan Docker dan Nginx sebagai Reverse Proxy.

πŸ—οΈ Arsitektur Sistem ​

Alur trafik data yang berhasil dibangun adalah sebagai berikut: User Telegram -> Server Telegram -> Cloudflare (Proxy & SSL) -> Nginx (VM) -> Docker Container (Port 8100)


1. Persiapan VM di Oracle Cloud ​

Saat melakukan provisioning instance, poin-poin krusial yang harus diperhatikan:

  • OS: Ubuntu 22.04 / 24.04 (LTS).
  • Shape: ARM Ampere (Always Free) sangat direkomendasikan karena RAM yang lega (hingga 24GB).
  • SSH Key: Pilih Generate a key pair for me. Wajib mengunduh Private Key .key saat pembuatan karena ini satu-satunya akses masuk.

Konfigurasi Firewall Oracle (VCN) ​

Secara default, Oracle menutup semua port kecuali SSH (22). Agar aplikasi backend Anda bisa diakses, Anda harus membuka "pintu" di Firewall Oracle (Security List).

  1. Klik pada Virtual Cloud Network yang tertera di detail instance.
  2. Pilih Security Lists > Default Security List.
  3. Klik Add Ingress Rules:
  4. Source CIDR: 0.0.0.0/0
  5. IP Protocol: TCP Buka port berikut di Ingress Rules pada Dashboard Oracle:
  • Port 22: Akses SSH.
  • Port 80 & 443: Trafik HTTP/HTTPS dari Cloudflare.

Akses VM via SSH ​

Gunakan Terminal (Linux/macOS) atau PowerShell/Command Prompt (Windows).

bash
# Ubah permission file key agar aman (khusus Linux/macOS)
chmod 400 path/to/your-key.key

# Masuk ke server
ssh -i path/to/your-key.key ubuntu@IP_ADDRESS_VM

2. Inisialisasi Environment & Docker ​

Setelah masuk via SSH, langkah pertama adalah membersihkan jalur firewall internal Ubuntu dan menginstal Docker.

Instalasi Docker di Ubuntu: ​

Jalankan perintah berikut secara berurutan setelah login SSH:

bash
# Update package list
sudo apt update && sudo apt upgrade -y

# Install common package (biasanya otomatis)
sudo apt install -y python3 python3-pip python3-venv git curl wget unzip nano htop nginx

# Install Docker
sudo apt install docker.io -y

# Install Docker Compose (untuk manajemen banyak kontainer)
sudo apt install docker-compose-v2 -y

# Berikan akses ke user saat ini agar tidak perlu mengetik 'sudo' terus-menerus
sudo usermod -aG docker $USER
# Perlu logout dan login kembali agar perubahan grup terasa

# Agar perubahan grup langsung aktif tanpa harus keluar dari SSH, jalankan:
newgrp docker

Menjalankan Aplikasi Pertama (Contoh: Nginx): ​

Gunakan Docker Compose untuk mendefinisikan aplikasi Anda dalam file .yaml. Ini jauh lebih rapi daripada mengetik perintah panjang.

  1. Buat file: nano docker-compose.yml
  2. Isi dengan konfigurasi sederhana:
yaml
services:
  web-app:
    image: nginx:latest
    ports:
      - "80:80"
    restart: always
  1. Jalankan: docker compose up -d

Aplikasi Anda sekarang berjalan di latar belakang.

Karena Anda ingin menghosting beberapa aplikasi, Anda nantinya akan membutuhkan Reverse Proxy (seperti Nginx Proxy Manager atau Traefik) agar satu IP VM bisa melayani banyak domain/subdomain yang diarahkan ke kontainer Docker yang berbeda-beda.

Di Mana Sebaiknya Menyimpan Proyek? ​

Untuk keamanan dan kemudahan pengelolaan, jangan simpan di root (/). Tempatkan proyek Anda di direktori home user Anda. Gunakan struktur berikut: ~/projects/nama-proyek-anda/ (berada di /home/ubuntu/projects/nama-proyek-anda/).


Upload Proyek dari VSCode (Cara Paling Efisien) ​

Sebagai instruktur Anda, saya sarankan jangan menggunakan FTP manual. Cara paling profesional dan instan adalah menggunakan fitur Remote - SSH di VSCode. Ini memungkinkan Anda mengedit, menjalankan, dan mengelola file di VM langsung dari jendela VSCode di laptop Anda seolah-olah itu file lokal.

Lakukan urutan ini:

  1. Buka VSCode di laptop Anda.
  2. Buka tab Extensions (Ctrl+Shift+X atau Cmd+Shift+X).
  3. Cari dan install ekstensi bernama Remote - SSH (oleh Microsoft).
  4. Setelah terinstal, tekan F1 (atau Ctrl+Shift+P), lalu ketik dan pilih: Remote-SSH: Connect to Host...
  5. Pilih Add New SSH Host...
  6. Masukkan perintah SSH Anda persis seperti saat Anda login ke terminal, contoh: ssh -i path/to/your-key.key ubuntu@IP_ADDRESS_VM
  7. Pilih file konfigurasi SSH (biasanya yang pertama: C:\Users\Nama\.ssh\config atau ~/.ssh/config).
  8. Tekan F1 lagi, pilih Remote-SSH: Connect to Host..., lalu pilih IP VM Anda.
  9. VSCode akan membuka window baru. Buka terminal di VSCode (`Ctrl + ``). Terminal ini sekarang sudah berada di dalam VM Anda.

Membuat Folder dan Upload: Di terminal VSCode (yang sudah terkoneksi ke VM), jalankan:

bash
mkdir -p ~/projects/playwright-app
cd ~/projects/playwright-app

Setelah itu, di panel VSCode sebelah kiri, pilih Open Folder, dan arahkan ke /home/ubuntu/projects/playwright-app. Sekarang, Anda tinggal drag and drop seluruh file proyek Python Playwright dari folder laptop Anda ke panel Explorer VSCode.

Jangan pernah menyalin folder venv dari lokal (Windows/macOS) ke server (Linux). ​

Ada tiga alasan utama mengapa folder venv harus ditinggalkan saat proses upload:

  1. Arsitektur Berbeda: Python di Windows mencari file .exe, sedangkan di Linux mencari file biner. Library yang terinstall di Windows tidak akan bisa dijalankan di Linux.
  2. Absolute Path: Di dalam venv terdapat script yang mencatat lokasi folder secara spesifik (misal: C:\Users\Nama\Project...). Begitu pindah ke Linux (/home/ubuntu/...), jalur tersebut menjadi rusak.
  3. Efisiensi: Folder venv berisi ribuan file kecil yang akan membuat proses upload sangat lambat.

Langkah yang Benar (Praktik Instan) ​

Alih-alih menyalin folder venv, kita akan membuat venv baru yang bersih langsung di VM. Ikuti panduan ini:

1. Pastikan file requirements.txt sudah ada ​

Pastikan di folder proyek Anda di VSCode (yang sudah terhubung ke VM), terdapat file requirements.txt. Jika belum ada, buat di lokal Anda dengan perintah pip freeze > requirements.txt lalu upload file tersebut saja.

2. Buat Virtual Environment di VM ​

Di terminal VSCode yang sudah terkoneksi ke VM, pastikan Anda berada di folder proyek:

bash
cd ~/projects/playwright-app

Lalu jalankan perintah ini (sesuai standar Python Linux):

bash
# Membuat venv baru di VM
python3 -m venv venv

# Mengaktifkan venv
source venv/bin/activate

3. Install Dependencies ​

Setelah venv aktif (ditandai dengan tulisan (venv) di depan prompt terminal), install library Anda:

bash
pip install --upgrade pip
pip install -r requirements.txt

Khusus untuk Playwright (Langkah Penting) ​

Karena Anda menggunakan Playwright, menginstall library saja tidak cukup. Playwright membutuhkan browser biner dan dependensi sistem (library grafik/font) agar bisa berjalan di Linux server yang tidak memiliki layar (headless).

Jalankan perintah ini di dalam folder proyek (dengan venv aktif):

bash
# Install browser biner yang dibutuhkan Playwright
playwright install

# Pastikan Anda berada di folder ~/projects/playwright-app
sudo ./venv/bin/playwright install-deps

Mengapa ini penting? ​

Perintah install-deps ini akan menginstal library sistem Linux (seperti libgbm, libasound, dll) yang dibutuhkan agar browser (Chromium/Firefox) bisa terbuka di server Ubuntu. Tanpa ini, Playwright akan memberikan error "browser closed unexpectedly".


Langkah Selanjutnya (Cek Kesiapan) ​

Setelah perintah di atas selesai tanpa error, mari kita tes apakah script Anda bisa berjalan di lingkungan server yang "tanpa layar" (headless).

Coba buat file tes kecil bernama test_run.py:

python
# test_run.py
from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    # Penting: Di server, headless harus True (defaultnya memang True)
    browser = p.chromium.launch(headless=True)
    page = browser.new_page()
    page.goto("https://google.com")
    print(f"Berhasil masuk ke: {page.title()}")
    browser.close()

Jalankan dengan:

bash
python3 test_run.py

Jika muncul tulisan "Berhasil masuk ke: Google", berarti VM Anda sudah 100% siap untuk menjalankan Playwright.

Mengatasi Firewall Internal (iptables) ​

  1. Oracle Cloud memiliki aturan REJECT default. Gunakan perintah ini agar port benar-benar terbuka:
bash
sudo iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT
sudo iptables -I INPUT 1 -p tcp --dport 443 -j ACCEPT
sudo iptables -I INPUT 1 -p tcp --dport 8100 -j ACCEPT
sudo netfilter-persistent save
  1. UFW:
bash
sudo ufw allow 443/tcp
sudo ufw reload
  1. Instal Sertifikat SSL di VM Dalam mode Full, Cloudflare mengharuskan VM memiliki sertifikat SSL. Kabar baiknya, karena Anda pakai mode Full (bukan Full Strict), sertifikatnya tidak harus resmi (bisa self-signed). Jika Anda menggunakan Nginx, Anda bisa membuat sertifikat sementara agar koneksi "Full" ini aktif:
bash
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crt

3. Kontainerisasi Aplikasi (Dockerizing) ​

Menjalankan Playwright di server membutuhkan dependensi sistem yang kompleks. Menggunakan image resmi dari Microsoft adalah solusi paling stabil.

Struktur Folder Proyek ​

text
playwright-app/
β”œβ”€β”€ app.py              # Flask Webhook & Playwright Logic
β”œβ”€β”€ .env                # Secret Keys (Bot Token, AHU Login)
β”œβ”€β”€ requirements.txt    # Library Python
β”œβ”€β”€ Dockerfile          # Instruksi Build
└── docker-compose.yml  # Orchestrator

Dockerfile (Playwright v1.59.0) ​

Penting untuk menyelaraskan versi library di requirements.txt dengan versi Image Docker.

dockerfile
FROM mcr.microsoft.com/playwright/python:v1.59.0-jammy
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8100
CMD ["python3", "app.py"]

4. Konfigurasi Nginx & Cloudflare ​

Nginx bertindak sebagai jembatan yang menerima trafik HTTPS dari Cloudflare dan meneruskannya ke Flask di dalam Docker.

Konfigurasi Reverse Proxy ​

Buat file di /etc/nginx/sites-available/ahu-bot:

bash
sudo nano /etc/nginx/sites-available/ahu-bot
nginx
# /ahu-bot
server {
    listen 80;
    server_name bot.domainanda.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name bot.domainanda.com;

    ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
    ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;

    location / {
        proxy_pass http://localhost:8100;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Aktifkan konfigurasi:

bash
sudo ln -s /etc/nginx/sites-available/ahu-bot /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx

Cloudflare Setting:

  • SSL/TLS Mode: Set ke Full (karena kita menggunakan self-signed cert di Nginx) atau Flexible.
  • DNS: Pastikan record A diarahkan ke IP Publik VM dengan status Proxied (Orange).

Di dalam Docker, Flask harus disetel untuk mendengarkan koneksi dari luar kontainer. Jika hanya port=8100, ia seringkali hanya mendengarkan 127.0.0.1 (lokal kontainer saja). Ubah baris terakhir di app.py menjadi:

python
if __name__ == '__main__':
    # host='0.0.0.0' wajib agar bisa diakses dari luar kontainer
    app.run(host='0.0.0.0', port=8100)

Jangan lupa!

Karena Anda mengubah kode, jalankan docker compose up -d --build lagi untuk menerapkan perubahan.

5. Menjalankan Bot ​

Jalankan aplikasi di latar belakang menggunakan Docker Compose:

bash
docker compose up -d --build

Mendaftarkan Webhook Telegram ​

Panggil URL ini melalui browser: https://api.telegram.org/bot<TOKEN>/setWebhook?url=https://bot.domainanda.com/webhook

Monitoring: Melihat Log secara Real-time ​

bash
docker logs -f ahu-playwright-bot
    ```
*   **Melihat penggunaan Resource (CPU/RAM):**
    ```bash
    docker stats
    ```
    *(Sangat berguna untuk melihat apakah Playwright memakan terlalu banyak RAM di VM Oracle Anda).*

Test:

bash
curl -I https://bot.domainanda.com/webhook

πŸ›‘οΈ Catatan Penting & Troubleshooting ​

  • Headless Mode: Di server, pastikan Playwright diluncurkan dengan headless=True.
  • Flask Host: Gunakan app.run(host='0.0.0.0', port=8100) agar bisa diakses dari luar kontainer.
  • Monitoring Log: Gunakan docker logs -f ahu-playwright-bot untuk melihat error secara real-time.
  • Browser Executable Error: Jika muncul error biner tidak ditemukan, pastikan versi Docker Image sudah di-update sesuai versi library Python-nya.