Za Web Security Scanner (main) + Malware Scanner. Operativno uputstvo — tačno šta kreirati na Lemon Squeezy i šta preneti u HF Space env.
Otvori Lemon dashboard: https://app.lemonsqueezy.com/ Sve cene su u USD (Lemon je globalni, ne EUR/RSD).
Dashboard → Stores → New Store
| Polje | Vrednost |
|---|---|
| Store name | Web Security Scanner |
| Store URL slug | web-security-scanner (URL postaje web-security-scanner.lemonsqueezy.com) |
| Currency | USD |
| Country | Srbija |
| Tax mode | Lemon Squeezy as Merchant of Record (default — oni plaćaju PDV) |
Pokupi: Store ID (broj, vidljiv u URL-u dashboard-a posle kreiranja).
Dashboard → Products → New Product. Svaki proizvod ima jednu ili više varijanti (varijanta = konkretna cena / billing plan).
| Polje | Vrednost |
|---|---|
| Product name | Pro Monthly |
| Description | Monthly subscription — 240+ security checks, unlimited scans, PDF reports, priority support. |
| Type | Subscription |
| Status | Published |
Varijanta (jedna):
| Polje | Vrednost |
|---|---|
| Variant name | Monthly |
| Price | 9.00 USD |
| Billing interval | Every 1 month |
| Trial | — (bez trial-a, ili 7 dana ako hoćeš akviziciju) |
Pokupi posle publish-a:
Product IDVariant ID(za monthly)Share / Buy link→ Overview → Share dugme → URL oblikahttps://web-security-scanner.lemonsqueezy.com/buy/<uuid>
| Polje | Vrednost |
|---|---|
| Product name | Pro Yearly |
| Description | Annual subscription — save 27% vs monthly. All Pro Monthly features + yearly billing. |
| Type | Subscription |
| Status | Published |
Varijanta (jedna):
| Polje | Vrednost |
|---|---|
| Variant name | Yearly |
| Price | 79.00 USD |
| Billing interval | Every 1 year |
Pokupi:
Product ID(Yearly)Variant ID(za yearly)Buy link
Napomena: Pro Monthly i Pro Yearly mogu biti jedan proizvod sa 2 varijante umesto 2 odvojena proizvoda. Ako ih spojiš, u env imaš jedan
LEMON_PRODUCT_IDali i dalje dva različitaLEMON_VARIANT_*. Kôd radi oba načina.
| Polje | Vrednost |
|---|---|
| Product name | Malware Scanner 5-Pack |
| Description | 5 full malware scans with Damage Report. 30-day validity. One-time payment — no subscription. |
| Type | Single payment (NIJE subscription) |
| Status | Published |
Varijanta (jedna):
| Polje | Vrednost |
|---|---|
| Variant name | 5-Pack |
| Price | 3.00 USD |
| Billing interval | — (single payment) |
Pokupi:
Product ID(malware)Variant ID(5-pack)Buy link
Dashboard → Settings → Webhooks → + New Webhook
| Polje | Vrednost |
|---|---|
| Callback URL | https://unlimitededition-web-security-scanner.hf.space/webhooks/lemon |
| Signing secret | (Lemon generiše — kopiraj odmah, ne pokazuje se ponovo) |
| Events (čekiraj sve dole) | → vidi listu |
Čekiraj ove eventove:
Subscription (Pro Monthly/Yearly):
-
subscription_created -
subscription_updated -
subscription_cancelled -
subscription_resumed -
subscription_expired -
subscription_payment_success -
subscription_payment_failed
License keys (ako ikad dodaš offline licence):
-
license_key_created -
license_key_updated
One-time order (Malware 5-Pack — Faza 7):
-
order_created
Pokupi: Signing secret (HEX string, ~64 karaktera) — ide kao
LEMON_WEBHOOK_SECRET u HF Secrets.
Dashboard → Settings → API → + Create API key
| Polje | Vrednost |
|---|---|
| Name | hf-space-backend |
| Scope | Default (full access) |
Pokupi: API key string (lsk_...) — ide kao LEMON_API_KEY u HF Secrets.
Ovaj kôd ga ne koristi aktivno u ovom trenutku (sve radi kroz webhooks), ali mora biti postavljen da
/api/subscription/configne vraća da je Lemon nekonfigurisan.
Kada završiš sve iznad, imaćeš u rukama ove vrednosti:
| # | Vrednost | Odakle | Primer |
|---|---|---|---|
| 1 | Store ID | Dashboard URL posle kreiranja store-a | 12345 |
| 2 | Pro Monthly — Product ID | Product → Overview | 567890 |
| 3 | Pro Monthly — Variant ID | Product → Variants | 678901 |
| 4 | Pro Monthly — Buy URL | Product → Share | https://web-security-scanner.lemonsqueezy.com/buy/abc-uuid |
| 5 | Pro Yearly — Product ID | Product → Overview | 567891 |
| 6 | Pro Yearly — Variant ID | Product → Variants | 678902 |
| 7 | Pro Yearly — Buy URL | Product → Share | https://.../buy/def-uuid |
| 8 | Malware 5-Pack — Variant ID | Product → Variants | 678903 |
| 9 | Malware 5-Pack — Buy URL | Product → Share | https://.../buy/ghi-uuid |
| 10 | API Key | Settings → API | lsk_... |
| 11 | Webhook Signing Secret | Settings → Webhooks → click on webhook | HEX string |
Stavke 2 i 5 mogu biti isti broj ako si Monthly+Yearly spojio u jedan proizvod. Tada koristiš taj jedan
LEMON_PRODUCT_ID.
HF Space dashboard → Settings → Variables and secrets
LEMON_API_KEY = lsk_...
LEMON_WEBHOOK_SECRET = <HEX string>
LEMON_STORE_ID = 12345
LEMON_PRODUCT_ID = 567890
LEMON_VARIANT_MONTHLY = 678901
LEMON_VARIANT_YEARLY = 678902
LEMON_BUY_URL_MONTHLY = https://web-security-scanner.lemonsqueezy.com/buy/<uuid>
LEMON_BUY_URL_YEARLY = https://web-security-scanner.lemonsqueezy.com/buy/<uuid>
LEMON_VARIANT_MALWARE_5_PACK = 678903
LEMON_BUY_URL_MALWARE_5_PACK = https://web-security-scanner.lemonsqueezy.com/buy/<uuid>
Posle snimanja → Factory reboot Space (Settings → Factory rebuild). Inače env se ne učita.
curl https://unlimitededition-web-security-scanner.hf.space/api/subscription/configOčekivano:
{
"lemon_api_key_set": true,
"lemon_webhook_secret_set": true,
"lemon_store_id": "12345",
"lemon_product_id": "567890",
"lemon_variant_monthly": "678901",
"lemon_variant_yearly": "678902"
}Ako bilo koje polje kaže <unset> ili false → env nije učitan. Proveri
Secrets/Variables i factory reboot-uj.
Dashboard → Settings → Advanced → Test mode: ON
Kliknu pravi Buy URL → na checkout stranici unese test karticu:
Card: 4242 4242 4242 4242
CVC: bilo koje 3 cifre
Date: bilo koja buduća
ZIP: bilo koja 5 cifara
Kupovina prolazi, webhook se okida, u lemon_webhook_events tabeli (Supabase)
pojavljuje se nov red. Posle testa → Test mode: OFF pre produkcije.
- Kreiraj Store → pokupi Store ID
- Kreiraj Proizvod A (Pro Monthly) → pokupi 3 stvari
- Kreiraj Proizvod B (Pro Yearly) → pokupi 3 stvari
- Kreiraj Proizvod C (Malware 5-Pack) → pokupi 3 stvari
- Kreiraj API Key → pokupi
lsk_... - Kreiraj Webhook → pokupi Signing Secret
- Unesi sve u HF Space (Secrets + Variables iz sekcije 6)
- Factory reboot HF Space
-
curl /api/subscription/config→ verifikuj - Test mode ON → test kupovina sa test karticom
- Proveri da li se pojavio red u
lemon_webhook_eventsSupabase tabeli - Test mode OFF → produkcija
- Subscription kupovina →
subscription_createdwebhook →subscription.py._handle_subscription_event→ INSERT usubscriptionstabelu → user od sada ima Pro. - Subscription otkazana →
subscription_cancelledwebhook → flipstatus='cancelled', user gubi Pro na kraju plaćenog perioda. - Malware 5-Pack kupovina (Faza 7) →
order_createdwebhook → DVA reda:subscriptionstabela:plan_name='malware_pack',status='active',license_key(od Lemon-a) — korisnik se loguje istim sistemom kao Promalware_creditstabela:credits_total=5,credits_remaining=5,expires_at=NOW()+30 dana,subscription_id→ FK na subscriptions red → Korisnik dobija license_key, loguje se na account.html, vidi koliko mu je skenova ostalo → Kad istekne/potroši sve:subscriptions.status='expired', red ostaje u bazi (NIKAD se ne briše) → Ako kupi ponovo: isti license_key, novi red umalware_credits, status opetactive
- Malware scan sa kreditom → api.py → proveri license_key → nađi
malware_creditsgdesubscription_idmatch,credits_remaining > 0,expires_at > NOW()→ atomic decrement → dozvoli scan - Malware scan bez kredita → standardni free limit (1/24h po IP + fingerprint)
| Greška | Simptom | Popravka |
|---|---|---|
| Zaboraviš Factory reboot | API vraća "<unset>" za env |
Settings → Factory rebuild |
| Staviš Secret u Variables | Key vidljiv svima u UI | Briši i stavi u Secrets |
| Pogrešan Webhook URL | Webhooks Dashboard → Logs pokazuje 404 | Mora biti /webhooks/lemon (ne /webhook singular) |
| Test mode ostane ON | Prave kupovine ne dolaze | Settings → Advanced → Test mode OFF |
| Varijanta ID umesto Product ID | Subscription ne mapira se na plan | LEMON_VARIANT_* su varijante, LEMON_PRODUCT_ID je proizvod — ne mešaj |
| Webhook secret drift | Svi webhooks vraćaju 401 | Ako regenerišeš secret na Lemon-u, moraš ažurirati HF Secret + reboot |
Kreiraš na Lemon:
- 1 Store
- 3 Proizvoda (Pro Monthly, Pro Yearly, Malware 5-Pack)
- 1 Webhook (na
/webhooks/lemon) - 1 API Key
Šalješ mi / unosiš u HF Space: 11 vrednosti iz tabele u sekciji 5.
Kada to imaš, reci mi i nastavljam Fazu 7. Redosled implementacije:
- Migracija 022 — proširi
subscriptions.plan_nameCHECK za'malware_pack'+ dodajmalware_credits.subscription_idFK db.py— nove funkcije:find_active_malware_credits(),consume_malware_credit(),get_credits_for_subscription()subscription.py— handler zaorder_createdwebhook: kreira subscription + malware_credits redapi.py—/malware-scan: pre rate limita proveri kredite kroz license_keyaccount.html— prikaži malware pakete (aktivne + istekle) sa brojem preostalih skenovapricing.html— kartica za $3/5 skenova (aktivna) + $30/60 i $300/700 (komentarisane u kodu, INACTIVE za prikaz)