# Salin ke `.env` lalu sesuaikan. Semua opsional — default di `config.py`. # Nilai dari env shell (export) juga didahulukan lewat os.getenv. # Akun Block Producer yang dicari VEX_TARGET_BP=databisnisid # Node RPC publik Vexanium (ganti bila node utama lambat/timeout) VEX_API_NODE=https://v2.vexascan.com:2096 # Node pool RPC utk failover distribusi (V58): CSV, urutan prioritas. Default = # `VEX_API_NODE` + https://api.databisnis.id (node mainnet terverifikasi). # Distribusi coba node berikutnya bila node sebelumnya gagal. # VEX_API_NODES=https://v2.vexascan.com:2096,https://api.databisnis.id # Lokasi file SQLite (disarankan absolut bila dijadwalkan via cron) VEX_DB_PATH=voters.db # Backend basis data: sqlite (default) atau mysql (MariaDB/MySQL via PyMySQL) VEX_DB_BACKEND=sqlite # Koneksi MariaDB/MySQL — dipakai saat VEX_DB_BACKEND=mysql # Cocokkan dengan docker-compose.yml (MARIADB_DATABASE/USER/PASSWORD) VEX_DB_HOST=127.0.0.1 VEX_DB_PORT=3306 VEX_DB_USER=databisnis VEX_DB_PASS=databisnis VEX_DB_NAME=databisnisid # Syarat minimum stake (VEX) agar pemilih disimpan VEX_MIN_STAKED_VEX=1000 # Dashboard: jumlah baris per halaman DASH_PAGE_SIZE=50 # Dashboard: host & port server DASH_HOST=127.0.0.1 DASH_PORT=5000 # Dashboard: jumlah worker gunicorn (produksi) DASH_WORKERS=2 # Ambang batas vote "basi" (hari sejak revote terakhir). Pemilih lewat batas # ini disimpan scan tapi keluar band VALID (bagian KADALUARSA 28..31 hari, # >31 hari disembunyikan dari dashboard). VEX_STALE_DAYS=28 # Masa matang (hari): pemilih baru (revote < VEX_MATURITY_DAYS lalu) BELUM # berhak reward — dibayar mulai siklus berikutnya setelah votenya berumur ≥ # ambang ini (band VALID). VEX_MATURITY_DAYS=3 # Jendela "kadaluarsa" (hari SETELAH VEX_STALE_DAYS) yang masih tampil di # dashboard dengan sorot VOTE ULANG; lewat 28+3=31 hari → disembunyikan. VEX_EXPIRED_DAYS=3 # Tag REVOTE (mint) bertahan (hari) sejak revote terakhir: hanya pemilih lama # yang revote dalam VEX_REVOTE_TAG_DAYS terakhir diberi tag; setelah itu tampil # sbg VALID biasa (tetap dibayar langsung — V42, ⊥ tunggu matang). VEX_REVOTE_TAG_DAYS=1 # Jendela peringatan (hari SEBELUM VEX_STALE_DAYS): pemilih VALID yang # `now − STALE < last_vote ≤ now − (STALE − WARN)` diberi badge `VOTE ULANG # SEGERA` (segera kadaluarsa, masih dibayar). VEX_WARN_DAYS=3 # Hyperion API untuk saldo liquid akun + verifikasi txid (balance BP, # disajikan dashboard; verifikasi distribusi/klaim). Nama lama `DATABISNIS_API` # masih dibaca utk backward-compat deploy lama. HYPERION_API=https://api.databisnis.id # Pool Hyperion (V60, failover): CSV host yang melayani /v2/* — verifikasi # txid distribusi/klaim + saldo liquid dashboard. Default = HYPERION_API + # API_NODES (keduanya mainnet terverifikasi layani /v2). Kosongkan → default. # VEX_HYPERION_NODES=https://api.databisnis.id,https://v2.vexascan.com:2096 # Dashboard: TTL cache (detik) untuk saldo liquid — gagal fetch juga di-cooldown DASH_LIQUID_TTL=60 # — Stack swarm (docker-compose.yml) — # Interpolasi compose; override default di bawah lewat .env bila perlu. # TZ dipakai juga sebagai zona waktu jadwal skan (`datetime.now()` lokal). TZ=Asia/Jakarta SCAN_HOURS=0,8,16 # Skan sekali saat container start (tabel voters langsung ada; dashboard ⊥ 500) SCAN_RUN_ON_START=1 # — Distribusi profit-share (service distribute) — # Jam (lokal, TZ) run. Jadwal MINGGUAN (V37): tiap DISTRIBUTE_WEEKDAY (nama # `sat`/`mon`.. atau 0-6; Senin=0, CSV utk beberapa hari: `wed,sat` = Rabu & # Sabtu) jam DISTRIBUTE_HOUR, plus satu one-off DISTRIBUTE_FIRST_RUN # (YYYY-MM-DD; default baked `2026-08-17`). Contoh produksi: # DISTRIBUTE_FIRST_RUN=2026-08-17 # putaran pertama Senin 17 Agt # DISTRIBUTE_WEEKDAY=wed,sat # lalu tiap Rabu & Sabtu # `VEX_BP_PRIVATE_KEY` TIDAK lagi lewat interpolasi .env: di stack ia dibaca # dari file `.env` yang di-bind dari NFS # (`/mnt/nfs/server5.saltis.id/data/databisnisid/app/config.env` → `/app/.env`, # dibaca `config.py` via load_dotenv). Di luar stack, set key di `.env` lokal. DISTRIBUTE_HOUR=10 DISTRIBUTE_WEEKDAY=wed,sat DISTRIBUTE_FIRST_RUN=2026-08-17 DISTRIBUTE_MAX_ATTEMPTS=3 # Jeda (detik) ANTAR kirim transfer antar pemilih — beri node/Hyperion waktu # mengejar indeks + meratakan beban broadcast. N pemilih → N−1 jeda per run. DISTRIBUTE_SEND_DELAY=30 # Kill-switch: FALSE (default) = payout off; set TRUE untuk mengaktifkan # pembayaran. --dry-run tetap jalan walau off. DISTRIBUTE_ENABLED=false # — Notifikasi Telegram (dua kanal) — # Satu bot token; dua daftar chat id (CSV; id user atau grup): # TELEGRAM_COMMUNITY_CHAT_IDS — publik: hanya brief MULAI/SELESAI distribusi # TELEGRAM_INTERNAL_CHAT_IDS — internal: detail distribusi, semua kegagalan, # dan klaim reward (⊥ pernah ke komunitas) # Kosong = kanal senyap. Di stack, isi di config.env NFS (dibaca config.py # load_dotenv dari /app/.env). TELEGRAM_BOT_TOKEN= TELEGRAM_COMMUNITY_CHAT_IDS= TELEGRAM_INTERNAL_CHAT_IDS= # — Klaim reward BP harian (service claim) — # Poll `vexcore::claimrewards` tiap CLAIM_RETRY_SECONDS (detik) saat mendekati # jendela klaim (last_claim_time + 24 jam). Setelah klaim sukses, 10% reward # (VEX_BP_FEE_PERCENT) dikirim ke VEX_BP_FEE_WALLET. Key `VEX_BP_PRIVATE_KEY` # di stack dari bind NFS config.env (sama dgn distribute). CLAIM_RETRY_SECONDS=60 VEX_BP_FEE_WALLET=bpdbsjasprod VEX_BP_FEE_PERCENT=0.10 # Kredensial mariadb stack — wajib konsisten antar-service (mariadb/web/scan) MARIADB_ROOT_PASSWORD=root MARIADB_DATABASE=databisnisid MARIADB_USER=databisnis MARIADB_PASSWORD=databisnis