mirror of
https://github.com/fromchat-messenger/web.git
synced 2026-09-22 19:15:08 +03:00
Implement real, working microservices architecture
This commit is contained in:
@@ -0,0 +1,68 @@
|
||||
-- Initialize database roles and schemas for FromChat microservices
|
||||
-- This script creates dedicated users with limited privileges for each service
|
||||
|
||||
-- Create service-specific database roles with limited privileges
|
||||
CREATE ROLE account_service_user LOGIN PASSWORD 'account_service_password';
|
||||
CREATE ROLE profile_service_user LOGIN PASSWORD 'profile_service_password';
|
||||
CREATE ROLE device_service_user LOGIN PASSWORD 'device_service_password';
|
||||
CREATE ROLE messaging_service_user LOGIN PASSWORD 'messaging_service_password';
|
||||
CREATE ROLE push_service_user LOGIN PASSWORD 'push_service_user_password';
|
||||
CREATE ROLE webrtc_service_user LOGIN PASSWORD 'webrtc_service_password';
|
||||
CREATE ROLE moderation_service_user LOGIN PASSWORD 'moderation_service_password';
|
||||
|
||||
-- Create dedicated schemas for each service
|
||||
CREATE SCHEMA IF NOT EXISTS account_schema AUTHORIZATION account_service_user;
|
||||
CREATE SCHEMA IF NOT EXISTS profile_schema AUTHORIZATION profile_service_user;
|
||||
CREATE SCHEMA IF NOT EXISTS device_schema AUTHORIZATION device_service_user;
|
||||
CREATE SCHEMA IF NOT EXISTS messaging_schema AUTHORIZATION messaging_service_user;
|
||||
CREATE SCHEMA IF NOT EXISTS push_schema AUTHORIZATION push_service_user;
|
||||
CREATE SCHEMA IF NOT EXISTS webrtc_schema AUTHORIZATION webrtc_service_user;
|
||||
CREATE SCHEMA IF NOT EXISTS moderation_schema AUTHORIZATION moderation_service_user;
|
||||
|
||||
-- Grant basic connection privileges
|
||||
GRANT CONNECT ON DATABASE fromchat TO account_service_user, profile_service_user, device_service_user, messaging_service_user, push_service_user, webrtc_service_user, moderation_service_user;
|
||||
|
||||
-- Grant schema-level privileges (limited to each service's schema)
|
||||
-- Account service
|
||||
GRANT USAGE ON SCHEMA account_schema TO account_service_user;
|
||||
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA account_schema TO account_service_user;
|
||||
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA account_schema TO account_service_user;
|
||||
|
||||
-- Profile service
|
||||
GRANT USAGE ON SCHEMA profile_schema TO profile_service_user;
|
||||
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA profile_schema TO profile_service_user;
|
||||
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA profile_schema TO profile_service_user;
|
||||
|
||||
-- Device service
|
||||
GRANT USAGE ON SCHEMA device_schema TO device_service_user;
|
||||
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA device_schema TO device_service_user;
|
||||
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA device_schema TO device_service_user;
|
||||
|
||||
-- Messaging service
|
||||
GRANT USAGE ON SCHEMA messaging_schema TO messaging_service_user;
|
||||
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA messaging_schema TO messaging_service_user;
|
||||
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA messaging_schema TO messaging_service_user;
|
||||
|
||||
-- Push service
|
||||
GRANT USAGE ON SCHEMA push_schema TO push_service_user;
|
||||
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA push_schema TO push_service_user;
|
||||
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA push_schema TO push_service_user;
|
||||
|
||||
-- WebRTC service
|
||||
GRANT USAGE ON SCHEMA webrtc_schema TO webrtc_service_user;
|
||||
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA webrtc_schema TO webrtc_service_user;
|
||||
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA webrtc_schema TO webrtc_service_user;
|
||||
|
||||
-- Moderation service
|
||||
GRANT USAGE ON SCHEMA moderation_schema TO moderation_service_user;
|
||||
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA moderation_schema TO moderation_service_user;
|
||||
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA moderation_schema TO moderation_service_user;
|
||||
|
||||
-- Set default privileges for future objects
|
||||
ALTER DEFAULT PRIVILEGES IN SCHEMA account_schema GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO account_service_user;
|
||||
ALTER DEFAULT PRIVILEGES IN SCHEMA profile_schema GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO profile_service_user;
|
||||
ALTER DEFAULT PRIVILEGES IN SCHEMA device_schema GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO device_service_user;
|
||||
ALTER DEFAULT PRIVILEGES IN SCHEMA messaging_schema GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO messaging_service_user;
|
||||
ALTER DEFAULT PRIVILEGES IN SCHEMA push_schema GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO push_service_user;
|
||||
ALTER DEFAULT PRIVILEGES IN SCHEMA webrtc_schema GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO webrtc_service_user;
|
||||
ALTER DEFAULT PRIVILEGES IN SCHEMA moderation_schema GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO moderation_service_user;
|
||||
@@ -0,0 +1,127 @@
|
||||
-- Create tables for FromChat microservices
|
||||
-- This script creates the necessary tables in their respective schemas
|
||||
|
||||
-- Note: In production, tables will be created by Alembic migrations
|
||||
-- This script provides a fallback or reference for manual setup
|
||||
|
||||
-- Account schema tables
|
||||
CREATE TABLE IF NOT EXISTS account_schema.users (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
username VARCHAR(50) UNIQUE NOT NULL,
|
||||
email VARCHAR(100) UNIQUE NOT NULL,
|
||||
hashed_password VARCHAR(255) NOT NULL,
|
||||
salt VARCHAR(64) NOT NULL,
|
||||
display_name VARCHAR(100),
|
||||
bio TEXT,
|
||||
avatar_url VARCHAR(255),
|
||||
is_online BOOLEAN DEFAULT FALSE,
|
||||
last_seen TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
verified BOOLEAN DEFAULT FALSE,
|
||||
verification_token VARCHAR(255),
|
||||
reset_token VARCHAR(255),
|
||||
reset_token_expires TIMESTAMP,
|
||||
two_factor_enabled BOOLEAN DEFAULT FALSE,
|
||||
two_factor_secret VARCHAR(255),
|
||||
login_attempts INTEGER DEFAULT 0,
|
||||
locked_until TIMESTAMP,
|
||||
public_key TEXT,
|
||||
private_key TEXT,
|
||||
encryption_enabled BOOLEAN DEFAULT FALSE
|
||||
);
|
||||
|
||||
-- Profile schema tables (references account_schema.users)
|
||||
CREATE TABLE IF NOT EXISTS profile_schema.user_profiles (
|
||||
user_id BIGINT PRIMARY KEY REFERENCES account_schema.users(id) ON DELETE CASCADE,
|
||||
display_name VARCHAR(100),
|
||||
bio TEXT,
|
||||
avatar_url VARCHAR(255),
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- Device schema tables
|
||||
CREATE TABLE IF NOT EXISTS device_schema.devices (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
user_id BIGINT REFERENCES account_schema.users(id) ON DELETE CASCADE,
|
||||
device_id VARCHAR(255) UNIQUE NOT NULL,
|
||||
device_name VARCHAR(255),
|
||||
device_type VARCHAR(50),
|
||||
public_key TEXT,
|
||||
signed_prekey TEXT,
|
||||
one_time_prekeys JSONB,
|
||||
last_active TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- Messaging schema tables
|
||||
CREATE TABLE IF NOT EXISTS messaging_schema.messages (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
sender_id BIGINT REFERENCES account_schema.users(id) ON DELETE CASCADE,
|
||||
content TEXT NOT NULL,
|
||||
content_type VARCHAR(50) DEFAULT 'text',
|
||||
encrypted_content TEXT,
|
||||
signature TEXT,
|
||||
timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
edited_at TIMESTAMP,
|
||||
edited BOOLEAN DEFAULT FALSE,
|
||||
deleted BOOLEAN DEFAULT FALSE,
|
||||
reply_to_id BIGINT REFERENCES messaging_schema.messages(id),
|
||||
thread_id BIGINT REFERENCES messaging_schema.messages(id),
|
||||
is_public BOOLEAN DEFAULT FALSE
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS messaging_schema.message_recipients (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
message_id BIGINT REFERENCES messaging_schema.messages(id) ON DELETE CASCADE,
|
||||
recipient_id BIGINT REFERENCES account_schema.users(id) ON DELETE CASCADE,
|
||||
read_at TIMESTAMP,
|
||||
delivered_at TIMESTAMP,
|
||||
encrypted_key TEXT
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS messaging_schema.message_reactions (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
message_id BIGINT REFERENCES messaging_schema.messages(id) ON DELETE CASCADE,
|
||||
user_id BIGINT REFERENCES account_schema.users(id) ON DELETE CASCADE,
|
||||
reaction VARCHAR(50) NOT NULL,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- Push schema tables
|
||||
CREATE TABLE IF NOT EXISTS push_schema.push_subscriptions (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
user_id BIGINT REFERENCES account_schema.users(id) ON DELETE CASCADE,
|
||||
device_id BIGINT REFERENCES device_schema.devices(id),
|
||||
endpoint VARCHAR(500) NOT NULL,
|
||||
p256dh VARCHAR(255) NOT NULL,
|
||||
auth VARCHAR(255) NOT NULL,
|
||||
user_agent VARCHAR(500),
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- WebRTC schema tables
|
||||
CREATE TABLE IF NOT EXISTS webrtc_schema.webrtc_sessions (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
session_id VARCHAR(255) UNIQUE NOT NULL,
|
||||
initiator_id BIGINT REFERENCES account_schema.users(id),
|
||||
participant_ids JSONB NOT NULL,
|
||||
offer JSONB,
|
||||
answer JSONB,
|
||||
ice_candidates JSONB,
|
||||
status VARCHAR(50) DEFAULT 'pending',
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- Moderation schema tables
|
||||
CREATE TABLE IF NOT EXISTS moderation_schema.moderation_actions (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
moderator_id BIGINT REFERENCES account_schema.users(id),
|
||||
target_user_id BIGINT REFERENCES account_schema.users(id),
|
||||
target_message_id BIGINT REFERENCES messaging_schema.messages(id),
|
||||
action_type VARCHAR(50) NOT NULL,
|
||||
reason TEXT,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
expires_at TIMESTAMP
|
||||
);
|
||||
+312
-57
@@ -1,67 +1,322 @@
|
||||
services:
|
||||
backend:
|
||||
build:
|
||||
dockerfile: deployment/Dockerfile.backend
|
||||
context: ..
|
||||
# Database service
|
||||
db:
|
||||
image: postgres:15
|
||||
environment:
|
||||
PORT: 8300
|
||||
JWT_SECRET: ${JWT_SECRET}
|
||||
VAPID_PUBLIC_KEY: ${VAPID_PUBLIC_KEY}
|
||||
VAPID_PRIVATE_KEY: ${VAPID_PRIVATE_KEY}
|
||||
FIREBASE_CERT: ${FIREBASE_CERT}
|
||||
POSTGRES_DB: fromchat
|
||||
POSTGRES_USER: fromchat_admin
|
||||
POSTGRES_PASSWORD: ${DB_PASSWORD:-changeme}
|
||||
volumes:
|
||||
- data:/app/data
|
||||
- logs:/app/logs
|
||||
|
||||
develop:
|
||||
watch:
|
||||
- action: sync+restart
|
||||
path: ../backend
|
||||
target: /app
|
||||
- action: rebuild
|
||||
path: ../backend/requirements.txt
|
||||
|
||||
frontend:
|
||||
build:
|
||||
dockerfile: deployment/frontend/Dockerfile
|
||||
context: ..
|
||||
environment:
|
||||
PORT: 8301
|
||||
BACKEND_HOST: http://backend:8300
|
||||
ports:
|
||||
- "8301:8301"
|
||||
depends_on:
|
||||
- backend
|
||||
develop:
|
||||
watch:
|
||||
- action: rebuild
|
||||
path: ../frontend
|
||||
- action: sync+restart
|
||||
path: server.js
|
||||
target: /server/server.js
|
||||
- action: rebuild
|
||||
path: package.json
|
||||
|
||||
caddy:
|
||||
build:
|
||||
context: ./caddy
|
||||
dockerfile: Dockerfile
|
||||
- postgres_data:/var/lib/postgresql/data
|
||||
- ./db-init:/docker-entrypoint-initdb.d
|
||||
networks:
|
||||
- fromchat_internal
|
||||
restart: unless-stopped
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U fromchat_admin -d fromchat"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
# Migration runner - runs once before other services
|
||||
migration_runner:
|
||||
build:
|
||||
context: ..
|
||||
dockerfile: docker/Dockerfile.multi
|
||||
target: migration_runner
|
||||
environment:
|
||||
DATABASE_URL: postgresql://fromchat_admin:${DB_PASSWORD:-changeme}@db:5432/fromchat
|
||||
JWT_SECRET: ${JWT_SECRET:-changeme}
|
||||
depends_on:
|
||||
db:
|
||||
condition: service_healthy
|
||||
networks:
|
||||
- fromchat_internal
|
||||
develop:
|
||||
watch:
|
||||
- action: sync
|
||||
path: backend/alembic.ini
|
||||
target: /app/backend/alembic.ini
|
||||
- action: sync
|
||||
path: backend/alembic
|
||||
target: /app/backend/alembic
|
||||
- action: sync
|
||||
path: backend/migration.py
|
||||
target: /app/backend/migration.py
|
||||
- action: sync
|
||||
path: backend/services/migration_runner
|
||||
target: /app/backend/services/migration_runner
|
||||
- action: sync+restart
|
||||
path: backend/shared
|
||||
target: /app/backend/shared
|
||||
|
||||
# Gateway service - handles complex operations
|
||||
gateway:
|
||||
build:
|
||||
context: ..
|
||||
dockerfile: docker/Dockerfile.multi
|
||||
target: gateway
|
||||
environment:
|
||||
DATABASE_URL: postgresql://gateway_user:${DB_PASSWORD:-changeme}@db:5432/fromchat
|
||||
depends_on:
|
||||
migration_runner:
|
||||
condition: service_completed_successfully
|
||||
networks:
|
||||
- fromchat_internal
|
||||
- fromchat_external
|
||||
restart: unless-stopped
|
||||
develop:
|
||||
watch:
|
||||
- action: sync
|
||||
path: backend/app.py
|
||||
target: /app/backend/app.py
|
||||
- action: sync
|
||||
path: backend/main.py
|
||||
target: /app/backend/main.py
|
||||
- action: sync
|
||||
path: backend/dependencies.py
|
||||
target: /app/backend/dependencies.py
|
||||
- action: sync
|
||||
path: backend/security
|
||||
target: /app/backend/security
|
||||
- action: sync
|
||||
path: backend/services/gateway
|
||||
target: /app/backend/services/gateway
|
||||
- action: sync+restart
|
||||
path: backend/shared
|
||||
target: /app/backend/shared
|
||||
|
||||
# Account service
|
||||
account_service:
|
||||
build:
|
||||
context: ..
|
||||
dockerfile: docker/Dockerfile.multi
|
||||
target: account_service
|
||||
environment:
|
||||
DATABASE_URL: postgresql://account_service_user:${DB_PASSWORD:-changeme}@db:5432/fromchat
|
||||
JWT_SECRET: ${JWT_SECRET:-changeme}
|
||||
depends_on:
|
||||
migration_runner:
|
||||
condition: service_completed_successfully
|
||||
networks:
|
||||
- fromchat_internal
|
||||
restart: unless-stopped
|
||||
develop:
|
||||
watch:
|
||||
- action: sync
|
||||
path: backend/routes/account.py
|
||||
target: /app/backend/routes/account.py
|
||||
- action: sync
|
||||
path: backend/services/account
|
||||
target: /app/backend/services/account
|
||||
- action: sync+restart
|
||||
path: backend/shared
|
||||
target: /app/backend/shared
|
||||
|
||||
# Profile service
|
||||
profile_service:
|
||||
build:
|
||||
context: ..
|
||||
dockerfile: docker/Dockerfile.multi
|
||||
target: profile_service
|
||||
environment:
|
||||
DATABASE_URL: postgresql://profile_service_user:${DB_PASSWORD:-changeme}@db:5432/fromchat
|
||||
FIREBASE_CERT: ${FIREBASE_CERT:-}
|
||||
VAPID_PRIVATE_KEY: ${VAPID_PRIVATE_KEY:-}
|
||||
VAPID_PUBLIC_KEY: ${VAPID_PUBLIC_KEY:-}
|
||||
VAPID_SUBJECT: ${VAPID_SUBJECT:-mailto:admin@example.com}
|
||||
depends_on:
|
||||
migration_runner:
|
||||
condition: service_completed_successfully
|
||||
networks:
|
||||
- fromchat_internal
|
||||
restart: unless-stopped
|
||||
develop:
|
||||
watch:
|
||||
- action: sync
|
||||
path: backend/routes/profile.py
|
||||
target: /app/backend/routes/profile.py
|
||||
- action: sync
|
||||
path: backend/services/profile
|
||||
target: /app/backend/services/profile
|
||||
- action: sync+restart
|
||||
path: backend/shared
|
||||
target: /app/backend/shared
|
||||
|
||||
# Device service
|
||||
device_service:
|
||||
build:
|
||||
context: ..
|
||||
dockerfile: docker/Dockerfile.multi
|
||||
target: device_service
|
||||
environment:
|
||||
DATABASE_URL: postgresql://device_service_user:${DB_PASSWORD:-changeme}@db:5432/fromchat
|
||||
depends_on:
|
||||
migration_runner:
|
||||
condition: service_completed_successfully
|
||||
networks:
|
||||
- fromchat_internal
|
||||
restart: unless-stopped
|
||||
develop:
|
||||
watch:
|
||||
- action: sync
|
||||
path: backend/routes/devices.py
|
||||
target: /app/backend/routes/devices.py
|
||||
- action: sync
|
||||
path: backend/services/device
|
||||
target: /app/backend/services/device
|
||||
- action: sync+restart
|
||||
path: backend/shared
|
||||
target: /app/backend/shared
|
||||
|
||||
# Messaging service
|
||||
messaging_service:
|
||||
build:
|
||||
context: ..
|
||||
dockerfile: docker/Dockerfile.multi
|
||||
target: messaging_service
|
||||
environment:
|
||||
DATABASE_URL: postgresql://messaging_service_user:${DB_PASSWORD:-changeme}@db:5432/fromchat
|
||||
FIREBASE_CERT: ${FIREBASE_CERT:-}
|
||||
VAPID_PRIVATE_KEY: ${VAPID_PRIVATE_KEY:-}
|
||||
VAPID_PUBLIC_KEY: ${VAPID_PUBLIC_KEY:-}
|
||||
VAPID_SUBJECT: ${VAPID_SUBJECT:-mailto:admin@example.com}
|
||||
depends_on:
|
||||
migration_runner:
|
||||
condition: service_completed_successfully
|
||||
networks:
|
||||
- fromchat_internal
|
||||
restart: unless-stopped
|
||||
develop:
|
||||
watch:
|
||||
- action: sync
|
||||
path: backend/routes/messaging.py
|
||||
target: /app/backend/routes/messaging.py
|
||||
- action: sync
|
||||
path: backend/websocket
|
||||
target: /app/backend/websocket
|
||||
- action: sync
|
||||
path: backend/services/messaging
|
||||
target: /app/backend/services/messaging
|
||||
- action: sync+restart
|
||||
path: backend/shared
|
||||
target: /app/backend/shared
|
||||
|
||||
# Push service
|
||||
push_service:
|
||||
build:
|
||||
context: ..
|
||||
dockerfile: docker/Dockerfile.multi
|
||||
target: push_service
|
||||
environment:
|
||||
DATABASE_URL: postgresql://push_service_user:${DB_PASSWORD:-changeme}@db:5432/fromchat
|
||||
FIREBASE_CERT: ${FIREBASE_CERT:-}
|
||||
VAPID_PRIVATE_KEY: ${VAPID_PRIVATE_KEY:-}
|
||||
VAPID_PUBLIC_KEY: ${VAPID_PUBLIC_KEY:-}
|
||||
VAPID_SUBJECT: ${VAPID_SUBJECT:-mailto:admin@example.com}
|
||||
depends_on:
|
||||
migration_runner:
|
||||
condition: service_completed_successfully
|
||||
networks:
|
||||
- fromchat_internal
|
||||
restart: unless-stopped
|
||||
develop:
|
||||
watch:
|
||||
- action: sync
|
||||
path: backend/routes/push.py
|
||||
target: /app/backend/routes/push.py
|
||||
- action: sync
|
||||
path: backend/push_service.py
|
||||
target: /app/backend/push_service.py
|
||||
- action: sync
|
||||
path: backend/services/push
|
||||
target: /app/backend/services/push
|
||||
- action: sync+restart
|
||||
path: backend/shared
|
||||
target: /app/backend/shared
|
||||
|
||||
# WebRTC service
|
||||
webrtc_service:
|
||||
build:
|
||||
context: ..
|
||||
dockerfile: docker/Dockerfile.multi
|
||||
target: webrtc_service
|
||||
environment:
|
||||
DATABASE_URL: postgresql://webrtc_service_user:${DB_PASSWORD:-changeme}@db:5432/fromchat
|
||||
depends_on:
|
||||
migration_runner:
|
||||
condition: service_completed_successfully
|
||||
networks:
|
||||
- fromchat_internal
|
||||
restart: unless-stopped
|
||||
develop:
|
||||
watch:
|
||||
- action: sync
|
||||
path: backend/routes/webrtc.py
|
||||
target: /app/backend/routes/webrtc.py
|
||||
- action: sync
|
||||
path: backend/services/webrtc
|
||||
target: /app/backend/services/webrtc
|
||||
- action: sync+restart
|
||||
path: backend/shared
|
||||
target: /app/backend/shared
|
||||
|
||||
# Moderation service
|
||||
moderation_service:
|
||||
build:
|
||||
context: ..
|
||||
dockerfile: docker/Dockerfile.multi
|
||||
target: moderation_service
|
||||
environment:
|
||||
DATABASE_URL: postgresql://moderation_service_user:${DB_PASSWORD:-changeme}@db:5432/fromchat
|
||||
depends_on:
|
||||
migration_runner:
|
||||
condition: service_completed_successfully
|
||||
networks:
|
||||
- fromchat_internal
|
||||
restart: unless-stopped
|
||||
develop:
|
||||
watch:
|
||||
- action: sync
|
||||
path: backend/routes/moderation.py
|
||||
target: /app/backend/routes/moderation.py
|
||||
- action: sync
|
||||
path: backend/security
|
||||
target: /app/backend/security
|
||||
- action: sync
|
||||
path: backend/similarity.py
|
||||
target: /app/backend/similarity.py
|
||||
- action: sync
|
||||
path: backend/services/moderation
|
||||
target: /app/backend/services/moderation
|
||||
- action: sync+restart
|
||||
path: backend/shared
|
||||
target: /app/backend/shared
|
||||
|
||||
# Caddy reverse proxy
|
||||
caddy:
|
||||
image: caddy:2
|
||||
ports:
|
||||
- "80:80"
|
||||
- "443:443"
|
||||
extra_hosts:
|
||||
- "host.docker.internal:host-gateway"
|
||||
volumes:
|
||||
- certs:/root/site/certs
|
||||
environment:
|
||||
XDG_DATA_HOME: /root/site/certs
|
||||
XDG_CONFIG_HOME: /root/site/certs
|
||||
- ./caddy/Caddyfile:/etc/caddy/Caddyfile:ro
|
||||
- caddy_data:/data
|
||||
- caddy_config:/config
|
||||
networks:
|
||||
- fromchat_external
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
- gateway
|
||||
|
||||
volumes:
|
||||
data:
|
||||
name: fromchat-data
|
||||
logs:
|
||||
name: fromchat-logs
|
||||
certs:
|
||||
name: fromchat-certs
|
||||
postgres_data:
|
||||
caddy_data:
|
||||
caddy_config:
|
||||
|
||||
networks:
|
||||
fromchat_internal:
|
||||
driver: bridge
|
||||
internal: true
|
||||
fromchat_external:
|
||||
driver: bridge
|
||||
Reference in New Issue
Block a user