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_PASSWORD=postgres
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 جاسازی می‌شه (باید از مرورگر کاربر قابل‌دسترس باشه)
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
```
این کار ۴ کانتینر بالا می‌آره: `postgres`, `backend` (پورت `APP_PORT`), `web` (پورت `WEB_PORT`), `admin` (پورت `ADMIN_PORT`).
کامپوز هیچ وب‌سروری بالا نمی‌آره؛ ریورس‌پروکسی و ساب‌دامین‌ها با nginx خودت روی هاست ست می‌شن، مثلاً:
این کار ۴ کانتینر بالا می‌آره: `postgres`, `backend`, `web`, `admin`.
کامپوز هیچ وب‌سروری بالا نمی‌آره؛ ریورس‌پروکسی و ساب‌دامین‌ها با nginx خودت روی هاست ست می‌شن. چون کانتینر nginx روی همون شبکه‌ی داکری این کامپوز نشسته، می‌تونه مستقیم با نام کانتینر بهشون proxy_pass بده (به‌جای پورت هاست):
| ساب‌دامین | proxy_pass به |
| دامنه | proxy_pass به |
|---|---|
| `brainito.ir` | `127.0.0.1:${WEB_PORT}` |
| `admin.brainito.ir` | `127.0.0.1:${ADMIN_PORT}` |
| `api.brainito.ir` | `127.0.0.1:${APP_PORT}` |
| `brainito.ir` | `http://dating-app-backend-1:8080` |
| `app.brainito.ir` | `http://dating-app-web-1:3000` |
| `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
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
COPY --from=builder /out/server ./server
COPY server ./server
RUN chmod +x /app/server
RUN mkdir -p /app/uploads/photos
-8
View File
@@ -10,8 +10,6 @@ services:
POSTGRES_DB: ${DB_NAME:-dating_app}
volumes:
- postgres_data:/var/lib/postgresql/data
ports:
- "${DB_PORT:-5432}:5432"
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${DB_USER:-postgres} -d ${DB_NAME:-dating_app}"]
interval: 5s
@@ -32,8 +30,6 @@ services:
DB_HOST: postgres
DB_PORT: 5432
TZ: Asia/Tehran
ports:
- "${APP_PORT:-8080}:8080"
volumes:
- backend_uploads:/app/uploads
@@ -46,8 +42,6 @@ services:
restart: unless-stopped
depends_on:
- backend
ports:
- "${WEB_PORT:-3000}:3000"
admin:
build:
@@ -58,8 +52,6 @@ services:
restart: unless-stopped
depends_on:
- backend
ports:
- "${ADMIN_PORT:-3001}:3000"
volumes:
postgres_data:
+2 -1
View File
@@ -24,13 +24,14 @@ self.addEventListener("fetch", (event) => {
const url = new URL(event.request.url);
if (event.request.method !== "GET") return;
if (!url.protocol.startsWith("http")) return;
if (url.pathname.startsWith("/api")) return;
event.respondWith(
fetch(event.request)
.then((res) => {
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;
})
.catch(() => caches.match(event.request))