Rename public discovery app from "finder" to "koja"
Rebrand the public café-discovery app: directories web/finder→web/koja and docker/finder→docker/koja, plus all service wiring (docker-compose, Caddy subdomain koja.meezi.ir, env vars KOJA_PORT / NEXT_PUBLIC_KOJA_URL, CI workflows) and the app's display name (Koja / کجا). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
+5
-5
@@ -24,7 +24,7 @@ JWT_KEY=change-me-64-char-random-string-use-openssl-rand-hex-32-output
|
||||
NEXT_PUBLIC_API_URL=http://171.22.25.73:5080
|
||||
NEXT_PUBLIC_ADMIN_API_URL=http://171.22.25.73:5081
|
||||
NEXT_PUBLIC_SITE_URL=http://171.22.25.73:3010
|
||||
NEXT_PUBLIC_FINDER_URL=http://171.22.25.73:3103
|
||||
NEXT_PUBLIC_KOJA_URL=http://171.22.25.73:3103
|
||||
|
||||
APP_QR_BASE_URL=http://171.22.25.73:3101
|
||||
BILLING_DASHBOARD_URL=http://171.22.25.73:3101
|
||||
@@ -40,7 +40,7 @@ ADMIN_API_PORT=5081
|
||||
WEB_PORT=3101
|
||||
ADMIN_WEB_PORT=3102
|
||||
WEBSITE_PORT=3010
|
||||
FINDER_PORT=3103
|
||||
KOJA_PORT=3103
|
||||
POSTGRES_PORT=5434
|
||||
REDIS_PORT=6381
|
||||
|
||||
@@ -51,19 +51,19 @@ REDIS_PORT=6381
|
||||
# NEXT_PUBLIC_API_URL=https://api.meezi.ir
|
||||
# NEXT_PUBLIC_ADMIN_API_URL=https://admin-api.meezi.ir
|
||||
# NEXT_PUBLIC_SITE_URL=https://meezi.ir
|
||||
# NEXT_PUBLIC_FINDER_URL=https://finder.meezi.ir
|
||||
# NEXT_PUBLIC_KOJA_URL=https://koja.meezi.ir
|
||||
#
|
||||
# APP_QR_BASE_URL=https://app.meezi.ir
|
||||
# BILLING_DASHBOARD_URL=https://app.meezi.ir
|
||||
#
|
||||
# CORS_ORIGIN_0=https://app.meezi.ir
|
||||
# CORS_ORIGIN_1=https://meezi.ir
|
||||
# CORS_ORIGIN_2=https://finder.meezi.ir
|
||||
# CORS_ORIGIN_2=https://koja.meezi.ir
|
||||
# CORS_ADMIN_ORIGIN_0=https://admin.meezi.ir
|
||||
#
|
||||
# Then run CI once to rebuild images with the new URLs baked in.
|
||||
# DNS required: meezi.ir, app.meezi.ir, api.meezi.ir,
|
||||
# finder.meezi.ir, admin.meezi.ir, admin-api.meezi.ir → server IP
|
||||
# koja.meezi.ir, admin.meezi.ir, admin-api.meezi.ir → server IP
|
||||
|
||||
# ── Migrations ────────────────────────────────────────────────────────────────
|
||||
RUN_MIGRATIONS=true
|
||||
|
||||
@@ -228,8 +228,8 @@ jobs:
|
||||
env:
|
||||
MEEZI_API_URL: http://localhost:5080
|
||||
|
||||
finder-check:
|
||||
name: "CI · Finder (tsc)"
|
||||
koja-check:
|
||||
name: "CI · Koja (tsc)"
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: 171.22.25.73:5000/library/node:20-alpine
|
||||
@@ -250,11 +250,11 @@ jobs:
|
||||
rm -f /tmp/repo.tar.gz
|
||||
|
||||
- name: Install dependencies
|
||||
working-directory: web/finder
|
||||
working-directory: web/koja
|
||||
run: npm install --legacy-peer-deps --ignore-scripts --registry http://mirror:8081/repository/npm-group/
|
||||
|
||||
- name: TypeScript check
|
||||
working-directory: web/finder
|
||||
working-directory: web/koja
|
||||
run: npx tsc --noEmit
|
||||
env:
|
||||
NEXT_PUBLIC_API_URL: http://localhost:5080
|
||||
@@ -276,7 +276,7 @@ jobs:
|
||||
- dashboard-check
|
||||
- admin-web-check
|
||||
- website-check
|
||||
- finder-check
|
||||
- koja-check
|
||||
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
|
||||
timeout-minutes: 40
|
||||
|
||||
@@ -297,8 +297,8 @@ jobs:
|
||||
env:
|
||||
ENV_FILE: ${{ secrets.ENV_FILE }}
|
||||
|
||||
- name: Build main images (api, web, website, finder)
|
||||
run: docker compose build --parallel api web website finder
|
||||
- name: Build main images (api, web, website, koja)
|
||||
run: docker compose build --parallel api web website koja
|
||||
env:
|
||||
DOCKER_BUILDKIT: 1
|
||||
COMPOSE_DOCKER_CLI_BUILD: 1
|
||||
@@ -318,7 +318,7 @@ jobs:
|
||||
docker compose up -d \
|
||||
--remove-orphans \
|
||||
--no-deps \
|
||||
postgres redis api web website finder
|
||||
postgres redis api web website koja
|
||||
|
||||
- name: Start admin services
|
||||
run: |
|
||||
|
||||
@@ -58,20 +58,20 @@ jobs:
|
||||
env:
|
||||
NEXT_PUBLIC_API_URL: http://localhost:5080
|
||||
|
||||
# ── Finder: typecheck ──────────────────────────────────────────────────────
|
||||
finder:
|
||||
name: Finder (Next.js typecheck)
|
||||
# ── Koja: typecheck ─────────────────────────────────────────────────────────
|
||||
koja:
|
||||
name: Koja (Next.js typecheck)
|
||||
runs-on: ubuntu-latest
|
||||
defaults:
|
||||
run:
|
||||
working-directory: web/finder
|
||||
working-directory: web/koja
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: "20"
|
||||
cache: npm
|
||||
cache-dependency-path: web/finder/package-lock.json
|
||||
cache-dependency-path: web/koja/package-lock.json
|
||||
- run: npm install --legacy-peer-deps --ignore-scripts
|
||||
- run: npx tsc --noEmit
|
||||
env:
|
||||
|
||||
@@ -32,7 +32,7 @@ jobs:
|
||||
run: |
|
||||
docker compose build --parallel \
|
||||
--build-arg BUILDKIT_INLINE_CACHE=1 \
|
||||
api web website finder
|
||||
api web website koja
|
||||
env:
|
||||
DOCKER_BUILDKIT: 1
|
||||
COMPOSE_DOCKER_CLI_BUILD: 1
|
||||
@@ -43,7 +43,7 @@ jobs:
|
||||
docker compose up -d \
|
||||
--remove-orphans \
|
||||
--no-deps \
|
||||
postgres redis api web website finder
|
||||
postgres redis api web website koja
|
||||
|
||||
# Wait for API healthcheck before declaring success
|
||||
- name: Wait for API health
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
# Caddy auto-provisions Let's Encrypt TLS — no certbot needed.
|
||||
# Domains needed in DNS (all → same server IP):
|
||||
# meezi.ir, app.meezi.ir, api.meezi.ir,
|
||||
# finder.meezi.ir, admin.meezi.ir, admin-api.meezi.ir
|
||||
# koja.meezi.ir, admin.meezi.ir, admin-api.meezi.ir
|
||||
|
||||
{
|
||||
email {$ACME_EMAIL}
|
||||
@@ -27,9 +27,9 @@ api.{$DOMAIN} {
|
||||
reverse_proxy api:8080
|
||||
}
|
||||
|
||||
# ── Finder (public discovery) ────────────────────────────────────────────────
|
||||
finder.{$DOMAIN} {
|
||||
reverse_proxy finder:3000
|
||||
# ── Koja (public discovery) ──────────────────────────────────────────────────
|
||||
koja.{$DOMAIN} {
|
||||
reverse_proxy koja:3000
|
||||
}
|
||||
|
||||
# ── Super-Admin panel ────────────────────────────────────────────────────────
|
||||
|
||||
@@ -13,7 +13,7 @@ Server: 171.22.25.73
|
||||
├── meezi-web :3101 ← Next.js cafe owner dashboard
|
||||
├── meezi-admin-web:3102 ← Next.js super-admin panel
|
||||
├── meezi-website :3010 ← Next.js marketing website
|
||||
├── meezi-finder :3103 ← Next.js public finder
|
||||
├── meezi-koja :3103 ← Next.js public discovery (Koja)
|
||||
├── meezi-db :5434 ← PostgreSQL (not internet-facing)
|
||||
└── meezi-redis :6381 ← Redis (not internet-facing)
|
||||
```
|
||||
@@ -21,7 +21,7 @@ Server: 171.22.25.73
|
||||
Docker Compose files:
|
||||
|
||||
```
|
||||
docker-compose.yml main services (postgres, redis, api, web, website, finder)
|
||||
docker-compose.yml main services (postgres, redis, api, web, website, koja)
|
||||
docker-compose.admin.yml admin overlay (+admin-api, +admin-web)
|
||||
docker-compose.mirror.yml Nexus mirror — run once separately, stays running
|
||||
docker-compose.caddy.yml Caddy HTTPS proxy — add when domain is ready
|
||||
@@ -60,7 +60,7 @@ RUN_MIGRATIONS=true
|
||||
NEXT_PUBLIC_API_URL=http://171.22.25.73:5080
|
||||
NEXT_PUBLIC_ADMIN_API_URL=http://171.22.25.73:5081
|
||||
NEXT_PUBLIC_SITE_URL=http://171.22.25.73:3010
|
||||
NEXT_PUBLIC_FINDER_URL=http://171.22.25.73:3103
|
||||
NEXT_PUBLIC_KOJA_URL=http://171.22.25.73:3103
|
||||
|
||||
APP_QR_BASE_URL=http://171.22.25.73:3101
|
||||
BILLING_DASHBOARD_URL=http://171.22.25.73:3101
|
||||
@@ -77,7 +77,7 @@ ADMIN_API_PORT=5081
|
||||
WEB_PORT=3101
|
||||
ADMIN_WEB_PORT=3102
|
||||
WEBSITE_PORT=3010
|
||||
FINDER_PORT=3103
|
||||
KOJA_PORT=3103
|
||||
POSTGRES_PORT=5434
|
||||
REDIS_PORT=6381
|
||||
|
||||
@@ -123,7 +123,7 @@ CI takes ~5–10 minutes: builds 6 Docker images, runs all checks, then deploys.
|
||||
|---|---|
|
||||
| Marketing website | http://171.22.25.73:3010/fa |
|
||||
| Cafe owner dashboard | http://171.22.25.73:3101/fa/login |
|
||||
| Public finder | http://171.22.25.73:3103/fa |
|
||||
| Public Koja | http://171.22.25.73:3103/fa |
|
||||
| Super-admin panel | http://171.22.25.73:3102/fa/admin/login |
|
||||
| Main API (Swagger) | http://171.22.25.73:5080/swagger |
|
||||
| Admin API (Swagger) | http://171.22.25.73:5081/swagger |
|
||||
@@ -173,7 +173,7 @@ Create these A records — all pointing to `171.22.25.73`:
|
||||
| `meezi.ir` | Marketing website |
|
||||
| `app.meezi.ir` | Cafe dashboard |
|
||||
| `api.meezi.ir` | Main API |
|
||||
| `finder.meezi.ir` | Finder |
|
||||
| `koja.meezi.ir` | Koja |
|
||||
| `admin.meezi.ir` | Admin panel |
|
||||
| `admin-api.meezi.ir` | Admin API |
|
||||
|
||||
@@ -189,14 +189,14 @@ ACME_EMAIL=you@example.com
|
||||
NEXT_PUBLIC_API_URL=https://api.meezi.ir
|
||||
NEXT_PUBLIC_ADMIN_API_URL=https://admin-api.meezi.ir
|
||||
NEXT_PUBLIC_SITE_URL=https://meezi.ir
|
||||
NEXT_PUBLIC_FINDER_URL=https://finder.meezi.ir
|
||||
NEXT_PUBLIC_KOJA_URL=https://koja.meezi.ir
|
||||
|
||||
APP_QR_BASE_URL=https://app.meezi.ir
|
||||
BILLING_DASHBOARD_URL=https://app.meezi.ir
|
||||
|
||||
CORS_ORIGIN_0=https://app.meezi.ir
|
||||
CORS_ORIGIN_1=https://meezi.ir
|
||||
CORS_ORIGIN_2=https://finder.meezi.ir
|
||||
CORS_ORIGIN_2=https://koja.meezi.ir
|
||||
CORS_ADMIN_ORIGIN_0=https://admin.meezi.ir
|
||||
|
||||
# Remove all PORT= lines — Caddy is the only public endpoint
|
||||
|
||||
@@ -36,7 +36,7 @@ services:
|
||||
- api
|
||||
- web
|
||||
- website
|
||||
- finder
|
||||
- koja
|
||||
- admin-api
|
||||
- admin-web
|
||||
|
||||
|
||||
+8
-8
@@ -1,4 +1,4 @@
|
||||
# Meezi — main stack (Postgres, Redis, API, Dashboard, Website, Finder)
|
||||
# Meezi — main stack (Postgres, Redis, API, Dashboard, Website, Koja)
|
||||
#
|
||||
# Local dev:
|
||||
# cp .env.example .env
|
||||
@@ -13,7 +13,7 @@
|
||||
# URLs (port-based defaults):
|
||||
# Dashboard http://SERVER:3101/fa/login
|
||||
# Website http://SERVER:3010/fa
|
||||
# Finder http://SERVER:3103/fa
|
||||
# Koja http://SERVER:3103/fa
|
||||
# API http://SERVER:5080/swagger
|
||||
|
||||
services:
|
||||
@@ -141,18 +141,18 @@ services:
|
||||
ports:
|
||||
- "${WEBSITE_PORT:-3010}:3000"
|
||||
|
||||
finder:
|
||||
koja:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: docker/finder/Dockerfile
|
||||
dockerfile: docker/koja/Dockerfile
|
||||
extra_hosts:
|
||||
- "mirror:host-gateway"
|
||||
args:
|
||||
NODE_IMAGE: ${NODE_IMAGE:-docker-mirror.liara.ir/library/node:20-alpine}
|
||||
NPM_REGISTRY: ${NPM_REGISTRY:-https://package-mirror.liara.ir/repository/npm/}
|
||||
NEXT_PUBLIC_API_URL: ${NEXT_PUBLIC_API_URL:-http://localhost:5080}
|
||||
NEXT_PUBLIC_SITE_URL: ${NEXT_PUBLIC_FINDER_URL:-http://localhost:3103}
|
||||
container_name: meezi-finder
|
||||
NEXT_PUBLIC_SITE_URL: ${NEXT_PUBLIC_KOJA_URL:-http://localhost:3103}
|
||||
container_name: meezi-koja
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
api:
|
||||
@@ -161,9 +161,9 @@ services:
|
||||
PORT: "3000"
|
||||
HOSTNAME: 0.0.0.0
|
||||
NEXT_PUBLIC_API_URL: "${NEXT_PUBLIC_API_URL:-http://localhost:5080}"
|
||||
NEXT_PUBLIC_SITE_URL: "${NEXT_PUBLIC_FINDER_URL:-http://localhost:3103}"
|
||||
NEXT_PUBLIC_SITE_URL: "${NEXT_PUBLIC_KOJA_URL:-http://localhost:3103}"
|
||||
ports:
|
||||
- "${FINDER_PORT:-3103}:3000"
|
||||
- "${KOJA_PORT:-3103}:3000"
|
||||
|
||||
volumes:
|
||||
postgres_data:
|
||||
|
||||
@@ -2,7 +2,7 @@ ARG NODE_IMAGE=docker-mirror.liara.ir/library/node:20-alpine
|
||||
|
||||
FROM ${NODE_IMAGE} AS deps
|
||||
WORKDIR /app
|
||||
COPY web/finder/package*.json ./
|
||||
COPY web/koja/package*.json ./
|
||||
ARG NPM_REGISTRY=https://package-mirror.liara.ir/repository/npm/
|
||||
RUN npm install --legacy-peer-deps --ignore-scripts --registry ${NPM_REGISTRY}
|
||||
|
||||
@@ -10,13 +10,13 @@ FROM ${NODE_IMAGE} AS builder
|
||||
WORKDIR /app
|
||||
|
||||
ARG NEXT_PUBLIC_API_URL=http://localhost:5080
|
||||
ARG NEXT_PUBLIC_SITE_URL=https://find.meezi.ir
|
||||
ARG NEXT_PUBLIC_SITE_URL=https://koja.meezi.ir
|
||||
ENV NEXT_PUBLIC_API_URL=$NEXT_PUBLIC_API_URL
|
||||
ENV NEXT_PUBLIC_SITE_URL=$NEXT_PUBLIC_SITE_URL
|
||||
ENV NEXT_TELEMETRY_DISABLED=1
|
||||
|
||||
COPY --from=deps /app/node_modules ./node_modules
|
||||
COPY web/finder/ .
|
||||
COPY web/koja/ .
|
||||
RUN npm run build
|
||||
|
||||
FROM ${NODE_IMAGE} AS runner
|
||||
+2
-2
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"name": "meezi-finder",
|
||||
"name": "koja",
|
||||
"version": "0.1.0",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "meezi-finder",
|
||||
"name": "koja",
|
||||
"version": "0.1.0",
|
||||
"dependencies": {
|
||||
"@ducanh2912/next-pwa": "^10.2.9",
|
||||
@@ -1,14 +1,20 @@
|
||||
{
|
||||
"name": "meezi-finder",
|
||||
"name": "koja",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "next dev",
|
||||
"build": "next build",
|
||||
"start": "next start",
|
||||
"lint": "next lint"
|
||||
"lint": "next lint",
|
||||
"cap:sync": "cap sync android",
|
||||
"cap:open": "cap open android"
|
||||
},
|
||||
"dependencies": {
|
||||
"@capacitor/android": "^6.2.0",
|
||||
"@capacitor/core": "^6.2.0",
|
||||
"@capacitor/splash-screen": "^6.0.3",
|
||||
"cordova-plugin-pushe": "^2.5.0",
|
||||
"next": "16.2.6",
|
||||
"react": "19.2.6",
|
||||
"react-dom": "19.2.6",
|
||||
@@ -22,6 +28,7 @@
|
||||
"date-fns-jalali": "^3.4.0-0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@capacitor/cli": "^6.2.0",
|
||||
"typescript": "5.8.3",
|
||||
"@types/node": "^22",
|
||||
"@types/react": "19.1.4",
|
||||
|
Before Width: | Height: | Size: 547 B After Width: | Height: | Size: 547 B |
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.8 KiB |
@@ -2,8 +2,9 @@ import type { MetadataRoute } from "next";
|
||||
|
||||
export default function manifest(): MetadataRoute.Manifest {
|
||||
return {
|
||||
name: "میزییاب — جستجوی کافه و رستوران",
|
||||
short_name: "میزییاب",
|
||||
id: "/fa",
|
||||
name: "کجا — جستجوی کافه و رستوران",
|
||||
short_name: "کجا",
|
||||
description: "بهترین کافهها و رستورانهای ایران را با هوش مصنوعی پیدا کنید",
|
||||
start_url: "/fa",
|
||||
display: "standalone",
|
||||
@@ -33,6 +34,14 @@ export default function manifest(): MetadataRoute.Manifest {
|
||||
purpose: "maskable",
|
||||
},
|
||||
],
|
||||
shortcuts: [
|
||||
{
|
||||
name: "جستجوی کافه",
|
||||
short_name: "جستجو",
|
||||
url: "/fa/search",
|
||||
icons: [{ src: "/icons/icon-192.png", sizes: "192x192" }],
|
||||
},
|
||||
],
|
||||
screenshots: [],
|
||||
};
|
||||
}
|
||||
+1
-1
@@ -16,7 +16,7 @@ export function Footer() {
|
||||
<MapPin className="h-3.5 w-3.5 text-white" />
|
||||
</div>
|
||||
<span className="font-bold text-gray-900">
|
||||
{locale === "fa" ? "میزییاب" : "Meezi Finder"}
|
||||
{locale === "fa" ? "کجا" : "Koja"}
|
||||
</span>
|
||||
</div>
|
||||
<p className="mt-3 text-xs leading-relaxed text-gray-500">{t("tagline")}</p>
|
||||
+1
-1
@@ -30,7 +30,7 @@ export function Navbar() {
|
||||
<MapPin className="h-4 w-4 text-white" />
|
||||
</div>
|
||||
<span className="text-base font-bold text-gray-900">
|
||||
{locale === "fa" ? "میزییاب" : "Meezi Finder"}
|
||||
{locale === "fa" ? "کجا" : "Koja"}
|
||||
</span>
|
||||
</a>
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"meta": {
|
||||
"siteName": "Meezi Finder",
|
||||
"siteName": "Koja",
|
||||
"siteDescription": "Discover the best cafes and restaurants in Iran with AI",
|
||||
"homeTitle": "Meezi Finder — AI-Powered Cafe Discovery",
|
||||
"homeTitle": "Koja — AI-Powered Cafe Discovery",
|
||||
"homeDescription": "Find the best cafes and restaurants near you with AI-powered search. Filter by vibe, price, menu, and amenities.",
|
||||
"searchTitle": "Search Cafes & Restaurants",
|
||||
"offlineTitle": "You're Offline",
|
||||
@@ -102,7 +102,7 @@
|
||||
"copyright": "© 2025 Meezi. All rights reserved."
|
||||
},
|
||||
"pwa": {
|
||||
"installTitle": "Install Meezi Finder",
|
||||
"installTitle": "Install Koja",
|
||||
"installDesc": "Add to your home screen for faster access",
|
||||
"installBtn": "Install",
|
||||
"dismissBtn": "Later",
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"meta": {
|
||||
"siteName": "میزییاب",
|
||||
"siteName": "کجا",
|
||||
"siteDescription": "بهترین کافهها و رستورانهای ایران را با هوش مصنوعی پیدا کنید",
|
||||
"homeTitle": "میزییاب — جستجوی هوشمند کافه و رستوران",
|
||||
"homeTitle": "کجا — جستجوی هوشمند کافه و رستوران",
|
||||
"homeDescription": "بهترین کافهها و رستورانهای شهر را با جستجوی هوش مصنوعی پیدا کنید. فیلتر براساس فضا، قیمت، منو و امکانات.",
|
||||
"searchTitle": "جستجوی کافه و رستوران",
|
||||
"offlineTitle": "بدون اینترنت",
|
||||
@@ -102,7 +102,7 @@
|
||||
"copyright": "© ۱۴۰۵ میزی. تمام حقوق محفوظ است."
|
||||
},
|
||||
"pwa": {
|
||||
"installTitle": "نصب اپ میزییاب",
|
||||
"installTitle": "نصب اپ کجا",
|
||||
"installDesc": "برای دسترسی سریعتر روی گوشی نصب کنید",
|
||||
"installBtn": "نصب",
|
||||
"dismissBtn": "بعداً",
|
||||
Reference in New Issue
Block a user