/make-sync

make-sync — alat devops kecil untuk sinkronisasi file & deployment via SSH; mendukung safe pull/push, multi-file uploads.

Primary LanguageGo

make-sync

CLI untuk sinkronisasi file/devsync via SSH, dengan mode aman (safe pull/push), menu interaktif, dan dukungan manual sync berbasis path terdaftar maupun pola ! dari .sync_ignore.

PERINGATAN: Fitur "Pipeline System" telah dihapus dari rilis saat ini. Bagian pipeline di README ini dipertahankan sebagai arsip/dokumentasi lama saja — fitur tidak lagi didukung. Untuk migrasi atau akses arsip, lihat dokumentasi internal atau hubungi tim.

Fitur Utama

  • Safe Pull/Push: indeks remote (SQLite) dibuat dulu, lalu bandingkan hash untuk unduh/unggah yang berubah saja.
  • Manual/Single Sync Menu:
    • Download/Upload
    • Pilih folder: salah satu path terdaftar, semua yang terdaftar, atau berdasarkan pola ! di .sync_ignore
    • Mode: Rsync Soft (tanpa delete) atau Rsync Force (dengan delete terbatas scope)
    • Catatan: opsi "Bypass" telah dihapus dari menu top-level Pull/Push. Opsi bypass-ignore masih tersedia sebagai flag CLI/agent untuk pengguna lanjutan, tetapi tidak ditampilkan pada menu interaktif utama untuk mencegah penghapusan tak sengaja.
  • Force Mode (Rsync-like delete):
    • Download Force: hapus file lokal yang tidak ada di DB remote dalam scope pilihan
    • Upload Force: hapus file remote yang tidak ada di lokal (gunakan kolom checked di DB bila ada)
  • .sync_ignore cerdas: menghormati .sync_temp dan pola wildcard (termasuk **), serta mendukung "include by negation" via !pattern.
  • SSH Agent Remote: otomatis build atau pakai fallback binary, jalankan indexing di remote, unduh DB.

Instalasi & Build

  • Butuh Go 1.24+.
  • Jalankan:
go build ./...

Jika ingin menjalankan seluruh test (yang ada):

## Troubleshooting

Use Cases

# Review output after execution
# make-sync

CLI untuk sinkronisasi file/devsync via SSH, dengan mode aman (safe pull/push), menu interaktif, dan dukungan manual sync berbasis path terdaftar maupun pola `!` dari `.sync_ignore`.

**PERINGATAN:** Fitur "Pipeline System" telah dihapus dari rilis saat ini. Jika Anda mencari dokumentasi lama tentang pipeline, silakan lihat arsip internal atau hubungi tim — fitur tersebut tidak lagi didukung.

## Fitur Utama
- Safe Pull/Push: indeks remote (SQLite) dibuat dulu, lalu bandingkan hash untuk unduh/unggah yang berubah saja.
- Manual/Single Sync Menu:
  - Download/Upload
  - Pilih folder: salah satu path terdaftar, semua yang terdaftar, atau berdasarkan pola `!` di `.sync_ignore`
  - Mode: Rsync Soft (tanpa delete) atau Rsync Force (dengan delete terbatas scope)
  - Catatan: opsi "Bypass" telah dihapus dari menu top-level Pull/Push. Opsi bypass-ignore masih tersedia sebagai flag CLI/agent untuk pengguna lanjutan, tetapi tidak ditampilkan pada menu interaktif utama untuk mencegah penghapusan tak sengaja.
- Force Mode (Rsync-like delete):
  - Download Force: hapus file lokal yang tidak ada di DB remote dalam scope pilihan
  - Upload Force: hapus file remote yang tidak ada di lokal (gunakan kolom `checked` di DB bila ada)
- `.sync_ignore` cerdas: menghormati `.sync_temp` dan pola wildcard (termasuk `**`), serta mendukung "include by negation" via `!pattern`.
- SSH Agent Remote: otomatis build atau pakai fallback binary, jalankan indexing di remote, unduh DB.

## Instalasi & Build
- Butuh Go 1.24+.
- Jalankan:

```bash
go build ./...

Jika ingin menjalankan seluruh test (yang ada):

go test ./...

Konfigurasi

Konfigurasi utama di make-sync.yaml. Contoh minimal:

local_path: .
remote_path: /home/user/project

devsync:
  os_target: linux  # atau windows
  auth:
    host: 1.2.3.4
    port: "22"
    username: youruser
    private_key: C:\\Users\\you\\.ssh\\id_rsa
    remote_path: /home/user/project
    local_path: .
  ignores:
    - .sync_temp
  manual_transfer:
    - src
    - assets/images

Catatan:

  • devsync.auth.remote_path adalah root project di remote.
  • devsync.manual_transfer adalah daftar path yang ditampilkan di menu Manual/Single Sync.
  • .sync_ignore di root mengatur pola ignore biasa, dan juga bisa memuat pola negasi !pattern untuk fitur include-by-pattern.

Konfigurasi Direct Access (SSH Config)

make-sync mendukung pembuatan file SSH config otomatis untuk akses langsung ke remote server. Konfigurasi ini memungkinkan koneksi SSH yang lebih mudah tanpa perlu mengetik kredensial berulang.

RemoteCommand Berdasarkan Target OS

RemoteCommand di direct_access.ssh_configs harus disesuaikan dengan target OS:

Untuk Windows Target:

RemoteCommand: cmd /K cd =remotePath
  • Menggunakan cmd /K untuk menjaga command prompt tetap terbuka
  • cd =remotePath untuk berpindah ke direktori project

Untuk Linux/Unix Target:

RemoteCommand: cd =remotePath && bash -l
  • Menggunakan bash -l untuk login shell
  • cd =remotePath untuk berpindah ke direktori project

Cara Kerja:

  1. Jalankan make-sync direct_access untuk generate SSH config
  2. File config akan dibuat di .sync_temp/.ssh/config
  3. Gunakan ssh my-server untuk koneksi langsung
  4. RemoteCommand akan otomatis menjalankan command sesuai target OS

Cara Pakai (Menu Interaktif)

  1. Jalankan binary make-sync.exe (Windows) atau make-sync (Unix).
  2. Di menu utama pilih DevSync → Single/Manual Sync.
  3. Pilih Download atau Upload.
  4. Pilih scope:
    • Salah satu path terdaftar (dari devsync.manual_transfer)
    • "All data registered in manual_sync only" (semua path terdaftar)
    • "All Data Only In Your "Sync Ignore" File Pattern" (berdasarkan !patterns dari .sync_ignore)
  5. Pilih mode:
  • Rsync Soft Mode: hanya transfer file yang berubah, tanpa penghapusan
  • Rsync Force Mode: selain transfer, juga melakukan penghapusan file yang tidak ada pada sisi lain, terbatas pada scope pilihan
  • Catatan: Mode Force sekarang dilindungi dengan konfirmasi captcha untuk operasi destruktif. Ini mencegah eksekusi Force oleh kelalaian. Jika Anda perlu menggunakan bypass-ignore, gunakan flag CLI/agent dengan kehati-hatian.

Selama Download/Upload:

  • Sistem akan menjalankan indexing di remote terlebih dahulu (mirroring safe pull/push) agar DB up-to-date.

Navigasi Keyboard di TUI

  • Back bertahap: gunakan item menu "Back" untuk naik satu level.
  • Keluar cepat: Esc, q, atau Ctrl+C akan keluar dari seluruh flow Single/Manual Sync.
  • Catatan: Mode Force sekarang dilindungi konfirmasi captcha untuk operasi destruktif; opsi bypass dihilangkan dari menu top-level. Jika Anda memerlukan bypass, gunakan flag CLI/agent secara eksplisit (akan meminta kehati-hatian).

Detail Perilaku

  • Download Soft: unduh file remote yang belum ada atau hash berbeda, dalam scope.
  • Download Force: setelah unduh, hapus file lokal yang match scope namun tidak ada di DB remote.
  • Upload Soft: unggah file lokal yang belum ada atau hash berbeda, dalam scope.
  • Upload Force: tandai setiap file lokal yang diproses sebagai checked (di DB bila tersedia), lalu hapus file remote match scope yang tidak checked.
  • Scope "Sync Ignore !patterns":
    • Matcher dibangun dengan basis ignore semua (**), lalu di-"unignore" oleh tiap negation pattern (ditambah varian **/ untuk token pendek).
    • .sync_temp selalu diabaikan.
    • Pola ignore .sync_ignore tetap dihormati saat traversing.

Tips & Batasan

  • Pastikan devsync.auth terisi benar untuk koneksi SSH.
  • Jika build agent gagal, sistem akan mencoba fallback binary di folder .sync_temp sesuai target OS.
  • Mode Force sekarang menggunakan konfirmasi captcha untuk operasi destruktif; opsi bypass dihilangkan dari menu top-level. Jika Anda memerlukan bypass, gunakan flag CLI/agent secara eksplisit (akan meminta kehati-hatian).
  • Untuk Windows remote, penghapusan file menggunakan cmd.exe /C del /f /q.

Catatan tentang .sync_temp dan ignore

  • .sync_temp selalu dikecualikan dari sinkronisasi.
  • Pola di .sync_ignore tetap dihormati saat traversal lokal.

Eksekusi Perintah Remote (exec)

Jalankan perintah langsung di host remote tanpa PTY. Output di-stream real-time; proses akan mengembalikan exit status remote.

Penggunaan:

make-sync exec <command...>

Perubahan perilaku penting (2025):

  • Perintah non-interactive sekarang dikirim ke remote dengan cara yang lebih andal untuk menghindari masalah quoting/escaping. Semua argumen setelah exec digabung menjadi satu command string lalu di-encode dengan base64. Di remote, payload didecode dan dijalankan oleh shell (bash -s) sehingga Anda tidak perlu menambah escape ekstra pada kutipan atau karakter khusus.

Perilaku detil:

  • Bekerja dari direktori kerja remote: devsync.auth.remote_path (fallback remote_path). Jika diisi, client akan menjalankan cd <remotePath> && <decoded payload> di remote.
  • Non-interactive only: pendekatan ini tidak mendukung TTY/interactive sessions (gunakan SSH langsung untuk itu).
  • Eksekusi POSIX: default mencoba menjalankan payload di bash via echo '<BASE64>' | base64 -d | bash -s.
  • Fallback Windows: jika remote tidak menyediakan POSIX shell, client mencoba menjalankan perintah dengan cmd.exe /C sebagai fallback.
  • Tidak ada parsing flag lokal untuk exec; semua token setelah exec dianggap bagian dari perintah remote.

Kelebihan:

  • Anda dapat menulis perintah natural tanpa menambahkan escape ekstra, contoh:
make-sync exec docker compose exec app bash -c "ping google.co.id"

Keterbatasan & Prasyarat:

  • Remote harus menyediakan base64 dan bash/sh untuk jalur POSIX agar metode ini bekerja (umum pada Linux hosts). Jika tidak ada, client akan mencoba fallback Windows cmd.exe style.
  • Tidak untuk perintah interaktif atau yang memerlukan TTY.
  • Jika Anda butuh behavior lain (mis. bypass quoting rules), saat ini tidak ada flag --raw; silakan gunakan SSH langsung.

Contoh penggunaan:

  • Tampilkan file tersembunyi (Linux/Unix):
    • make-sync exec ls -a -l
  • Docker compose restart (tanpa perlu escaping tambahan):
    • make-sync exec docker compose down && docker compose up
  • Menjalankan perintah dengan kutipan dan spasi:
    • make-sync exec bash -c "printf 'line1\\nline2'"

Tips quoting:

  • Windows: operator seperti &&, |, atau path dengan spasi tetap didukung karena dibungkus cmd.exe /C. Jika ada karakter kutip ganda di command, pertimbangkan untuk mengutip ulang bagian terkait.
  • Linux/Unix: command dibungkus ke bash -lc '...'. Jika Anda perlu menyertakan ' di dalam command, gunakan escape \\'\\'\\' atau beralih ke kutip ganda dengan hati-hati.

Troubleshooting:

  • "command not found": pastikan perintah tersedia di PATH remote, atau gunakan path absolut/bin yang tepat.
  • Salah direktori kerja: set devsync.auth.remote_path (atau remote_path) pada config agar cd otomatis ke root project di remote.

Troubleshooting

  • Tidak ada file yang tertransfer:
    • Cek apakah hash sama atau scope/pola tidak match.
  • Gagal indexing remote:
    • Periksa kredensial SSH, jalur remote_path, dan izin eksekusi pada binary agent (Unix: chmod +x).
  • Pola !pattern tidak bekerja:
    • Pastikan .sync_ignore ada di root lokal, setiap pattern pada baris terpisah, tanpa komentar. Gunakan **/ untuk menjangkau subfolder jika perlu.

Lisensi

Proyek ini mengikuti lisensi yang ditentukan oleh pemilik repositori.