— sekitar 13 menit membaca

Self host Ente Photos di FreeBSD

Ini adalah catatan ane dalam memasang Ente di FreeBSD, tidak mudah dan menjengkelkan. Silakan pakai Linux saja karena mudah dan cocok untuk pemula

Ente Photos app

Artikel ini berisi catatan ane saat memasang Ente di FreeBSD. Sejujurnya memasang Ente adalah proses self host app yang sangat rumit dan menjengkelkan yang pernah ane rasakan, hingga saat ini. Jadi tujuan catatan ini dibuat menjadi sangat jelas agar ane (atau ente atau elu) tidak menjadi pusing dan jengkel seperti ane sebelum ini.

Ente adalah aplikasi backup foto seperti Google Photos atau iCloud Photos, dia punya banyak fitur keren (dan overkill untuk ukuran aplikasi Photos) seperti end to end encryption, open source, cross platform, face recognition, zero knowledge AI, tanpa iklan, tanpa AI, tanpa tracking, dan bahkan 2FA Authenticator di dalamnya.

Ane akan fokus pada fungsi Ente untuk penyimpanan Photos, jadi berikut catatan yang sudah ane kumpulkan dari pengalaman memasang Ente (yang menjengkelkan itu). Ente sudah memberikan dokumentasi untuk self host tanpa Docker, per hari ini sudah banyak perbaikan atas dokumentasi ini namun 3 bulan yang lalu kacau isinya.

Persiapan #

Ente sudah menyediakan binary yang bisa langsung dipasang, sayangnya tidak untuk FreeBSD. Oleh karena itu ane perlu mem-build sendiri binary tersebut. Untuk melakukan itu ada beberapa aplikasi dan pustaka yang perlu dipasang terlebih dahulu.

  1. Go. Mutlak diperlukan karena Ente dibuat dengan Go, tambahkan pkgconf untuk handling dependencies. Ane nanti perlu pull data dari repo Ente di Github jadi butuh Git. Untuk reverse proxy ane akan pakai Caddy.

    $ doas pkg update
    $ doas pkg install go124 pkgconf git-lite caddy
    
  2. Postgresql. Ente pakai postgresql untuk database-nya, juga minta libsodium untuk enkripsi E2E. Karena ane sudah ada postgresql di jail yang lain, jadi ane cukup pasang libsodium. Tapi, oke baiklah mari kita anggap tidak ada postgres.

    $ doas pkg install libsodium postgresql18-server
    

    Kemudian buat database postgresql, sebelum itu aktifkan postgresql, inisialisasi postgres ,dan jalankan daemonnya dulu

    $ doas sysrc postgresql_enable="YES"
    $ doas /usr/local/etc/rc.d/postgresql initdb
    $ doas service postgresql start
    

    Pastikan bahwa postgresql sudah berjalan dengan baik

    $ doas service postgresql status
    status postgresql
    pg_ctl: server is running (PID: 66771)
    /usr/local/bin/postgres "-D" "/data/postgres/data18"
    
    $ doas sockstat -4 | grep 5432
    postgres postgres   88698  9 tcp4  10.0.0.3:5432         10.0.0.4:13701
    postgres postgres   88682  9 tcp4  10.0.0.3:5432         10.0.0.4:62644
    postgres postgres   88662  9 tcp4  10.0.0.3:5432         10.0.0.4:58171
    postgres postgres   66771  6 tcp4  10.0.0.3:5432         *:*
    

    Setelah postgres benar - benar berjalan, ganti password untuk user default postgresql yaitu postgres

    $ doas passwd postgres
    

    Buat user dan database untuk Ente, kemudian atur agar database tersebut menjadi milik user yang dibuat.

    $ su - postgres
    $ CREATEUSER ente-admin
    $ CREATEDB ente-db -O ente-admin
    

    Atur password untuk ente-admin dan beri semua privilleges untuknya.

    $ psql ente-db
    ente-db=# ALTER ROLE ADMIN WITH ENCRYPTED PASSWORD 'entebahlul';
    ente-db=# GRANT ALL PRIVILLEGES ON DATABASE ente-db TO ente-admin;
    ente-db=# exit
    $ exit
    $ doas service postgresql restart
    

    Asumsi postgresql dan Ente akan berjalan di localhost, maka ane tidak perlu mengubah pengaturan untuk akses jaringan di postgresql.conf dan pg_hba.conf. Namun jika postgresql jalan di jaringan atau jail yang lain, maka perlu merubah pengaturan.

    # vim /data/db/postgres/data18/postgresql.conf
    listen_addresses = '*'
    

    merubah isian listen_addresses ke * membuat postgresql akan menerima koneksi dari luar jail. Kemudian di file pg_hba.conf ditambahkan isian sebagai berikut

    # vim /data/db/postgres/data18/pg_hba.conf
    	host    ente_db      all     10.0.0.3/32         trust
    	host    ente_db      all     10.0.0.0/24         trust
    

    dimana 10.0.0.3 adalah IP dari Ente.

  3. NodeJS, diperlukan untuk build frontend. Sebenarnya ane ga butuh untuk build frontend di FreeBSD, namun siapa tahu ada masalah ane tetap install saja.

$ doas pkg install node24 yarn-node24
  1. Storage alias penyimpanan. Ane sudah punya Garage S3 yang berjalan di dalam jail dan sudah menulis tentang cara pasang dan pengaturannya.

Build #

Ente memiliki 2 jenis servis yaitu backend dan frontend, oleh karena itu perlu untuk melakukan build secara terpisah. Backendnya sendiri dibangun dengan Go dan akan menghasilkan file binary, sedangkan frontendnya dibangun dengan NextJS.

Backend #

Setelah semua persiapan selesai, saatnya melakukan build Ente server. Unduh repo Ente terlebih dahulu dengan git dan kemudian build.

$ git clone https://github.com/ente-io/ente.git
$ cd ente/server
$ go124 mod tidy
$ go124 build cmd/museum/main.go

Perintah go124 mod tidy digunakan untuk mengunduh semua dependencies dan perintah go124 build untuk memulai melakukan build dengan hasil file main yang sudah memiliki atribut execute.

Saat file main dijalankan akan muncul error bahwa dia membutuhkan file konfigurasi bernama museum.yaml. Jadi salin file tersebut dari folder example atau bikin sendiri kosongan.

$ cp config/example.yaml ./museum.yaml

Agar bisa berjalan saja untuk sementara ane isi dengan konfigurasi database dan bucket S3. Contohnya seperti ini

db:
  host: 10.0.0.3
  port: 5432
  sslmode: disable
  name: ente-db
  user: ente-user
  password: entebahlul

s3:
  are_local_buckets: false
  use_path_style_urls: true
  b2-eu-cen:
    key: W3wNV6XRh1YJ8arQKBoongNqGhQ
    secret: FakeLIpA3l0VjttIiHaZgdMXF4ujQOYTyBtztpSy7w0yD2qzphOQwRtvj
    endpoint: s3.taa.ee
    region: us-east-1
    bucket: ente-bucket

khusus untuk s3, karena ane pakai local atau selfhost maka nilai are_local_buckets: false karena ane pakai endpoint url. Ane sudah coba kasih true tapi tak pernah bisa tersambung dengan baik. b2-eu-cen adalah key yang harus dipakai jika pakai s3 selfhost atau AWS Compatible s3.

Kemudian jalankan ./main secara defaultnya akan mencari file museum.yaml sebagai konfigurasi utama atau kasih flags --config path jika memakai nama yang lain. Ente akan berjalan di http://localhost:8080.

# cd ente/server
# ./main --config /root/ente/server/museum.yaml

Update

Agar Ente bisa dijalankan setiap boot maka bisa dibuat service script seperti contoh berikut.

#!/bin/sh
 # PROVIDE: ente
 # REQUIRE: networking postgresql
 # KEYWORD: shutdown
 . /etc/rc.subr
 
 name="ente"
 rcvar="ente_enable"
 desc="Ente Photos Server"
 
 ente_dir="/root/ente/server"
 ente_bin="${ente_dir}/main"
 ente_config="${ente_dir}/museum.yaml"
 ente_log="/var/log/ente.log"
 ente_pid="/var/run/ente.pid"
 
 load_rc_config $name
 : ${ente_enable:=NO}
 
 command="${ente_bin}"
 command_args="--config ${ente_config}"
 start_cmd="ente_start"
 stop_cmd="ente_stop"
 status_cmd="ente_status"
 
 ente_start() {
     echo "Starting ${name}..."
     # PAKSA CWD = folder ente
     cd "${ente_dir}" || { echo "Failed to cd to ${ente_dir}"; exit 1; }
     nohup ${command} ${command_args} > ${ente_log} 2>&1 &
     echo $! > ${ente_pid}
     echo "${name} started (PID: $!)"
 }
 ente_stop() {
     echo "Stopping ${name}..."
     if [ -f "${ente_pid}" ]; then
         kill $(cat ${ente_pid}) 2>/dev/null && rm -f ${ente_pid}
         echo "${name} stopped."
     fi
 }
 ente_status() {
     if [ -f "${ente_pid}" ]; then
         pid=$(cat ${ente_pid})
         if kill -0 $pid 2>/dev/null; then
             echo "${name} is running (PID: $pid)"
         else
             echo "${name} not running (stale PID)"
         fi
     else
         echo "${name} is not running."
     fi
 }
 run_rc_command "$1"
 

Kemudian simpan sebagai /usr/local/etc/rc.d/ente, jangan lupa ganti atribut supaya bisa dijalankan sebagai shell script

# chmod +x /usr/local/etc/rc.d/ente

Kemudian rubah file /etc/rc.conf dan masukkan pengaturan berikut

ente_enable=YES

Ente sekarang bisa dikelola dengan service ente start|stop|restart dan bisa jalan saat boot

Jika ada rencana untuk memakai email sebagai alat komunikasi dan verifikasi, ada baiknya untuk mengatur JWT (JSON Web Token) yang bisa dibuat dengan perintah

$ cd ente/server
$ go124 run tools/gen-random-keys/main.go

Kemudian simpan hasilnya di file museum.yaml di bawah pengaturan sebelumnya. Karena ane hanya single user maka ane tak perlu pengaturan ini, resikonya adalah OTP tidak akan dikirim ke email, melainkan harus melihat di console. (Lihat contoh dibawah)

Setelah backend sudah selesai dibuild selanjutnya adalah build ente-cli yang nantinya sangat penting untuk melakukan tweaks akun Ente.

$ cd ente/cli
$ go124 build -o "bin/ente-cli" main.go

perintah ini akan menghasilkan file ente-cli di dalam folder bin. Agar bisa dipergunakan yang harus dilakukan adalah menentukan konfigurasi, ente-cli membutuhkan file config.yaml di folder .ente di home directory.

$ cd ~
$ mkdir .ente
$ touch config.yaml
endpoint:
	api: http://localhost:8080
$ mkdir secrets

elu bisa pakai nilai http://localhost:8080 atau langsung domain (tapi harus set di Caddy dulu). Juga harus membuat folder secrets yang dipergunakan ente-cli untuk menyimpan secrets auth.

Untuk sementara sampai disini build backend (server dan cli), selanjutnya adalah build frontend.

Frontend #

Ane tidak melakukan build frontend di FreeBSD karena NextJS tidak bisa berjalan lancar di sini, memang bisa diakali dengan mengikuti banyak sekali build library dari source tapi tidak worth it untuk dilakukan. NextJS adalah aplikasi web dan dia tidak butuh harus dibuild di FreeBSD (framework agnostic), jadi ane akan build di Macos karena lebih mudah.

Di Macos tentu harus pasang Node, npm, dan yarn semua diselesaikan oleh Homebrew.

$ git clone https://github.com/ente-io/ente.git
$ cd ente/web
$ yarn install

Tunggu sampai selesai, setelah itu ane bisa saja mengatur environment variables tapi tidak ane lakukan karena memang mau buat Ente Photos lebih aman dengan mengetik langsung endpoint-nya saat login.

Frontend bisa dibuild dengan yarn (ane hanya build accounts, photos saja ga butuh yang lainnya) caranya sebagai berikut

$ yarn build
$ yarn build:accounts

kedua perintah di atas akan membuild frontends dan hasilnya bisa dilihat di folder out di bawah apps/photos/ dan apps/accounts/ . Untuk mempermudah maka ane kumpulkan folder out tadi ke satu folder khusus dengan nama ente-www.

$ cp -R ente/web/apps/photos/out ~/ente-www/photos
$ cp -R ente/web/apps/accounts/out ~/ente-www/accounts

Caddy Reverse Proxy #

Untuk ini ane sudah siapkan domain, sebut saja photos.taa.ee. Langsung saja edit file konfigurasi Caddy dan tambahkan rules baru.

$ doas vim /usr/local/etc/caddy/Caddyfile
photos.taa.ee {
	root * /home/tae/ente-www/photos
	file_server try_files {path} {path}.html /index.html
	}

ente.taa.ee {
	reverse_proxy http://127.0.0.1:8080
	}

$ doas caddy validate /usr/local/etc/caddy/Caddyfile
$ doas service caddy restart

Jika tidak ada masalah seharusnya Ente sudah bisa diakses dengan membuka photos.taa.ee. Di tampilan awal Ente, klik 7x di gambar brankas dan ketik alamat dari ente server yaitu ente.taa.ee. Kemudian klik pada tautan Don’t have an account untuk mendaftar.

ente developer mode

Karena ane tidak setup email (SMTP dll termasuk JWT), maka verifikasi akun tidak bisa dilakukan melalui email. Jadi kembali ke console dan lihat log dari main dan cari baris seperti ini

Skipping sending email to poes@taa.ee: Verification code: 946197

Masukkan kode verifikasi 946197 dan voila bisa langsung masuk ke dalam Ente Photos.

Konfigurasi lanjutan #

Semua perubahan di museum.yaml harus diikuti dengan restart main agar Ente mempergunakan konfigurasi yang baru dirubah.

  1. Closed, tidak menerima pendaftaran. Instance Ente ini ane pergunakan pribadi sehingga ane tidak perlu menerima pendaftaran, oleh karena itu ane masukkan key berikut di museum.yaml
internal:
	disable-registration: true

  1. Jadi Admin. Ini penting karena menjadi admin bisa melakukan pengaturan secara maksimal. Untuk menjadi admin ada beberapa langkah yang harus dilakukan yaitu mencari user_id di dalam database postgres dan masukkan ke dalam museum.yaml.
$ psql -U ente-user -d ente-db
ente-db=# SELECT * FROM users;

Catat user_id, misalnya 1580567352375231 kemudian edit file museum.yaml

internal:
	disable-registration: true
	admins:
		- 1580567352375231

  1. Upgrade storage. Meski selfhost, defaultnya Ente akan memberikan storage maksimal 10GB pada setiap user, agar bisa memaksimalkan storage ada 2 cara yaitu edit database atau pakai ente-cli.

Agar bisa mempergunakan ente-cli maka akun ane harus sudah menjadi admin. Kemudian jalankan ente-cli.

$ cd ente/cli/bin
$ ./ente-cli admin update-subscription -u poes@taa.ee --no-limit True

perintah ini akan membuat user poes@taa.ee akan memiliki storage sebesar 100TB yang akan expired di 100 tahun kemudian.

Namun jika lebih nyaman dengan SQL, bisa dicoba cara berikut:

$ psql -U ente-user -d ente-db
$ UPDATE subscriptions SET storage = 107374182400 WHERE user_id = 1580567352375231;

Mempergunakan cara ini lebih beresiko database rusak sehingga ane pilih memakai ente-cli.

ente user limit storage

Sebelum

ente user no limit storage

Sesudah

  1. Update CORS. Ane pakai Garage S3 (AWS Compatible), entah mengapa selalu gagal saat upload media melalui Ente. Dari web console errornya adalah masalah CORS Origin. Jadi ane perlu benerin bucket dengan mengupdate CORS. Buat file dengan nama misalnya cors.json

    {
      "CORSRules": [
        {
          "AllowedOrigins": ["*"],
          "AllowedHeaders": ["*"],
          "AllowedMethods": ["GET", "HEAD", "POST", "PUT", "DELETE"],
          "MaxAgeSeconds": 3000,
          "ExposeHeaders": ["Etag"]
        }
      ]
    }
    

Kemudian dengan aws-cli update bucket policy.

Update

Oke begini cara pakai aws-cli. Paket ini bisa diinstall dan dikonfigurasi dengan perintah


 $ doas pkg install -y py-awscli
 $ aws configure
 AWS Access Key ID [None]: W3wNV6XRh1YJ8arQKBoongNqGhQ
 AWS Secret access key [None]: FakeLIpA3l0VjttIiHaZgdMXF4ujQOYTyBtztpSy7w0yD2qzphOQwRtvj
 Default Region name [None]: us-east-1
 Default output format [None]: JSON

AWS Access Key ID dan Secret harus sama dengan yang dimasukkan di file museum.yaml.

$ aws s3api put-bucket-cors \
--endpoint s3.taa.ee \
--bucket ente-bucket \
--cors-configuration file://home/poes/cors.json
  1. Ente Desktop Meski ada web GUI, memasang Ente Desktop app adalah pilihan yang lebih baik karena pengalaman ane saat pakai web gui sebagian besar media (terutama video) yang ane unggah tidak bisa digenerate thumbnailnya atau frame pertama muncul warna gelap/hitam. Namun masalah ini tidak terjadi saat ane pakai Ente Desktop app.

Untuk memasang tinggal unduh saja aplikasinya di halaman Ente Desktop atau untuk versi termutakhir bisa lewat Repo Github Ente Desktop. Satu - satunya kelemahan yang ane ga suka adalah Ente Desktop app dibangun dengan electron 👎🏾.


Linux #

Khusus untuk yang ingin mudah hidupnya, gunakan Linux karena Ente bisa diinstall hanya dengan 1 baris perintah. Apa itu adek - adek?

$ sh -c "$(curl -fsSL https://raw.githubusercontent.com/ente-io/ente/main/server/quickstart.sh)"

Setelah semua selesai Ente akan tersedia di http://localhost:3000. Linux itu mudah bukan? bukan.


Artikel terkait #freebsd

Blocklistd: cara ampuh menghalau penyusup di FreeBSD

pasangkan dengan SSH Guard maka ane punya pertahanan berlapis.

Self host Ente Photos di FreeBSD

Ini adalah catatan ane dalam memasang Ente di FreeBSD, tidak mudah dan menjengkelkan. Silakan pakai Linux saja karena mudah dan cocok untuk pemula

Backup data dengan Restic dan Rclone

Sedia backup sebelum hujan badai datang

Self hosting S3 di FreeBSD dengan Garage

Memasang garage sebagai peladen S3 di FreeBSD

Jika lupa password root FreeBSD

Cara ini sering dipakai untuk merubah password root jika kelupaan


dari Fediverse

Kamu juga bisa meninggalkan komentar dari akun fediversemu dengan meng-reply di toot ini

Belum ada komentar dari fediverse

kembali ke atas