Izmena Readme.md fajla i dodat Readme_sr.md na srpskom

This commit is contained in:
2026-06-07 02:15:34 +02:00
parent 8cec26a03f
commit 68dc9f334d
4 changed files with 205 additions and 115 deletions
+49 -109
View File
@@ -1,148 +1,88 @@
# NTech # NTech
[🇷🇸 Srpska verzija](README.sr.md)
![Go Version](https://img.shields.io/badge/go-1.24-blue) ![Go Version](https://img.shields.io/badge/go-1.24-blue)
![License](https://img.shields.io/badge/license-MIT-green) ![License](https://img.shields.io/badge/license-MIT-green)
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. A business application for computer repair shop management, parts inventory tracking, and sales. Built with Go, it runs in the browser and requires no internet connection or external services.
> ⚠️ Projekat je u aktivnom razvoju. Nije spreman za produkcijsku upotrebu. > ⚠️ The project is under active development. It is not ready for production use.
--- ---
## O projektu ## About the Project
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. NTech is an internal application built for a specific user — a computer repair shop that, in addition to repairs, manages a parts inventory, sales of components and pre-built configurations, as well as client and supplier records.
Cilj je jednostavan: sve što servis treba da prati nalazi se na jednom mestu, bez oslanjanja na tabele u Excelu ili papirnu evidenciju. The goal is simple: everything the repair shop needs to track is located in one place, without relying on Excel spreadsheets or paper records.
--- ---
## Funkcionalnosti ## Features
### Implementirano ### Implemented
- Inicijalno podešavanje pri prvom pokretanju (setup wizard) - Initial setup on first run (setup wizard)
- Sistem migracija baze podataka - Database migration system
- Korisnički interfejs — sidebar navigacija, sistem tema (tamna/svetla), dashboard sa statistikama - User interface — sidebar navigation, theme system (dark/light), dashboard with statistics
- Prijava korisnika — sesije na serveru, zaključavanje naloga - User login — server-side sessions, account locking
- Dvofaktorska autentifikacija (TOTP) — aktivacija sa QR kodom, rezervni kodovi - Two-factor authentication (TOTP) — activation with a QR code, backup codes
- Bruteforce zaštita — IP zaključavanje nakon 5 neuspelih pokušaja u 15 minuta - Brute-force protection — IP locking after 5 failed attempts within 15 minutes
- CSRF zaštita — double-submit cookie pattern, automatska injekcija tokena u sve forme - CSRF protection — double-submit cookie pattern, automatic token injection into all forms
- Bezbednosni HTTP headeri (CSP, X-Frame-Options, Referrer-Policy, nosniff...) - Security HTTP headers (CSP, X-Frame-Options, Referrer-Policy, nosniff...)
- Evidencija pokušaja prijave — istorija po korisniku, IP, razlog, datum - Login attempt logginghistory by user, IP, reason, date
- Korisnici i uloge — admin panel, upravljanje korisnicima - Users and roles — admin panel, user management
- Magacin — artikli, kategorije, filtriranje, kritični nivoi zaliha - Inventory — items, categories, filtering, critical stock levels
- Servisni nalozi — prijem, statusna traka, troškovi, priznanica - Service orders — intake, status bar, costs, receipt
- Prodajni nalozi — stavke, obračun, priznanica sa podacima firme i klijenta - Sales orders — items, calculation, receipt with company and client details
- Nabavke — evidencija nabavki od dobavljača - Procurement — records of purchases from suppliers
- Klijenti i dobavljači — baza kontakata - Clients and suppliers — contact database
- Podsetnici — evidencija sa rokom - Reminders — records with deadlines
- Izveštajipregled prihoda, stanje magacina - Reports — revenue overview, inventory status
- Podešavanja — naziv, adresa, PIB, logo firme; promena teme - Settings — company name, address, Tax ID (PIB), logo; theme toggle
### Planirano ### Planned
- Podrška za PostgreSQL (za višekorisničko okruženje) - PostgreSQL support (for multi-user environments)
- WebAuthn / Passkey prijava (šema baze je pripremljena) - WebAuthn / Passkey login (database schema is already prepared)
- Obaveštenja (e-pošta / WhatsApp) — odloženo za kasniju fazu - Notifications (email / WhatsApp) — deferred to a later phase
- Skeniranje barkodova putem kamereodloženo za kasniju fazu - Barcode scanning via cameradeferred to a later phase
--- ---
## Tehnologije ## Technologies
| Tehnologija | Uloga | | Technology | Role |
| ------------------------------------------------------------------------------------ | ------------------------------- | | ------------------------------------------------------------------------------------ | ------------------------------- |
| [Go](https://go.dev) | backend jezik | | [Go](https://go.dev) | backend language |
| [chi](https://github.com/go-chi/chi) | HTTP ruter | | [chi](https://github.com/go-chi/chi) | HTTP router |
| [html/template](https://pkg.go.dev/html/template) | serverski šabloni | | [html/template](https://pkg.go.dev/html/template) | server-side templates |
| [Alpine.js](https://alpinejs.dev) | UI logika na strani klijenta | | [Alpine.js](https://alpinejs.dev) | client-side UI logic |
| [SQLite](https://sqlite.org) + [modernc.org/sqlite](https://gitlab.com/cznic/sqlite) | glavna baza (čisti Go, bez CGO) | | [SQLite](https://sqlite.org) + [modernc.org/sqlite](https://gitlab.com/cznic/sqlite) | main database (pure Go, no CGO) |
| [PostgreSQL](https://www.postgresql.org) + [pgx/v5](https://github.com/jackc/pgx) | opciona baza za produkciju | | [PostgreSQL](https://www.postgresql.org) + [pgx/v5](https://github.com/jackc/pgx) | optional production database |
--- ---
## Pokretanje ## Running the Application
### Zahtevi ### Requirements
- Go 1.22 ili noviji - Go 1.22 or newer
- Git - Git
### Koraci ### Steps
```bash ```bash
# 1. Kloniranje repozitorijuma # 1. Clone the repository
git clone <url-repozitorijuma> git clone <repository-url>
cd GoNtech cd GoNtech
# 2. Kopiranje konfiguracionog fajla # 2. Copy the configuration file
cp ntech.env.example ntech.env cp ntech.env.example ntech.env
# Otvori ntech.env i postavi vrednosti (videti tabelu ispod) # Open ntech.env and set the values (see the table below)
# 3. Učitavanje promenljivih i pokretanje u razvojnom okruženju # 3. Load environment variables and run in the development environment
export $(grep -v '^#' ntech.env | xargs) export $(grep -v '^#' ntech.env | xargs)
go run ./cmd/ntech go run ./cmd/ntech
``` ```
Program se otvara na `http://localhost:8080` (ili na portu definisanom u `ntech.env`).
Pri prvom pokretanju automatski se pokreće setup wizard.
### Produkcioni build
```bash
# Pomoću build.sh skripte (prima opcioni argument verzije)
./build.sh 1.0.0
# Ili ručno
CGO_ENABLED=0 GOARCH=amd64 GOOS=linux go build \
-ldflags "-X main.Verzija=1.0.0 -s -w" \
-o ntech ./cmd/ntech
./ntech
```
Rezultat je jedan statički binarni fajl bez zavisnosti.
---
## Promenljive okruženja
Kopirati `ntech.env.example` u `ntech.env` i popuniti vrednosti. Fajl `ntech.env` se **ne commituje** u Git.
| Promenljiva | Podrazumevano | Opis |
| -------------- | ------------- | -------------------------------------------- |
| `NTECH_ENV` | `development` | Okruženje: `development` ili `production` |
| `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) |
---
## 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
├── build.sh # skripta za produkcioni build
├── ntech.env # lokalna konfiguracija (ne commituje se)
├── go.mod
└── go.sum
```
+150
View File
@@ -0,0 +1,150 @@
# NTech
[🇬🇧 English version](README.md)
![Go Version](https://img.shields.io/badge/go-1.24-blue)
![License](https://img.shields.io/badge/license-MIT-green)
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, rezervni kodovi
- 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
- 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
### Planirano
- 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](https://go.dev) | backend jezik |
| [chi](https://github.com/go-chi/chi) | HTTP ruter |
| [html/template](https://pkg.go.dev/html/template) | serverski šabloni |
| [Alpine.js](https://alpinejs.dev) | UI logika na strani klijenta |
| [SQLite](https://sqlite.org) + [modernc.org/sqlite](https://gitlab.com/cznic/sqlite) | glavna baza (čisti Go, bez CGO) |
| [PostgreSQL](https://www.postgresql.org) + [pgx/v5](https://github.com/jackc/pgx) | opciona baza za produkciju |
---
## Pokretanje
### Zahtevi
- Go 1.22 ili noviji
- Git
### Koraci
```bash
# 1. Kloniranje repozitorijuma
git clone <url-repozitorijuma>
cd GoNtech
# 2. Kopiranje konfiguracionog fajla
cp ntech.env.example ntech.env
# Otvori ntech.env i postavi vrednosti (videti tabelu ispod)
# 3. Učitavanje promenljivih i pokretanje u razvojnom okruženju
export $(grep -v '^#' ntech.env | xargs)
go run ./cmd/ntech
```
Program se otvara na `http://localhost:8080` (ili na portu definisanom u `ntech.env`).
Pri prvom pokretanju automatski se pokreće setup wizard.
### Produkcioni build
```bash
# Pomoću build.sh skripte (prima opcioni argument verzije)
./build.sh 1.0.0
# Ili ručno
CGO_ENABLED=0 GOARCH=amd64 GOOS=linux go build \
-ldflags "-X main.Verzija=1.0.0 -s -w" \
-o ntech ./cmd/ntech
./ntech
```
Rezultat je jedan statički binarni fajl bez zavisnosti.
---
## Promenljive okruženja
Kopirati `ntech.env.example` u `ntech.env` i popuniti vrednosti. Fajl `ntech.env` se **ne commituje** u Git.
| Promenljiva | Podrazumevano | Opis |
| -------------- | ------------- | -------------------------------------------- |
| `NTECH_ENV` | `development` | Okruženje: `development` ili `production` |
| `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) |
---
## 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
├── build.sh # skripta za produkcioni build
├── ntech.env # lokalna konfiguracija (ne commituje se)
├── go.mod
└── go.sum
```
+4 -4
View File
@@ -42,12 +42,12 @@ func main() {
if _, err := os.Stat("migrations"); err == nil { if _, err := os.Stat("migrations"); err == nil {
migrFS = os.DirFS(".") migrFS = os.DirFS(".")
} }
// staticFS je rootovan na "web/static" (isti kao fs.Sub embed-a) — uploads ostaju van embed-a // staticFS je rootovan na "web/static" — u produkciji embed, u razvoju disk
var staticFS fs.FS var staticFS fs.FS
if _, err := os.Stat("web/static"); err == nil { if os.Getenv("NTECH_ENV") == "production" {
staticFS = os.DirFS("web/static")
} else {
staticFS, _ = fs.Sub(assets.StaticFS, "web/static") staticFS, _ = fs.Sub(assets.StaticFS, "web/static")
} else {
staticFS = os.DirFS("web/static")
} }
if config.JelPrvoPokretanje() { if config.JelPrvoPokretanje() {
+2 -2
View File
@@ -66,9 +66,9 @@
</td> </td>
<td style="padding:10px 20px;text-align:center;"> <td style="padding:10px 20px;text-align:center;">
{{if .Aktivan}} {{if .Aktivan}}
<span style="display:inline-block;padding:2px 10px;border-radius:20px;background:#f0fdf4;color:#16a34a;font-size:11px;font-weight:500;">Aktivan</span> <span style="display:inline-block;padding:2px 10px;border-radius:20px;background:#26a269;color:#ffffff;font-size:11px;font-weight:500;">Aktivan</span>
{{else}} {{else}}
<span style="display:inline-block;padding:2px 10px;border-radius:20px;background:#fef2f2;color:#dc2626;font-size:11px;font-weight:500;">Deaktiviran</span> <span style="display:inline-block;padding:2px 10px;border-radius:20px;background:#ed333b;color:#000000;font-size:11px;font-weight:500;">Deaktiviran</span>
{{end}} {{end}}
</td> </td>
<td style="padding:10px 20px;text-align:center;"> <td style="padding:10px 20px;text-align:center;">