shumiland-web/docker-compose.yml
Vadym Samoilenko 04b112d476 feat: Фаза 1 — фундамент проєкту Shumiland
- Ініціалізація Next.js 15.4.11 + Payload CMS 3.x (PostgreSQL/Drizzle)
- Docker Compose: PostgreSQL, Twenty CRM, Umami, Metabase
- Tailwind CSS 4 з brand кольорами (green/orange/blue/purple/yellow)
- Шрифти: Montserrat Alternates + Rubik через next/font/google
- shadcn/ui компоненти: Button, Input, Label, Textarea, Badge, Card, Separator
- Payload колекції: Users (ролі SUPER_ADMIN/ADMIN/EDITOR), Media (upload з sizes)
- Access control: isAdmin, isEditor, isSuperAdmin, isAdminOrPublished
- .env.example з усіма змінними середовища
- Dockerfile (multi-stage, output: standalone)
- Білд успішно проходить перевірку TypeScript

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-02 14:54:13 +01:00

155 lines
5.2 KiB
YAML

version: '3.8'
services:
# ─── База даних ───────────────────────────────────────────────
postgres:
image: postgres:16-alpine
container_name: shumiland-postgres
restart: unless-stopped
environment:
POSTGRES_USER: ${POSTGRES_USER:-shumiland}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-shumiland_secret}
POSTGRES_DB: ${POSTGRES_DB:-shumiland}
# Окремі бази для Umami та Twenty
UMAMI_DB: umami
TWENTY_DB: twenty
volumes:
- postgres_data:/var/lib/postgresql/data
- ./docker/postgres/init.sql:/docker-entrypoint-initdb.d/init.sql
ports:
- "5432:5432"
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-shumiland}"]
interval: 10s
timeout: 5s
retries: 5
networks:
- shumiland-net
# ─── Next.js + Payload CMS ─────────────────────────────────────
app:
build:
context: .
dockerfile: Dockerfile
container_name: shumiland-app
restart: unless-stopped
env_file: .env
ports:
- "3000:3000"
depends_on:
postgres:
condition: service_healthy
networks:
- shumiland-net
volumes:
- ./media:/app/media
profiles:
- production
# ─── Twenty CRM ─────────────────────────────────────────────────
twenty-server:
image: twentycrm/twenty:latest
container_name: shumiland-twenty
restart: unless-stopped
ports:
- "3003:3000"
environment:
NODE_PORT: 3000
PG_DATABASE_URL: postgresql://${POSTGRES_USER:-shumiland}:${POSTGRES_PASSWORD:-shumiland_secret}@postgres:5432/twenty
SERVER_URL: http://localhost:3003
FRONT_BASE_URL: http://localhost:3003
STORAGE_TYPE: local
STORAGE_LOCAL_PATH: /app/.local-storage
MESSAGE_QUEUE_TYPE: pg-boss
REDIS_URL: redis://twenty-redis:6379
ACCESS_TOKEN_SECRET: ${TWENTY_ACCESS_TOKEN_SECRET:-changeme-twenty-access-token}
LOGIN_TOKEN_SECRET: ${TWENTY_LOGIN_TOKEN_SECRET:-changeme-twenty-login-token}
REFRESH_TOKEN_SECRET: ${TWENTY_REFRESH_TOKEN_SECRET:-changeme-twenty-refresh-token}
FILE_TOKEN_SECRET: ${TWENTY_FILE_TOKEN_SECRET:-changeme-twenty-file-token}
APP_SECRET: ${TWENTY_APP_SECRET:-changeme-twenty-app-secret}
depends_on:
postgres:
condition: service_healthy
twenty-redis:
condition: service_started
volumes:
- twenty_data:/app/.local-storage
networks:
- shumiland-net
twenty-worker:
image: twentycrm/twenty:latest
container_name: shumiland-twenty-worker
restart: unless-stopped
command: ["yarn", "worker:prod"]
environment:
PG_DATABASE_URL: postgresql://${POSTGRES_USER:-shumiland}:${POSTGRES_PASSWORD:-shumiland_secret}@postgres:5432/twenty
SERVER_URL: http://twenty-server:3000
MESSAGE_QUEUE_TYPE: pg-boss
REDIS_URL: redis://twenty-redis:6379
ACCESS_TOKEN_SECRET: ${TWENTY_ACCESS_TOKEN_SECRET:-changeme-twenty-access-token}
LOGIN_TOKEN_SECRET: ${TWENTY_LOGIN_TOKEN_SECRET:-changeme-twenty-login-token}
REFRESH_TOKEN_SECRET: ${TWENTY_REFRESH_TOKEN_SECRET:-changeme-twenty-refresh-token}
FILE_TOKEN_SECRET: ${TWENTY_FILE_TOKEN_SECRET:-changeme-twenty-file-token}
APP_SECRET: ${TWENTY_APP_SECRET:-changeme-twenty-app-secret}
depends_on:
- twenty-server
networks:
- shumiland-net
twenty-redis:
image: redis:7-alpine
container_name: shumiland-twenty-redis
restart: unless-stopped
networks:
- shumiland-net
# ─── Umami Analytics ────────────────────────────────────────────
umami:
image: ghcr.io/umami-software/umami:postgresql-latest
container_name: shumiland-umami
restart: unless-stopped
ports:
- "3001:3000"
environment:
DATABASE_URL: postgresql://${POSTGRES_USER:-shumiland}:${POSTGRES_PASSWORD:-shumiland_secret}@postgres:5432/umami
DATABASE_TYPE: postgresql
APP_SECRET: ${UMAMI_APP_SECRET:-changeme-umami-secret}
DISABLE_TELEMETRY: 1
depends_on:
postgres:
condition: service_healthy
networks:
- shumiland-net
# ─── Metabase BI ────────────────────────────────────────────────
metabase:
image: metabase/metabase:latest
container_name: shumiland-metabase
restart: unless-stopped
ports:
- "3002:3000"
environment:
MB_DB_TYPE: postgres
MB_DB_DBNAME: metabase
MB_DB_PORT: 5432
MB_DB_USER: ${POSTGRES_USER:-shumiland}
MB_DB_PASS: ${POSTGRES_PASSWORD:-shumiland_secret}
MB_DB_HOST: postgres
JAVA_TIMEZONE: Europe/Kyiv
depends_on:
postgres:
condition: service_healthy
volumes:
- metabase_data:/metabase-data
networks:
- shumiland-net
volumes:
postgres_data:
twenty_data:
metabase_data:
networks:
shumiland-net:
driver: bridge