Aplikasi absensi sekolah berbasis Flask dan SQLite. Guru masuk melalui sesi server yang aman, mengelola siswa, membuka sesi absensi per tanggal/kelas, memindai QR Code unik, mencatat perubahan status, serta mengunduh rekap Excel dan PDF.
Secure/HttpOnly/SameSite, token CSRF, pembatasan percobaan login, sesi delapan jam, dan logout.BarcodeDetector dan pemindai cadangan lokal jsQR, serta input kode manual untuk pengujian.instance/attendance.db; data tidak bergantung pada localStorage.localhost atau situs HTTPS.Buka PowerShell di folder proyek:
py -3.10 -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install --upgrade pip
python -m pip install -r requirements.txt
Copy-Item .env.example .env
notepad .env
Pada peluncuran pertama, isi .env dengan kredensial admin awal berikut. Password hanya dibaca oleh backend saat membuat akun pertama dan disimpan ke database dalam bentuk hash; tidak dikirim atau disematkan ke frontend.
ADMIN_USERNAME=GURU MU
ADMIN_PASSWORD=MASUK AJA123
SECRET_KEY=GANTI_DENGAN_HASIL_GENERATOR_RAHASIA_MINIMAL_32_KARAKTER
Ganti nilai SECRET_KEY dengan nilai acak yang rahasia sebelum dipakai bersama pengguna lain. Contoh untuk membuatnya di PowerShell:
python -c "import secrets; print(secrets.token_urlsafe(48))"
Salin hasilnya ke .env. Pastikan file .env tidak dibagikan; file tersebut diabaikan oleh Git. Aplikasi menolak nilai SECRET_KEY yang masih berupa placeholder atau kurang dari 32 karakter. Login pertama langsung menuju dashboard tanpa mewajibkan ganti password. Ganti password secara opsional melalui Pengaturan; password baru minimal 12 karakter dan harus mencakup setidaknya tiga jenis karakter: huruf kecil, huruf besar, angka, dan simbol.
Jalankan server lokal:
python app.py
Buka http://127.0.0.1:5000 dan masuk dengan username GURU MU serta password awal MASUK AJA123. Server membuat tabel dan admin saat pertama kali dijalankan. Jika admin sudah ada, mengubah nilai ADMIN_PASSWORD di .env tidak mengganti password database; gunakan menu Pengaturan.
Untuk menjalankan sebagai server WSGI di Windows:
waitress-serve --host=127.0.0.1 --port=5000 app:app
Untuk penggunaan di jaringan sekolah, pasang aplikasi di belakang reverse proxy HTTPS, gunakan host jaringan yang sesuai, buat SECRET_KEY yang rahasia, dan pertahankan COOKIE_SECURE=1 pada .env agar cookie login hanya dikirim melalui HTTPS. Jika menguji melalui HTTP biasa pada alamat selain localhost, browser dapat menolak cookie Secure; gunakan HTTPS, atau set COOKIE_SECURE=0 hanya untuk pengujian lokal pada jaringan tepercaya. Jangan mempublikasikan server Flask development (python app.py) ke internet. Login tidak menyediakan registrasi akun publik; batasi akses jaringan server kepada guru dan operator yang berwenang.
Repositori ini dapat dideploy sebagai Blueprint Render menggunakan render.yaml. Konfigurasi membuat web service Python di region Singapore, menjalankannya dengan Waitress, mengaktifkan HTTPS-only cookies, serta menyimpan SQLite di disk persisten /var/data. Disk persisten memerlukan paket Render berbayar dan mencegah data hilang saat service restart atau deploy.
main ke GitHub dan pastikan repositori berisi render.yaml.ADMIN_USERNAME dan ADMIN_PASSWORD. Gunakan password unik yang panjang (sekurang-kurangnya 12 karakter dengan minimal tiga jenis karakter), bukan password contoh lokal MASUK AJA123. Jangan menaruh secret di file atau commit.SECRET_KEY acak dan membuat disk persisten sesuai konfigurasi. Periksa ringkasan Blueprint, lalu setujui pembuatan service dan disk berbayar.https://guru-mu-absensi.onrender.com (atau URL yang ditampilkan Render). Endpoint pemeriksaan kesehatan adalah /healthz.Jika akun admin sudah tercipta di database, mengubah ADMIN_PASSWORD pada environment Render tidak mengubah password tersimpan. Ganti password melalui Pengaturan saat masih login. Backup SQLite secara berkala dari disk persisten dan batasi akses Render/GitHub kepada operator berwenang. Jangan memakai SQLite yang sama dari beberapa instance aplikasi; disk Render terpasang hanya pada satu instance.
Default: instance/attendance.db. Folder instance dibuat saat aplikasi berjalan dan diabaikan oleh Git. Untuk memilih lokasi lain, tetapkan DATABASE_PATH pada .env, misalnya DATABASE_PATH=D:/data/guru-mu/attendance.db. Buat backup database secara berkala; hentikan atau backup secara konsisten saat aplikasi sedang menulis data.
localhost. Input token QR manual tersedia untuk pengujian.Dengan virtual environment yang aktif dan dependensi sudah terpasang:
python -m unittest discover -v
Pengujian meliputi autentikasi dan hash password, akses admin, keunikan NIS, pembuatan sesi, validasi QR, pencegahan scan ganda, audit status, laporan, dan ekspor Excel/PDF. Test menggunakan database sementara dan tidak mengubah database aplikasi.
app.py Flask API, autentikasi, skema SQLite, QR dan ekspor
templates/index.html Halaman login dan dashboard admin
static/css/style.css Tampilan responsif
static/js/app.js Interaksi frontend, kamera dan API
static/vendor/jsQR.js Pemindai QR cadangan lokal (lisensi Apache-2.0)
static/vendor/jsQR-LICENSE.txt Lisensi jsQR
requirements.txt Dependensi Python
test_app.py Pengujian API dan database
instance/ Database dan secret key lokal (tidak di-commit)
SQLite sesuai untuk instalasi sekolah kecil/satu server. Untuk beban multi-server atau konkurensi tinggi, migrasikan database ke PostgreSQL dan gunakan deployment serta TLS terkelola.