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