Roadmap'in 6 maddesi de gerçek çalışır halde:
1) Geçmiş veri motoru (EKAP v2)
- server/ekap-v2.mjs: AES-256-CBC imzalı EKAP v2 istemcisi (zero-dep),
ihale arama + sonuç ilanı parse (kazanan firma, sözleşme bedeli,
yaklaşık maliyet, teklif sayısı), TR firma adı normalize
- server/history-store.mjs: SQLite deposu (IKN+kısım anahtarlı, upsert)
- server/ekap-scan.mjs: tarih aralıklı artımlı tarayıcı (6 paralel)
- server/scheduler.mjs: sunucu içi periyodik tarama (SCAN_* env ile)
- /api/tenders artık geçmiş sonuçları da birleştiriyor → kazanan firma,
rakip ve kırmızı bayrak analizleri gerçek veriyle doluyor
2) Gerçek AI şartname analizi
- server/ai.mjs: 6 sağlayıcılı fallback zinciri (GLM/DeepSeek/Gemini/
Grok/GPT/Claude), JSON şemalı çıktı, uydurma yasak promptu
- pdfjs-dist ile tarayıcıda PDF metin çıkarma (dinamik import)
- AiSpecAnalyzerModal: sahte sonuç kaldırıldı, gerçek dosya + dürüst hata
3) KİK kurul kararları
- server/kik.mjs: EKAP v2 JSON API (Sec-1..6 imzalı), uyuşmazlık/
düzenleyici/mahkeme; karar tam metni (ayrı AES anahtarıyla URL)
- KikDecisions sekmesi: arama + takipteki idarelerden hızlı öneri
4) Fiyatlandırma + ödeme
- server/billing.mjs: Stripe Checkout (zero-dep, form-encoded)
- Pricing sekmesi: 3 plan, aylık/yıllık, yapılandırılmadıysa dürüst uyarı
5) TED (AB ihaleleri)
- server/ted.mjs: anonim TED v3 API, 3 mod (açık/tüm TR/AB'de kazanan TR)
- rate-limit korumalı (429 HTML gövdesi ele alınır), çok dilli alan çözümü
6) Kırmızı bayrak & şeffaflık
- analytics.js: redFlags (tek teklif, düşük kırım, tahmin üstü bedel,
aşırı düşük teklif, tedarikçi yoğunlaşması) + marketConcentration (HHI)
- RedFlags sekmesi: seviyeli uyarılar + yöntem şeffaflığı notu
35 lines
1.2 KiB
Docker
35 lines
1.2 KiB
Docker
# Stage 1: Vite SPA build
|
||
FROM node:22-alpine AS build
|
||
WORKDIR /app
|
||
COPY package*.json ./
|
||
RUN npm ci
|
||
COPY . .
|
||
RUN npm run build
|
||
|
||
# Stage 2: nginx (frontend) + node (canlı veri backend) tek container'da
|
||
FROM node:22-alpine
|
||
RUN apk add --no-cache nginx
|
||
|
||
# Frontend
|
||
COPY --from=build /app/dist /usr/share/nginx/html
|
||
COPY --from=build /app/nginx.conf /etc/nginx/http.d/default.conf
|
||
|
||
# Backend (yalnızca Node builtin'leri kullanır — npm bağımlılığı yok)
|
||
WORKDIR /app
|
||
COPY --from=build /app/server ./server
|
||
|
||
# Geçmiş sonuç veritabanı (SQLite). Deploy'lar arası kalıcılık için Coolify'da
|
||
# /app/server/data yoluna bir volume bağlanmalı; bağlanmazsa tarayıcı veriyi
|
||
# her yeniden dağıtımdan sonra yeniden biriktirir.
|
||
RUN mkdir -p /app/server/data
|
||
VOLUME ["/app/server/data"]
|
||
|
||
# Başlangıç: Node backend'i (sabit 3001) arka planda + nginx (80) ön planda.
|
||
# Coolify container'a PORT=80 verir; backend'i 3001'e sabitleyip nginx ile
|
||
# çakışmasını önlüyoruz (nginx /api → 127.0.0.1:3001 proxy'ler).
|
||
RUN printf '#!/bin/sh\nset -e\nPORT=3001 node /app/server/index.js &\nexec nginx -g "daemon off;"\n' > /start.sh \
|
||
&& chmod +x /start.sh
|
||
|
||
EXPOSE 80
|
||
CMD ["/start.sh"]
|