cb27a16dc1
Game table & play - UNO-style restyle: suit-aware bolder cards (+xl size), pulsing playable glow, big "YOUR TURN" pill, active-seat ring, trick-win particle burst, round confetti, match coin-rain. - Per-league turn time via turnMsForStake: 15s starter/AI, 10s pro, 7s expert; mirrored server-side in GameRoom.TurnMs. - Speed (Blitz) mode for vs-AI/private: 5s turns, race to 5, ~halved pacing. - Matchmaking waits ~15s (randomized 12-18s) then fills bots; elapsed timer + hint. Rewards / gifts - Richer post-match modal (floating coins, XP bar), celebration overlay reveals the unlocked sticker pack, boosted daily rewards (client+server synced), themed 7-day daily with special day-7. Social - Public profile modal (identity, stats, achievement board) from leaderboard / friends / discover / end-of-game roster; rate-limited add-friend (10/hour). - Social hub: Friends / Discover (player search + suggestions) / Messages inbox. - Profile gender (shown in finder/profile) + social links with public/friends/ hidden visibility, enforced server-side. Cosmetics - Distinct card backs: per-design pattern families (stripes/argyle/grid/dots/ rays/scales/crosshatch/royal/filigree/gem) + luxury motifs (lib/cardBack.ts), consistent on table/shop/profile; +Peacock/Rose-Gold backs. - Purchasable titles (shop Titles section); title shown under the seat on the table and in discover/public profile. - 10 new sticker packs (banter/kol-kol, Persian trends, court cards, moods). - Persistent level+XP bar on Home and every inner screen. Payments - Buy-coins gateway opens in a new tab (no SPA dead-end) + focus refresh. - Store IAB scaffolding: Cafe Bazaar deep-link purchase + redirect-token capture, Myket native-bridge contract, server-side IabService.Verify for both stores, config-driven via Iab__* env. POST /api/coins/iab/verify (JWT). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
100 lines
3.6 KiB
YAML
100 lines
3.6 KiB
YAML
# Barg-e Vasat — local/self-hosted stack.
|
||
# Ports live in the 1500–1600 range so this stack can run alongside a manual
|
||
# `npm run dev` (:3000) and `dotnet run` (:5005) without colliding.
|
||
# web → http://localhost:1500
|
||
# api → http://localhost:1505
|
||
# db → localhost:1510 (postgres)
|
||
# All values come from .env (the deploy job writes it from the ENV_FILE secret).
|
||
|
||
services:
|
||
db:
|
||
image: mirror.soroushasadi.com/postgres:16-alpine
|
||
container_name: hokm-db
|
||
restart: unless-stopped
|
||
environment:
|
||
POSTGRES_DB: hokm
|
||
POSTGRES_USER: hokm
|
||
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-hokm_dev_pass}
|
||
volumes:
|
||
- hokm_db_data:/var/lib/postgresql/data
|
||
ports:
|
||
- "${DB_PORT:-1510}:5432"
|
||
healthcheck:
|
||
test: ["CMD-SHELL", "pg_isready -U hokm -d hokm"]
|
||
interval: 5s
|
||
timeout: 5s
|
||
retries: 10
|
||
|
||
server:
|
||
build:
|
||
context: ./server
|
||
dockerfile: Dockerfile
|
||
args:
|
||
# Plain-HTTP Nexus (no SSL) — the HTTPS mirror serves a partial cert chain
|
||
# containers can't validate. Override via .env if needed.
|
||
NUGET_INDEX: ${NUGET_INDEX:-http://171.22.25.73:8081/repository/nuget-group/index.json}
|
||
image: hokm-server:latest
|
||
container_name: hokm-server
|
||
restart: unless-stopped
|
||
depends_on:
|
||
db:
|
||
condition: service_healthy
|
||
environment:
|
||
ASPNETCORE_ENVIRONMENT: Production
|
||
ASPNETCORE_URLS: http://0.0.0.0:5005
|
||
Database__Provider: postgres
|
||
ConnectionStrings__Default: "Host=db;Port=5432;Database=hokm;Username=hokm;Password=${POSTGRES_PASSWORD:-hokm_dev_pass}"
|
||
Jwt__Key: ${JWT_KEY:?set JWT_KEY in .env}
|
||
Jwt__Issuer: ${JWT_ISSUER:-hokm}
|
||
Jwt__Audience: ${JWT_AUDIENCE:-hokm-clients}
|
||
# Comma-separated origins the browser uses to reach the web app.
|
||
Cors__Origins: ${CORS_ORIGINS:-http://localhost:1500}
|
||
Zarinpal__MerchantId: ${ZARINPAL_MERCHANT_ID:-299685fb-cadf-4dfc-98e2-d4af5d81528d}
|
||
Zarinpal__Sandbox: ${ZARINPAL_SANDBOX:-true}
|
||
Zarinpal__CallbackUrl: ${ZARINPAL_CALLBACK_URL:-http://localhost:1505/api/coins/pay/callback}
|
||
Zarinpal__ClientReturnUrl: ${ZARINPAL_CLIENT_RETURN_URL:-http://localhost:1500}
|
||
# Store in-app billing verification (Cafe Bazaar / Myket) — fill from panels.
|
||
Iab__PackageName: ${IAB_PACKAGE_NAME:-com.bargevasat.hokm}
|
||
Iab__BazaarClientId: ${IAB_BAZAAR_CLIENT_ID:-}
|
||
Iab__BazaarClientSecret: ${IAB_BAZAAR_CLIENT_SECRET:-}
|
||
Iab__BazaarRefreshToken: ${IAB_BAZAAR_REFRESH_TOKEN:-}
|
||
Iab__MyketAccessToken: ${IAB_MYKET_ACCESS_TOKEN:-}
|
||
Iab__AllowUnverified: ${IAB_ALLOW_UNVERIFIED:-false}
|
||
ports:
|
||
- "${API_PORT:-1505}:5005"
|
||
healthcheck:
|
||
test: ["CMD", "wget", "-q", "-O-", "http://127.0.0.1:5005/"]
|
||
interval: 10s
|
||
timeout: 5s
|
||
retries: 12
|
||
start_period: 20s
|
||
|
||
web:
|
||
build:
|
||
context: .
|
||
dockerfile: Dockerfile
|
||
args:
|
||
# Baked into the static bundle at build time. Must be the address the
|
||
# BROWSER uses to reach the API (host-mapped api port, or LAN IP).
|
||
NEXT_PUBLIC_USE_SERVER: "1"
|
||
NEXT_PUBLIC_SERVER_URL: ${NEXT_PUBLIC_SERVER_URL:-http://localhost:1505}
|
||
# Plain-HTTP Nexus (no SSL). Override via .env if needed.
|
||
NPM_REGISTRY: ${NPM_REGISTRY:-http://171.22.25.73:8081/repository/npm-group/}
|
||
image: hokm-web:latest
|
||
container_name: hokm-web
|
||
restart: unless-stopped
|
||
depends_on:
|
||
server:
|
||
condition: service_healthy
|
||
ports:
|
||
- "${WEB_PORT:-1500}:80"
|
||
healthcheck:
|
||
test: ["CMD", "wget", "-q", "-O-", "http://127.0.0.1/"]
|
||
interval: 10s
|
||
timeout: 5s
|
||
retries: 6
|
||
start_period: 10s
|
||
|
||
volumes:
|
||
hokm_db_data:
|