- Readme.md i Readme_sr.md prošireni: demo mod, Docker uputstvo za produkciju i demo, promenljive okruženja (NTECH_SECRET, NTECH_TOTP_KEY), start.sh u strukturi projekta - start.sh dodata u repozitorijum (uklonjena iz .git/info/exclude)
10 KiB
NTech
Poslovna aplikacija za upravljanje servisom računara, magacinom delova i prodajom. Napravljena u Go-u, radi u brauzeru, ne zahteva internet vezu ni eksterne servise.
⚠️ Projekat je u aktivnom razvoju. Nije spreman za produkcijsku upotrebu.
O projektu
NTech je interna aplikacija napravljena za konkretnog korisnika — servis računara koji pored popravki vodi i magacin delova, prodaju komponenti i gotovih konfiguracija, te evidenciju klijenata i dobavljača.
Cilj je jednostavan: sve što servis treba da prati nalazi se na jednom mestu, bez oslanjanja na tabele u Excelu ili papirnu evidenciju.
Funkcionalnosti
Implementirano
- Inicijalno podešavanje pri prvom pokretanju (setup wizard)
- Sistem migracija baze podataka
- Korisnički interfejs — sidebar navigacija, sistem tema (tamna/svetla), dashboard sa statistikama
- Prijava korisnika — sesije na serveru, zaključavanje naloga
- Dvofaktorska autentifikacija (TOTP) — aktivacija sa QR kodom; tajna šifrovana u bazi (AES-256-GCM, ključ van baze)
- Rezervni (jednokratni) kodovi za 2FA — generišu se pri aktivaciji, čuvaju kao bcrypt heš; alternativa TOTP-u pri prijavi
- Bruteforce zaštita — IP zaključavanje nakon 5 neuspelih pokušaja u 15 minuta
- CSRF zaštita — double-submit cookie pattern, automatska injekcija tokena u sve forme
- Bezbednosni HTTP headeri (CSP, X-Frame-Options, Referrer-Policy, nosniff...)
- Evidencija pokušaja prijave — istorija po korisniku, IP, razlog, datum
- Korisnici i uloge — admin panel, upravljanje korisnicima
- Magacin — artikli, kategorije, filtriranje, kritični nivoi zaliha
- Servisni nalozi — prijem, statusna traka, troškovi, priznanica
- Prodajni nalozi — stavke, obračun, priznanica sa podacima firme i klijenta
- Nabavke — evidencija nabavki od dobavljača
- Kalkulacija prodajne cene pri nabavci — marža (globalna, po kategoriji i po artiklu), zavisni troškovi (carina, prevoz...) sa raspodelom na stavke, dvosmerni izračun marža↔prodajna; poštuje status PDV obveznika
- Nivelacija — promena prodajne cene uz trag (istorija promena: stara→nova, razlog, izvor, korisnik)
- Profil firme i moduli — funkcije se uključuju prema tipu firme i statusu PDV obveznika
- PDV evidencija (KIR/KPR) — knjige izdatih i primljenih računa, automatsko punjenje iz prodaje i nabavke
- PDV obračun za period + mapiranje na obrazac PP-PDV; uvoz robe (JCI) se vodi u poljima 006/106
- Šifarnik PDV stopa
- Klijenti i dobavljači — baza kontakata
- Podsetnici — evidencija sa rokom
- Izveštaji — pregled prihoda, stanje magacina
- Podešavanja — naziv, adresa, PIB, logo firme; promena teme
- Pozadinske slike — login stranica i aplikacija, sa zamućenjem, providnošću i glass efektom
- Lična tema i pozadina — svaki korisnik može svoju temu i pozadinsku sliku
- Matrica dozvola (RBAC) — admin panel za dozvole po ulogama; provera se sprovodi na nivou ruta (i mutirajućih i pregleda) i u handlerima
- Flash poruke — jednokratne povratne informacije nakon akcije
- Automatski backup SQLite baze — sa podešavanjem broja čuvanih kopija; vraćanje baze iz kopije (bezbedno, bez prekida rada)
- Grafikoni — mesečni prihod na izveštajima (Chart.js)
- Strukturisano logovanje —
log/slog(JSON u produkciji, tekst u razvoju); zaseban auth log u fail2ban formatu - Automatski testovi — jedinični i integracioni nad SQLite bazom (kripto, RBAC, tokovi prijave, validatori forme, izveštaji)
- Demo mod (
NTECH_ENV=demo) — automatski kreiran demo korisnik, pre-popunjeni login, ograničen bekap, blokirana promena lozinke i 2FA
Planirano
- Fiskalizacija (ESIR/PFR) — specifikacija u Project.md
- KPO knjiga i dvojno knjigovodstvo (opciono, kasnija faza)
- Podrška za PostgreSQL (za višekorisničko okruženje)
- WebAuthn / Passkey prijava (šema baze je pripremljena)
- Obaveštenja (e-pošta / WhatsApp) — odloženo za kasniju fazu
- Skeniranje barkodova putem kamere — odloženo za kasniju fazu
Tehnologije
| Tehnologija | Uloga |
|---|---|
| Go | backend jezik |
| chi | HTTP ruter |
| html/template | serverski šabloni |
| Alpine.js | UI logika na strani klijenta |
| SQLite + modernc.org/sqlite | glavna baza (čisti Go, bez CGO) |
| PostgreSQL + pgx/v5 | opciona baza za produkciju |
Pokretanje
Zahtevi
- Go 1.24 ili noviji
- Git
Koraci
# 1. Kloniranje repozitorijuma
git clone <url-repozitorijuma>
cd GoNtech
# 2. Pokretanje u razvojnom modu (čita fajlove sa diska, ne zahteva HTTPS)
go run ./cmd/ntech
Program se otvara na http://localhost:8080. Pri prvom pokretanju automatski se pokreće setup wizard.
Produkcioni build
Koristi interaktivnu skriptu:
./start.sh
Skripta pita za verziju, okruženje (production/development), platformu (Linux/Windows/obe), opcionalnu UPX kompresiju i da li da gurne Docker image na Gitea i GitHub Container Registry.
Ili ručno:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build \
-ldflags "-X main.Verzija=1.0.0 -s -w" \
-trimpath \
-o ntech ./cmd/ntech
Rezultat je jedan statički binarni fajl bez zavisnosti.
Promenljive okruženja
Program čita promenljive okruženja pri pokretanju. U razvojnom modu staviti ih u ntech.env pored SQLite baze. U production/demo modu program sam kreira ntech.env u istom folderu gde je baza.
Fajl ntech.env se ne commituje u Git.
| Promenljiva | Podrazumevano | Opis |
|---|---|---|
NTECH_ENV |
development |
Mod: development, production ili demo |
NTECH_PORT |
8080 |
HTTP port |
NTECH_DB |
sqlite |
Tip baze: sqlite ili postgres |
NTECH_SQLITE |
ntech.db |
Putanja do SQLite fajla |
NTECH_DSN |
— | PostgreSQL connection string |
NTECH_SECRET |
— | Ključ za potpisivanje sesija (min. 32 bajta); auto-generiše se |
NTECH_TOTP_KEY |
— | AES-256 ključ za šifrovanje TOTP tajni; auto-generiše se |
NTECH_SECRET i NTECH_TOTP_KEY se automatski generišu pri prvom pokretanju i upisuju u ntech.env. Sačuvaj backup ovog fajla — gubitak NTECH_TOTP_KEY onemogućuje prijavu svim korisnicima koji imaju 2FA.
Docker deployment
Docker image je dostupan na:
ghcr.io/dalibor31/ntech:latestgit.vm-net.in.rs/dasko/ntech:latest
Produkcija
# docker-compose.yml
services:
ntech:
image: ghcr.io/dalibor31/ntech:latest
restart: unless-stopped
environment:
NTECH_ENV: production
NTECH_PORT: "8000"
NTECH_SQLITE: /app/data/ntech.db
volumes:
- ./data:/app/data # baza + ntech.env (tajne)
- ./uploads:/app/uploads # uploadovane slike
- ./logs:/app/logs # strukturisani + auth log
- ./backups:/app/backups # automatski bekap baze
ports:
- "8000:8000"
Pri prvom pokretanju pokreće se setup wizard za kreiranje prvog admin korisnika. Nakon toga, ./data/ntech.env sadrži auto-generisane tajne — sačuvaj backup.
Stavi program iza reverznog proksija (Caddy, nginx) koji terminira HTTPS. Secure kolačići zahtevaju HTTPS.
Primer Caddy konfiguracije:
tvoj.domen.com {
reverse_proxy ntech:8000
}
Demo mod
Demo mod pokreće potpuno funkcionalnu kopiju sa pre-kreiranim nalogom Demo / Demo1234 (admin). Promena lozinke i 2FA su blokirani. Bekap je ograničen na 2 kopije.
# docker-compose.yml (demo)
services:
ntech-demo:
image: ghcr.io/dalibor31/ntech:latest
restart: unless-stopped
environment:
NTECH_ENV: demo
NTECH_PORT: "8000"
NTECH_SQLITE: /app/data/ntech.db
volumes:
- ./data:/app/data
- ./uploads:/app/uploads
- ./logs:/app/logs
- ./backups:/app/backups
ports:
- "8000:8000"
Demo takođe zahteva HTTPS (Caddy ili slično) jer su Secure kolačići uključeni.
Struktura projekta
ntech/
├── cmd/
│ └── ntech/ # ulazna tačka programa
├── internal/
│ ├── auth/ # prijava, sesije, fail2ban log
│ ├── config/ # podešavanja, setup wizard
│ ├── db/ # sloj baze podataka
│ │ └── sqlite/ # SQLite implementacija
│ ├── handler/ # HTTP handleri
│ ├── middleware/ # CSRF, bezbednost headeri, autentifikacija
│ └── model/ # zajednički tipovi podataka
├── web/
│ ├── static/ # CSS, JavaScript, slike, logotipi
│ └── templates/ # HTML šabloni
├── migrations/ # SQL migracije (001_opis.sql, 002_opis.sql, ...)
├── logs/ # auth.log i ostali logovi
├── backups/ # rezervne kopije baze
├── start.sh # interaktivna skripta za build i Docker push
├── Dockerfile
├── go.mod
└── go.sum