$ aoox

DocsInfrastruktur

Server remote

Menghubungkan server lain lewat SSH sebagai target deploy tambahan — tanpa agen, cukup docker CLI di server tujuan.

Transport
SSH → docker system dial-stdio
Butuh di server
sshd + Docker CLI, tanpa agen
Siapa
Owner/admin mendaftarkan; semua bisa memilih

Kapan memakai server remote?

  • Aplikasi berat yang tidak muat di host aoox.
  • Memisahkan beban: panel + database di satu VPS, aplikasi di VPS lain.
  • Region/lokasi berbeda untuk latensi.

Satu instance aoox tetap satu panel; server remote hanya menambah tempat container berjalan.

Prasyarat di server tujuan

  • SSH server berjalan dan bisa dijangkau dari host aoox (port 22 atau lainnya).
  • Docker terpasang dan user SSH boleh memakainya:
Di server tujuan
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker deploy      # bila bukan root
docker system dial-stdio --help     # harus ada (Docker 20.10+)
  • Hanya CLI + daemon — tidak perlu port forwarding SSH. sshd yang di-hardening dengan AllowTcpForwarding no tetap bekerja.
  • Tidak perlu membuka port Docker (2375/2376) ke jaringan.
  • Untuk domain langsung di server itu: port 80/443 bebas (lihat proxy per server).

Cara kerja

  1. 01sshsatu sesi ssh2 dari API ke server (lazy, reconnect)
  2. 02dial-stdiotiap request Docker API dieksekusi lewat docker system dial-stdio
  3. 03builddaemon server meng-clone & membangun image
  4. 04runcontainer berjalan di server; log mengalir lewat tunnel yang sama

Ini cara yang sama dengan docker -H ssh://user@host: API berbicara ke daemon remote seolah lokal, lewat stdio proses docker di server. Satu sesi SSH per server di-cache dan disambung ulang bila putus.

Menambahkan server

  1. Settings → Server remote → Server remote baru (owner/admin)

    FieldKeterangan
    NamaLabel, mis. app-sg-1.
    Host / Port / UsernameAlamat SSH, mis. 203.0.113.10, 22, root atau user yang ada di grup docker.
    Private key (opsional)Kosongkan untuk memakai key platform aoox (disarankan). Isi PEM/OpenSSH bila mau key sendiri — disimpan terenkripsi, tidak ditampilkan lagi.
  2. Otorisasi key platform (bila tanpa key sendiri)

    Kartu Server remote menampilkan public key platform dan perintah yang harus dijalankan sekali di server tujuan sebagai user SSH itu — aoox tidak bisa menulis authorized_keys host lain:

    mkdir -p ~/.ssh && chmod 700 ~/.ssh
    touch ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys
    echo 'ssh-ed25519 AAAA… aoox' >> ~/.ssh/authorized_keys

    Key platform dibuat otomatis (ed25519) saat pertama dibutuhkan dan disimpan di ./secrets di host aoox — satu key untuk semua server dan terminal.

  3. Tes koneksi

    Tombol tes membuka shell singkat lalu mengecek Docker lewat tunnel. Hasilnya:

    HasilArti
    OK + versi DockerSiap dipakai.
    Auth ditolak + perintah otorisasiKey belum ada di authorized_keys — jalankan perintah yang ditampilkan.
    Terhubung, Docker errordocker tidak ada di PATH user itu, user tidak di grup docker, atau daemon mati.

Deploy ke server remote

Di form aplikasi pilih Server → server tujuan (select hanya tampil bila ada server terdaftar; member melihat daftar kosong karena endpoint server dibatasi owner/admin). Aplikasi menampilkan badge nama server.

AspekServer remote
BuildDi daemon server tujuan — Dockerfile, Nixpacks, situs statis (helper image dibangun di sana).
RegistryTanpa push. Image tersimpan di server dengan ref aoox/<project>/<app>:<tag>; rollback memakai yang masih ada di sana.
Domain / TraefikYa — provision proxy di server itu (kartu Proxy (Traefik) di server ini), lalu tambahkan domain seperti biasa. Alternatifnya tetap bisa pakai Port host.
Blue/greenYa bila server punya proxy dan aplikasi tanpa port host; tanpa proxy → replace biasa.
Log containerAda (realtime, lewat tunnel).
Metrik CPU/RAMTidak — sampler hanya membaca daemon host aoox.
Env & referensi databaseEnv berlaku; referensi ${{database…}} menghasilkan host internal yang tidak terjangkau dari server lain — pakai koneksi eksternal.
Mount & backup volumeYa — volume, file, dan backup volume (termasuk unggah/unduh S3) berjalan di daemon server itu.
JobsYa, di daemon server.
Notifikasi container matiHanya untuk host lokal.
Preview PRTidak (tanpa host/domain).
Pemeliharaan diskImage deployment lama dipangkas juga di server remote; dangling/build cache hanya lokal.

Contoh: app di server remote + database di host

Env aplikasi (server remote)
# bukan ${{database.app-db.url}} — host internal tidak terjangkau dari server lain
DATABASE_URL=postgresql://app:PASSWORD@203.0.113.5:15432/app_db
  • Isi Port host pada database (mis. 15432) dan batasi akses port itu di firewall host ke IP server remote.
  • Salin password dari tab Ringkasan database (mask → salin).

Proxy & domain di server remote

Setiap server bisa menjalankan Traefik-nya sendiri. Di kartu server, bagian Proxy (Traefik) di server ini: atur port HTTP/HTTPS (default 80/443) dan Email ACME bila ingin sertifikat Let's Encrypt, lalu provision.

  • Setelah proxy ada, aplikasi di server itu mendapat label Traefik dengan setelan server tersebut — tab Domain bekerja seperti di host.
  • DNS domain harus mengarah ke IP server itu, bukan ke host aoox. Cek DNS membandingkan dengan host server yang terdaftar.
  • Port 80/443 di server itu harus bebas; ACME HTTP-01 butuh port 80 terbuka dari internet.
  • Tanpa proxy server, aplikasi tetap bisa diakses lewat Port host seperti sebelumnya.

Terminal ke server remote

Halaman Terminal punya select target: Host aoox atau salah satu server. Target diikat ke tiket oleh API, bukan dikirim dari browser. Lihat Web terminal.

Menghapus server

Server yang masih memiliki aplikasi tidak bisa dihapus (409). Hapus atau pindahkan aplikasinya dulu (ubah Server di Pengaturan → deploy ulang membangun di target baru; container di server lama tidak dihapus otomatis).

Jebakan umum

GejalaPenyebab & solusi
Tes: auth failedKey belum diotorisasi, atau username salah. Jalankan perintah otorisasi sebagai user yang sama.
Tes: docker: command not foundDocker belum terpasang, atau PATH shell non-interaktif tidak memuatnya (snap). Pasang via get.docker.com.
Tes: permission denied while trying to connect to the Docker daemonUser bukan anggota grup docker. usermod -aG docker <user>, login ulang.
Deploy sukses tapi tidak bisa diaksesPort host belum diisi dan server belum punya proxy, atau firewall server menutup port itu.
Aplikasi tidak bisa konek ke databaseMemakai referensi/host internal. Pakai koneksi eksternal + port host database.
Nixpacks/statis: build pertama sangat lamaHelper image & base image di-pull di server itu (sekali per server).
Keamanan
Host key SSH server tujuan belum diverifikasi — rentan MITM di jaringan yang tidak dipercaya. Gunakan jaringan privat/VPN antar server bila memungkinkan. Kredensial SSH memberi aoox akses setara root Docker di server itu.

Langkah berikutnya

Ada yang keliru? Edit halaman ini di GitLab ↗