Compare commits

...

4 Commits

5 changed files with 13 additions and 37 deletions
+1 -7
View File
@@ -2,12 +2,6 @@
DB_USER=postgres DB_USER=postgres
DB_PASSWORD=postgres DB_PASSWORD=postgres
DB_NAME=dating_app DB_NAME=dating_app
DB_PORT=5432
# پورت‌هایی که روی هاست منتشر می‌شن؛ نگینکس خودت رو به این پورت‌ها proxy_pass کن
APP_PORT=8080 # -> api.brainito.ir
WEB_PORT=3000 # -> brainito.ir
ADMIN_PORT=3001 # -> admin.brainito.ir
# آدرس API که موقع build توی باندل کلاینت web/admin جاسازی می‌شه (باید از مرورگر کاربر قابل‌دسترس باشه) # آدرس API که موقع build توی باندل کلاینت web/admin جاسازی می‌شه (باید از مرورگر کاربر قابل‌دسترس باشه)
PUBLIC_API_URL=https://api.brainito.ir/api/v1 PUBLIC_API_URL=https://brainito.ir/api/v1
+9 -7
View File
@@ -19,13 +19,15 @@ cp .env.example .env # مقادیر رو با دامنه/رمزهای واقع
docker compose up -d --build docker compose up -d --build
``` ```
این کار ۴ کانتینر بالا می‌آره: `postgres`, `backend` (پورت `APP_PORT`), `web` (پورت `WEB_PORT`), `admin` (پورت `ADMIN_PORT`). این کار ۴ کانتینر بالا می‌آره: `postgres`, `backend`, `web`, `admin`.
کامپوز هیچ وب‌سروری بالا نمی‌آره؛ ریورس‌پروکسی و ساب‌دامین‌ها با nginx خودت روی هاست ست می‌شن، مثلاً: کامپوز هیچ وب‌سروری بالا نمی‌آره؛ ریورس‌پروکسی و ساب‌دامین‌ها با nginx خودت روی هاست ست می‌شن. چون کانتینر nginx روی همون شبکه‌ی داکری این کامپوز نشسته، می‌تونه مستقیم با نام کانتینر بهشون proxy_pass بده (به‌جای پورت هاست):
| ساب‌دامین | proxy_pass به | | دامنه | proxy_pass به |
|---|---| |---|---|
| `brainito.ir` | `127.0.0.1:${WEB_PORT}` | | `brainito.ir` | `http://dating-app-backend-1:8080` |
| `admin.brainito.ir` | `127.0.0.1:${ADMIN_PORT}` | | `app.brainito.ir` | `http://dating-app-web-1:3000` |
| `api.brainito.ir` | `127.0.0.1:${APP_PORT}` | | `panel.brainito.ir` | `http://dating-app-admin-1:3000` |
سکرت‌های اختصاصی بک‌اند (JWT، DB و...) توی `backend/.env` می‌مونن و از اونجا با `env_file` به سرویس `backend` پاس داده می‌شن؛ `.env` ریشه فقط برای متغیرهای مشترک کامپوز (پورت‌ها، اطلاعات پستگرس، آدرس عمومی API) استفاده می‌شه. (نام کانتینرها بر اساس `name: dating-app` توی کامپوز و پیشوند سرویس ساخته می‌شن؛ اگه پروژه رو با نام دیگه‌ای بالا بیاری این نام‌ها عوض می‌شن.)
هیچ سرویسی پورتی روی هاست منتشر نمی‌کنه؛ فقط روی شبکه‌ی داکلی کامپوز با نام کانتینر در دسترسن (nginx باید به همون شبکه متصل باشه). سکرت‌های اختصاصی بک‌اند (JWT، DB و...) توی `backend/.env` می‌مونن و از اونجا با `env_file` به سرویس `backend` پاس داده می‌شن؛ `.env` ریشه فقط برای اطلاعات پستگرس و آدرس عمومی API استفاده می‌شه.
+1 -14
View File
@@ -1,16 +1,3 @@
# ---- مرحله‌ی build ----
FROM golang:1.22-alpine AS builder
WORKDIR /app
RUN sed -i 's|dl-cdn.alpinelinux.org|mirror.mobinhost.com|g' /etc/apk/repositories
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o /out/server ./cmd/api
# ---- مرحله‌ی اجرا (ایمیج نهایی سبک) ----
FROM alpine:3.20 FROM alpine:3.20
RUN sed -i 's|dl-cdn.alpinelinux.org|mirror.mobinhost.com|g' /etc/apk/repositories \ RUN sed -i 's|dl-cdn.alpinelinux.org|mirror.mobinhost.com|g' /etc/apk/repositories \
@@ -18,7 +5,7 @@ RUN sed -i 's|dl-cdn.alpinelinux.org|mirror.mobinhost.com|g' /etc/apk/repositori
WORKDIR /app WORKDIR /app
COPY --from=builder /out/server ./server COPY server ./server
RUN chmod +x /app/server RUN chmod +x /app/server
RUN mkdir -p /app/uploads/photos RUN mkdir -p /app/uploads/photos
-8
View File
@@ -10,8 +10,6 @@ services:
POSTGRES_DB: ${DB_NAME:-dating_app} POSTGRES_DB: ${DB_NAME:-dating_app}
volumes: volumes:
- postgres_data:/var/lib/postgresql/data - postgres_data:/var/lib/postgresql/data
ports:
- "${DB_PORT:-5432}:5432"
healthcheck: healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${DB_USER:-postgres} -d ${DB_NAME:-dating_app}"] test: ["CMD-SHELL", "pg_isready -U ${DB_USER:-postgres} -d ${DB_NAME:-dating_app}"]
interval: 5s interval: 5s
@@ -32,8 +30,6 @@ services:
DB_HOST: postgres DB_HOST: postgres
DB_PORT: 5432 DB_PORT: 5432
TZ: Asia/Tehran TZ: Asia/Tehran
ports:
- "${APP_PORT:-8080}:8080"
volumes: volumes:
- backend_uploads:/app/uploads - backend_uploads:/app/uploads
@@ -46,8 +42,6 @@ services:
restart: unless-stopped restart: unless-stopped
depends_on: depends_on:
- backend - backend
ports:
- "${WEB_PORT:-3000}:3000"
admin: admin:
build: build:
@@ -58,8 +52,6 @@ services:
restart: unless-stopped restart: unless-stopped
depends_on: depends_on:
- backend - backend
ports:
- "${ADMIN_PORT:-3001}:3000"
volumes: volumes:
postgres_data: postgres_data:
+2 -1
View File
@@ -24,13 +24,14 @@ self.addEventListener("fetch", (event) => {
const url = new URL(event.request.url); const url = new URL(event.request.url);
if (event.request.method !== "GET") return; if (event.request.method !== "GET") return;
if (!url.protocol.startsWith("http")) return;
if (url.pathname.startsWith("/api")) return; if (url.pathname.startsWith("/api")) return;
event.respondWith( event.respondWith(
fetch(event.request) fetch(event.request)
.then((res) => { .then((res) => {
const resClone = res.clone(); const resClone = res.clone();
caches.open(CACHE_NAME).then((cache) => cache.put(event.request, resClone)); caches.open(CACHE_NAME).then((cache) => cache.put(event.request, resClone).catch(() => {}));
return res; return res;
}) })
.catch(() => caches.match(event.request)) .catch(() => caches.match(event.request))