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:
soroush.asadi
2026-05-29 17:02:22 +03:30
parent 16cff8730b
commit 289c808257
43 changed files with 74 additions and 58 deletions
+5 -5
View File
@@ -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
+8 -8
View File
@@ -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: |
+5 -5
View File
@@ -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:
+2 -2
View File
@@ -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
+4 -4
View File
@@ -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 ────────────────────────────────────────────────────────
+8 -8
View File
@@ -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 ~510 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
+1 -1
View File
@@ -36,7 +36,7 @@ services:
- api
- web
- website
- finder
- koja
- admin-api
- admin-web
+8 -8
View File
@@ -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
View File
@@ -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: [],
};
}
@@ -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>
@@ -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": "بعداً",