Files
zavolo a6aceb1cb0 fix(compose): build messenger-query-server locally instead of pulling
Add pull_policy: build so docker compose does not try to pull
mytelegram-messenger-query-server-local from a registry (it does not exist
there). Fixes 'pull access denied' error.
2026-06-06 14:14:30 +03:00

656 lines
29 KiB
YAML

version: "3.9"
networks:
tg-net:
driver: bridge
services:
### Redis
redis:
image: redis:alpine
restart: always
networks:
- tg-net
#ports:
#- "6379:6379"
volumes:
- ./data/redis:/data
### RabbitMq
rabbitmq:
image: rabbitmq:3-management-alpine
restart: always
networks:
- tg-net
#ports:
# - "5672:5672"
# - "15672:15672"
volumes:
- ./data/rabbitmq:/var/lib/rabbitmq
environment:
# RABBITMQ_DEFAULT_USER: ${RabbitMQ__Connections__Default__UserName}
# RABBITMQ_DEFAULT_PASS: ${RabbitMQ__Connections__Default__Password}
RABBITMQ_DEFAULT_USER: test
RABBITMQ_DEFAULT_PASS: test
### MongoDb
mongodb:
image: mongo:latest
restart: always
networks:
- tg-net
ports:
- "27017:27017"
volumes:
- ./data/mongo/:/data
#- ./data/mongo/db:/data/db
#- ./data/mongo/configdb:/data/configdb
#environment:
# MONGO_INITDB_ROOT_USERNAME: admin
# MONGO_INITDB_ROOT_PASSWORD: admin
### Minio
minio:
image: minio/minio:latest
restart: always
networks:
- tg-net
ports:
- "9000:9000"
- "9001:9001"
environment:
MINIO_ROOT_USER: ${Minio__AccessKey}
MINIO_ROOT_PASSWORD: ${Minio__SecretKey}
volumes:
- ./data/minio:/data
#- /docker/minio/config:/root/./minio/
command: server /data --console-address ":9001"
#privileged: true
################### MyTelegram server
### Data seeder
data-seeder:
build:
context: ../../source
dockerfile: src/MyTelegram.DataSeeder/Dockerfile
restart: always
networks:
- tg-net
environment:
Serilog__MinimumLevel__Default: ${Serilog__MinimumLevel__Default}
ConnectionStrings__Default: ${ConnectionStrings__Default}
App__DatabaseName: tg
App__ReadModelDatabaseName: tg
App__CreateTestUsers: ${App__CreateTestUsers}
# App__LoadAllStickersIntoMemory: ${App__LoadAllStickersIntoMemory}
RabbitMQ__Connections__Default__HostName: ${RabbitMQ__Connections__Default__HostName}
RabbitMQ__Connections__Default__Port: ${RabbitMQ__Connections__Default__Port}
RabbitMQ__Connections__Default__UserName: ${RabbitMQ__Connections__Default__UserName}
RabbitMQ__Connections__Default__Password: ${RabbitMQ__Connections__Default__Password}
# RabbitMQ__EventBus__ClientName: ${RabbitMQ__EventBus__ClientName}
# RabbitMQ__EventBus__ExchangeName: ${RabbitMQ__EventBus__ExchangeName}
volumes:
- ./data/mytelegram/data-seeder/logs:/app/Logs
depends_on:
- mongodb
### Admin API
admin-api:
build:
context: ../../source
dockerfile: src/MyTelegram.Admin.Api/Dockerfile
restart: always
networks:
- tg-net
ports:
- "5555:5000"
environment:
ASPNETCORE_URLS: http://+:5000
Serilog__MinimumLevel__Default: ${Serilog__MinimumLevel__Default}
ConnectionStrings__Default: ${ConnectionStrings__Default}
App__DatabaseName: tg
App__ReadModelDatabaseName: tg
RabbitMQ__Connections__Default__HostName: ${RabbitMQ__Connections__Default__HostName}
RabbitMQ__Connections__Default__Port: ${RabbitMQ__Connections__Default__Port}
RabbitMQ__Connections__Default__UserName: ${RabbitMQ__Connections__Default__UserName}
RabbitMQ__Connections__Default__Password: ${RabbitMQ__Connections__Default__Password}
ADMIN_API_KEY: ${ADMIN_API_KEY}
volumes:
- ./data/mytelegram/admin-api/logs:/app/Logs
depends_on:
- mongodb
- rabbitmq
### 1.Gateway server
gateway-server:
build:
context: ../../source
dockerfile: src/MyTelegram.GatewayServer/Dockerfile
args:
BUILD_CONFIGURATION: ${BUILD_CONFIGURATION}
restart: always
networks:
- tg-net
ports:
- "${App__Servers__0__Port}:${App__Servers__0__Port}"
- "${App__Servers__1__Port}:${App__Servers__1__Port}"
- "${App__Servers__2__Port}:${App__Servers__2__Port}"
- "${App__Servers__3__Port}:${App__Servers__3__Port}"
- "${App__Servers__4__Port}:${App__Servers__4__Port}"
- "${App__Servers__5__Port}:${App__Servers__5__Port}"
volumes:
- ./data/mytelegram/gateway/logs:/app/Logs
- ./secrets/mtproto:/app/secrets/mtproto:ro
environment:
Serilog__MinimumLevel__Default: ${Serilog__MinimumLevel__Default}
App__ThisDcId: ${App__ThisDcId}
App__MediaDcId: ${App__MediaDcId}
# App__MediaOnly: ${App__MediaOnly}
# App__Servers__0__Enabled: ${App__Servers__0__Enabled}
# App__Servers__0__ServerType: ${App__Servers__0__ServerType}
# App__Servers__0__Ip: ${App__Servers__0__Ip}
# App__Servers__0__Ipv6: ${App__Servers__0__Ipv6}
App__Servers__0__Port: ${App__Servers__0__Port}
# App__Servers__0__Ssl: ${App__Servers__0__Ssl}
# App__Servers__0__CertPemFilePath: ${App__Servers__0__CertPemFilePath}
# App__Servers__0__KeyPemFilePath: ${App__Servers__0__KeyPemFilePath}
# App__Servers__0__EnableProxyProtocolV2: ${App__Servers__0__EnableProxyProtocolV2}
# App__Servers__0__MediaOnly: ${App__Servers__0__MediaOnly}
App__Servers__1__Enabled: ${App__Servers__1__Enabled}
# App__Servers__1__ServerType: ${App__Servers__1__ServerType}
# App__Servers__1__Ip: ${App__Servers__1__Ip}
# App__Servers__1__Ipv6: ${App__Servers__1__Ipv6}
App__Servers__1__Port: ${App__Servers__1__Port}
# App__Servers__1__Ssl: ${App__Servers__1__Ssl}
# App__Servers__1__CertPemFilePath: ${App__Servers__1__CertPemFilePath}
# App__Servers__1__KeyPemFilePath: ${App__Servers__1__KeyPemFilePath}
# App__Servers__1__EnableProxyProtocolV2: ${App__Servers__1__EnableProxyProtocolV2}
# App__Servers__1__MediaOnly: ${App__Servers__1__MediaOnly}
App__Servers__2__Enabled: ${App__Servers__2__Enabled}
# App__Servers__2__ServerType: ${App__Servers__2__ServerType}
# App__Servers__2__Ip: ${App__Servers__2__Ip}
# App__Servers__2__Ipv6: ${App__Servers__2__Ipv6}
App__Servers__2__Port: ${App__Servers__2__Port}
# App__Servers__2__Ssl: ${App__Servers__2__Ssl}
# App__Servers__2__CertPemFilePath: ${App__Servers__2__CertPemFilePath}
# App__Servers__2__KeyPemFilePath: ${App__Servers__2__KeyPemFilePath}
# App__Servers__2__EnableProxyProtocolV2: ${App__Servers__2__EnableProxyProtocolV2}
# App__Servers__2__MediaOnly: ${App__Servers__2__MediaOnly}
App__Servers__3__Enabled: ${App__Servers__3__Enabled}
# App__Servers__3__ServerType: ${App__Servers__3__ServerType}
# App__Servers__3__Ip: ${App__Servers__3__Ip}
# App__Servers__3__Ipv6: ${App__Servers__3__Ipv6}
App__Servers__3__Port: ${App__Servers__3__Port}
# App__Servers__3__Ssl: ${App__Servers__3__Ssl}
# App__Servers__3__CertPemFilePath: ${App__Servers__3__CertPemFilePath}
# App__Servers__3__KeyPemFilePath: ${App__Servers__3__KeyPemFilePath}
# App__Servers__3__EnableProxyProtocolV2: ${App__Servers__3__EnableProxyProtocolV2}
# App__Servers__3__MediaOnly: ${App__Servers__3__MediaOnly}
# App__Servers__4__Enabled: ${App__Servers__4__Enabled}
# App__Servers__4__ServerType: ${App__Servers__4__ServerType}
# App__Servers__4__Ip: ${App__Servers__4__Ip}
# App__Servers__4__Ipv6: ${App__Servers__4__Ipv6}
App__Servers__4__Port: ${App__Servers__4__Port}
# App__Servers__4__Ssl: ${App__Servers__4__Ssl}
# App__Servers__4__CertPemFilePath: ${App__Servers__4__CertPemFilePath}
# App__Servers__4__KeyPemFilePath: ${App__Servers__4__KeyPemFilePath}
# App__Servers__4__EnableProxyProtocolV2: ${App__Servers__4__EnableProxyProtocolV2}
# App__Servers__4__MediaOnly: ${App__Servers__4__MediaOnly}
# App__Servers__5__Enabled: ${App__Servers__5__Enabled}
# App__Servers__5__ServerType: ${App__Servers__5__ServerType}
# App__Servers__5__Ip: ${App__Servers__5__Ip}
# App__Servers__5__Ipv6: ${App__Servers__5__Ipv6}
App__Servers__5__Port: ${App__Servers__5__Port}
# App__Servers__5__Ssl: ${App__Servers__5__Ssl}
# App__Servers__5__CertPemFilePath: ${App__Servers__5__CertPemFilePath}
# App__Servers__5__KeyPemFilePath: ${App__Servers__5__KeyPemFilePath}
# App__Servers__5__EnableProxyProtocolV2: ${App__Servers__5__EnableProxyProtocolV2}
# App__Servers__5__MediaOnly: ${App__Servers__5__MediaOnly}
RabbitMQ__Connections__Default__HostName: ${RabbitMQ__Connections__Default__HostName}
RabbitMQ__Connections__Default__Port: ${RabbitMQ__Connections__Default__Port}
RabbitMQ__Connections__Default__UserName: ${RabbitMQ__Connections__Default__UserName}
RabbitMQ__Connections__Default__Password: ${RabbitMQ__Connections__Default__Password}
# RabbitMQ__EventBus__ClientName: ${RabbitMQ__EventBus__ClientName}
RabbitMQ__EventBus__ExchangeName: ${RabbitMQ__EventBus__ExchangeName}
depends_on:
- rabbitmq
- mongodb
- redis
# ### 2.Seq server
# seq-server:
# image: mytelegram/mytelegram-seq-server:${MyTelegramVersion}
# restart: always
# networks:
# - tg-net
# #ports:
# # - "10001:80"
# environment:
# ConnectionStrings__Default: ${DefaultConnectionStrings}
# Serilog__MinimumLevel__Default: ${DefaultLogLevel}
# volumes:
# - ./data/mytelegram/seq/logs:/data/Logs
# depends_on:
# - mongodb
### 2.Auth server
auth-server:
build:
context: ../../source
dockerfile: src/MyTelegram.AuthServer/Dockerfile
args:
BUILD_CONFIGURATION: ${BUILD_CONFIGURATION}
restart: always
networks:
- tg-net
environment:
Serilog__MinimumLevel__Default: ${Serilog__MinimumLevel__Default}
App__PrivateKeyFilePath: /app/secrets/mtproto/rsa_private.pem
RabbitMQ__Connections__Default__HostName: ${RabbitMQ__Connections__Default__HostName}
RabbitMQ__Connections__Default__Port: ${RabbitMQ__Connections__Default__Port}
RabbitMQ__Connections__Default__UserName: ${RabbitMQ__Connections__Default__UserName}
RabbitMQ__Connections__Default__Password: ${RabbitMQ__Connections__Default__Password}
# RabbitMQ__EventBus__ClientName: ${RabbitMQ__EventBus__ClientName}
RabbitMQ__EventBus__ExchangeName: ${RabbitMQ__EventBus__ExchangeName}
Redis__Configuration: ${Redis__Configuration}
volumes:
- ./data/mytelegram/auth/logs:/app/Logs
- ./secrets/mtproto:/app/secrets/mtproto:ro
depends_on:
- mongodb
- rabbitmq
- redis
### 3.Session server
session-server:
image: ${MyTelegramRegistry}/mytelegram-session-server:${MyTelegramVersion}
restart: always
networks:
- tg-net
environment:
Serilog__MinimumLevel__Default: ${Serilog__MinimumLevel__Default}
ConnectionStrings__Default: ${ConnectionStrings__Default}
# App__ThisDcId: ${App__ThisDcId}
# App__MediaOnly: ${App__MediaOnly}
App__DatabaseName: tg
App__ReadModelDatabaseName: tg
App__AccessHashSecretKey: ${App__AccessHashSecretKey}
# App__IdGeneratorGrpcServiceUrl: ${App__IdGeneratorGrpcServiceUrl}
App__MessengerServerGrpcServiceUrl: ${App__MessengerServerGrpcServiceUrl}
# App__DispatchUnknownObjectToMessengerServer: ${App__DispatchUnknownObjectToMessengerServer}
# App__TempAuthKeyExpirationMinutes: ${App__TempAuthKeyExpirationMinutes}
# App__CommandServerObjectIds: ${App__CommandServerObjectIds}
RabbitMQ__Connections__Default__HostName: ${RabbitMQ__Connections__Default__HostName}
RabbitMQ__Connections__Default__Port: ${RabbitMQ__Connections__Default__Port}
RabbitMQ__Connections__Default__UserName: ${RabbitMQ__Connections__Default__UserName}
RabbitMQ__Connections__Default__Password: ${RabbitMQ__Connections__Default__Password}
# RabbitMQ__EventBus__ClientName: ${RabbitMQ__EventBus__ClientName}
# RabbitMQ__EventBus__ExchangeName: ${RabbitMQ__EventBus__ExchangeName}
Redis__Configuration: ${Redis__Configuration}
volumes:
- ./data/mytelegram/session/logs:/app/Logs
depends_on:
- mongodb
- rabbitmq
- redis
# ### 5.Messenger grpc server
# messenger-grpc-service:
# image: mytelegram/mytelegram-messenger-grpc-service:${MyTelegramVersion}
# restart: always
# networks:
# - tg-net
# environment:
# Serilog__MinimumLevel__Default: ${Serilog__MinimumLevel__Default}
# ConnectionStrings__Default: ${ConnectionStrings__Default}
# App__DatabaseName: tg
# App__ReadModelDatabaseName: tg
# volumes:
# - ./data/mytelegram/messenger-grpc-service/logs:/app/Logs
# depends_on:
# - mongodb
### 4.File server (original - for Telegram)
file-server:
image: ${MyTelegramRegistry}/mytelegram-file-server:${MyTelegramVersion}
restart: always
user: "0:0" # Run as root to avoid permission issues
networks:
- tg-net
volumes:
- ./data/mytelegram/file/uploads:/app/uploads
- ./data/mytelegram/file:/app/Logs
environment:
Serilog__MinimumLevel__Default: ${Serilog__MinimumLevel__Default}
ConnectionStrings__Default: ${ConnectionStrings__Default}
App__DatabaseName: tg
App__ReadModelDatabaseName: tg
App__AccessHashSecretKey: ${App__AccessHashSecretKey}
Minio__Endpoint: ${Minio__Endpoint}
Minio__AccessKey: ${Minio__AccessKey}
Minio__SecretKey: ${Minio__SecretKey}
RabbitMQ__Connections__Default__HostName: ${RabbitMQ__Connections__Default__HostName}
RabbitMQ__Connections__Default__Port: ${RabbitMQ__Connections__Default__Port}
RabbitMQ__Connections__Default__UserName: ${RabbitMQ__Connections__Default__UserName}
RabbitMQ__Connections__Default__Password: ${RabbitMQ__Connections__Default__Password}
Redis__Configuration: ${Redis__Configuration}
depends_on:
- mongodb
- rabbitmq
### 4.5 File merge proxy (HTTP API for merging file parts from local filesystem)
file-merge-proxy:
build:
context: ../../file-merge-proxy
dockerfile: Dockerfile
restart: always
networks:
- tg-net
volumes:
- ./data/mytelegram/file/uploads:/app/uploads
environment:
PORT: 5000
UPLOAD_PATH: /app/uploads
ports:
- "5000:5000"
### 5.Messenger command server
messenger-command-server:
build:
context: ../../source
dockerfile: src/MyTelegram.Messenger.CommandServer/Dockerfile
restart: always
networks:
- tg-net
extra_hosts:
- "host.docker.internal:host-gateway"
environment:
Serilog__MinimumLevel__Default: ${Serilog__MinimumLevel__Default}
ConnectionStrings__Default: ${ConnectionStrings__Default}
App__DatabaseName: tg
App__ReadModelDatabaseName: tg
App__AccessHashSecretKey: ${App__AccessHashSecretKey}
App__FileServerGrpcServiceUrl: ${App__FileServerGrpcServiceUrl}
App__FixedVerifyCode: ${App__FixedVerifyCode}
App__VerificationCodeLength: ${App__VerificationCodeLength}
App__VerificationCodeExpirationSeconds: ${App__VerificationCodeExpirationSeconds}
App__CheckPhoneNumberFormat: ${App__CheckPhoneNumberFormat}
App__EnableSearchNonContacts: ${App__EnableSearchNonContacts}
# App__JoinChatDomain: ${App__JoinChatDomain}
# App__ChannelGetDifferenceIntervalSeconds: ${App__ChannelGetDifferenceIntervalSeconds}
# App__UseInMemoryFilters: ${App__UseInMemoryFilters}
# App__IsMediaDc: ${App__IsMediaDc}
# App__AutoCreateSuperGroup: ${App__AutoCreateSuperGroup}
# App__EnableFutureAuthToken: ${App__EnableFutureAuthToken}
# App__SetPremiumToTrueAfterUserCreated: ${App__SetPremiumToTrueAfterUserCreated}
# App__SendWelcomeMessageAfterUserSignIn: ${App__SendWelcomeMessageAfterUserSignIn}
App__WebRtcConnections__0__Ip: ${App__WebRtcConnections__0__Ip}
App__WebRtcConnections__0__Ipv6: ${App__WebRtcConnections__0__Ipv6}
App__WebRtcConnections__0__Port: ${App__WebRtcConnections__0__Port}
App__WebRtcConnections__0__Turn: ${App__WebRtcConnections__0__Turn}
App__WebRtcConnections__0__Stun: ${App__WebRtcConnections__0__Stun}
App__WebRtcConnections__0__UserName: ${App__WebRtcConnections__0__UserName}
App__WebRtcConnections__0__Password: ${App__WebRtcConnections__0__Password}
# App__ThisDcId: ${App__ThisDcId}
# App__DcOptions__0__Enabled: ${App__DcOptions__0__Enabled}
# App__DcOptions__0__Id: ${App__DcOptions__0__Id}
App__DcOptions__0__IpAddress: ${App__DcOptions__0__IpAddress}
# App__DcOptions__0__Port: ${App__DcOptions__0__Port}
# App__DcOptions__0__TcpoOnly: ${App__DcOptions__0__TcpoOnly}
# App__DcOptions__0__ThisPortOnly: ${App__DcOptions__0__ThisPortOnly}
# App__DcOptions__0__Ipv6: ${App__DcOptions__0__Ipv6}
# App__DcOptions__0__Cdn: ${App__DcOptions__0__Cdn}
# App__DcOptions__0__MediaOnly: ${App__DcOptions__0__MediaOnly}
# App__DcOptions__0__Static: ${App__DcOptions__0__Static}
App__DcOptions__1__Enabled: ${App__DcOptions__1__Enabled}
# App__DcOptions__1__Id: ${App__DcOptions__1__Id}
App__DcOptions__1__IpAddress: ${App__DcOptions__1__IpAddress}
App__DcOptions__1__Port: ${App__DcOptions__1__Port}
# App__DcOptions__1__TcpoOnly: ${App__DcOptions__1__TcpoOnly}
# App__DcOptions__1__ThisPortOnly: ${App__DcOptions__1__ThisPortOnly}
# App__DcOptions__1__Ipv6: ${App__DcOptions__1__Ipv6}
# App__DcOptions__1__Cdn: ${App__DcOptions__1__Cdn}
# App__DcOptions__1__MediaOnly: ${App__DcOptions__1__MediaOnly}
# App__DcOptions__1__Static: ${App__DcOptions__1__Static}
App__DcOptions__2__Enabled: ${App__DcOptions__2__Enabled}
# App__DcOptions__2__Id: ${App__DcOptions__2__Id}
App__DcOptions__2__IpAddress: ${App__DcOptions__2__IpAddress}
# App__DcOptions__2__Port: ${App__DcOptions__2__Port}
# App__DcOptions__2__TcpoOnly: ${App__DcOptions__2__TcpoOnly}
# App__DcOptions__2__ThisPortOnly: ${App__DcOptions__2__ThisPortOnly}
# App__DcOptions__2__Ipv6: ${App__DcOptions__2__Ipv6}
# App__DcOptions__2__Cdn: ${App__DcOptions__2__Cdn}
# App__DcOptions__2__MediaOnly: ${App__DcOptions__2__MediaOnly}
# App__DcOptions__2__Static: ${App__DcOptions__2__Static}
App__DcOptions__3__Enabled: ${App__DcOptions__3__Enabled}
# App__DcOptions__3__Id: ${App__DcOptions__3__Id}
App__DcOptions__3__IpAddress: ${App__DcOptions__3__IpAddress}
# App__DcOptions__3__Port: ${App__DcOptions__3__Port}
# App__DcOptions__3__TcpoOnly: ${App__DcOptions__3__TcpoOnly}
# App__DcOptions__3__ThisPortOnly: ${App__DcOptions__3__ThisPortOnly}
# App__DcOptions__3__Ipv6: ${App__DcOptions__3__Ipv6}
# App__DcOptions__3__Cdn: ${App__DcOptions__3__Cdn}
# App__DcOptions__3__MediaOnly: ${App__DcOptions__3__MediaOnly}
# App__DcOptions__3__Static: ${App__DcOptions__3__Static}
RabbitMQ__Connections__Default__HostName: ${RabbitMQ__Connections__Default__HostName}
RabbitMQ__Connections__Default__Port: ${RabbitMQ__Connections__Default__Port}
RabbitMQ__Connections__Default__UserName: ${RabbitMQ__Connections__Default__UserName}
RabbitMQ__Connections__Default__Password: ${RabbitMQ__Connections__Default__Password}
# RabbitMQ__EventBus__ClientName: ${RabbitMQ__EventBus__ClientName}
# RabbitMQ__EventBus__ExchangeName: ${RabbitMQ__EventBus__ExchangeName}
Redis__Configuration: ${Redis__Configuration}
volumes:
- ./data/mytelegram/file/uploads:/app/uploads
- ./data/mytelegram/command-server/logs:/app/Logs
depends_on:
- mongodb
- rabbitmq
- redis
### 6.Messenger query server
messenger-query-server:
# CHANGED: Build locally from source instead of using remote image
build:
context: ../../source
dockerfile: src/MyTelegram.Messenger.QueryServer/Dockerfile
image: mytelegram-messenger-query-server-local:latest
# Always build locally — this image is not in any registry, so never try to pull it
pull_policy: build
restart: always
networks:
- tg-net
environment:
Serilog__MinimumLevel__Default: ${Serilog__MinimumLevel__Default}
ConnectionStrings__Default: ${ConnectionStrings__Default}
App__DatabaseName: tg
App__ReadModelDatabaseName: tg
App__AccessHashSecretKey: ${App__AccessHashSecretKey}
App__FileServerGrpcServiceUrl: ${App__FileServerGrpcServiceUrl}
App__FixedVerifyCode: ${App__FixedVerifyCode}
App__VerificationCodeLength: ${App__VerificationCodeLength}
App__VerificationCodeExpirationSeconds: ${App__VerificationCodeExpirationSeconds}
App__EnableSearchNonContacts: ${App__EnableSearchNonContacts}
# App__JoinChatDomain: ${App__JoinChatDomain}
# App__ChannelGetDifferenceIntervalSeconds: ${App__ChannelGetDifferenceIntervalSeconds}
# App__UseInMemoryFilters: ${App__UseInMemoryFilters}
# App__IsMediaDc: ${App__IsMediaDc}
# App__AutoCreateSuperGroup: ${App__AutoCreateSuperGroup}
# App__EnableFutureAuthToken: ${App__EnableFutureAuthToken}
# App__SetPremiumToTrueAfterUserCreated: ${App__SetPremiumToTrueAfterUserCreated}
# App__SendWelcomeMessageAfterUserSignIn: ${App__SendWelcomeMessageAfterUserSignIn}
App__WebRtcConnections__0__Ip: ${App__WebRtcConnections__0__Ip}
App__WebRtcConnections__0__Ipv6: ${App__WebRtcConnections__0__Ipv6}
App__WebRtcConnections__0__Port: ${App__WebRtcConnections__0__Port}
App__WebRtcConnections__0__Turn: ${App__WebRtcConnections__0__Turn}
App__WebRtcConnections__0__Stun: ${App__WebRtcConnections__0__Stun}
App__WebRtcConnections__0__UserName: ${App__WebRtcConnections__0__UserName}
App__WebRtcConnections__0__Password: ${App__WebRtcConnections__0__Password}
# App__ThisDcId: ${App__ThisDcId}
# App__DcOptions__0__Enabled: ${App__DcOptions__0__Enabled}
# App__DcOptions__0__Id: ${App__DcOptions__0__Id}
App__DcOptions__0__IpAddress: ${App__DcOptions__0__IpAddress}
App__DcOptions__0__Port: ${App__DcOptions__0__Port}
# App__DcOptions__0__TcpoOnly: ${App__DcOptions__0__TcpoOnly}
# App__DcOptions__0__ThisPortOnly: ${App__DcOptions__0__ThisPortOnly}
# App__DcOptions__0__Ipv6: ${App__DcOptions__0__Ipv6}
# App__DcOptions__0__Cdn: ${App__DcOptions__0__Cdn}
# App__DcOptions__0__MediaOnly: ${App__DcOptions__0__MediaOnly}
# App__DcOptions__0__Static: ${App__DcOptions__0__Static}
App__DcOptions__1__Enabled: ${App__DcOptions__1__Enabled}
# App__DcOptions__1__Id: ${App__DcOptions__1__Id}
App__DcOptions__1__IpAddress: ${App__DcOptions__1__IpAddress}
App__DcOptions__1__Port: ${App__DcOptions__1__Port}
# App__DcOptions__1__TcpoOnly: ${App__DcOptions__1__TcpoOnly}
# App__DcOptions__1__ThisPortOnly: ${App__DcOptions__1__ThisPortOnly}
# App__DcOptions__1__Ipv6: ${App__DcOptions__1__Ipv6}
# App__DcOptions__1__Cdn: ${App__DcOptions__1__Cdn}
# App__DcOptions__1__MediaOnly: ${App__DcOptions__1__MediaOnly}
# App__DcOptions__1__Static: ${App__DcOptions__1__Static}
App__DcOptions__2__Enabled: ${App__DcOptions__2__Enabled}
# App__DcOptions__2__Id: ${App__DcOptions__2__Id}
App__DcOptions__2__IpAddress: ${App__DcOptions__2__IpAddress}
App__DcOptions__2__Port: ${App__DcOptions__2__Port}
# App__DcOptions__2__TcpoOnly: ${App__DcOptions__2__TcpoOnly}
# App__DcOptions__2__ThisPortOnly: ${App__DcOptions__2__ThisPortOnly}
# App__DcOptions__2__Ipv6: ${App__DcOptions__2__Ipv6}
# App__DcOptions__2__Cdn: ${App__DcOptions__2__Cdn}
# App__DcOptions__2__MediaOnly: ${App__DcOptions__2__MediaOnly}
# App__DcOptions__2__Static: ${App__DcOptions__2__Static}
App__DcOptions__3__Enabled: ${App__DcOptions__3__Enabled}
# App__DcOptions__3__Id: ${App__DcOptions__3__Id}
App__DcOptions__3__IpAddress: ${App__DcOptions__3__IpAddress}
# App__DcOptions__3__Port: ${App__DcOptions__3__Port}
# App__DcOptions__3__TcpoOnly: ${App__DcOptions__3__TcpoOnly}
# App__DcOptions__3__ThisPortOnly: ${App__DcOptions__3__ThisPortOnly}
# App__DcOptions__3__Ipv6: ${App__DcOptions__3__Ipv6}
# App__DcOptions__3__Cdn: ${App__DcOptions__3__Cdn}
# App__DcOptions__3__MediaOnly: ${App__DcOptions__3__MediaOnly}
# App__DcOptions__3__Static: ${App__DcOptions__3__Static}
Minio__Endpoint: ${Minio__Endpoint}
Minio__AccessKey: ${Minio__AccessKey}
Minio__SecretKey: ${Minio__SecretKey}
Minio__BucketName: ${Minio__BucketName}
RabbitMQ__Connections__Default__HostName: ${RabbitMQ__Connections__Default__HostName}
RabbitMQ__Connections__Default__Port: ${RabbitMQ__Connections__Default__Port}
RabbitMQ__Connections__Default__UserName: ${RabbitMQ__Connections__Default__UserName}
RabbitMQ__Connections__Default__Password: ${RabbitMQ__Connections__Default__Password}
# RabbitMQ__EventBus__ClientName: ${RabbitMQ__EventBus__ClientName}
# RabbitMQ__EventBus__ExchangeName: ${RabbitMQ__EventBus__ExchangeName}
Redis__Configuration: ${Redis__Configuration}
volumes:
- ./data/mytelegram/query-server/logs:/app/Logs
depends_on:
- mongodb
- rabbitmq
- redis
### 7.Bot API Server
bot-api-server:
build:
context: ../../source
dockerfile: src/MyTelegram.BotApi/Dockerfile
restart: always
networks:
- tg-net
ports:
- "8081:8081"
environment:
ASPNETCORE_URLS: http://+:8081
Serilog__MinimumLevel__Default: ${Serilog__MinimumLevel__Default}
ConnectionStrings__Default: ${ConnectionStrings__Default}
App__DatabaseName: tg
App__ReadModelDatabaseName: tg
RabbitMQ__Connections__Default__HostName: ${RabbitMQ__Connections__Default__HostName}
RabbitMQ__Connections__Default__Port: ${RabbitMQ__Connections__Default__Port}
RabbitMQ__Connections__Default__UserName: ${RabbitMQ__Connections__Default__UserName}
RabbitMQ__Connections__Default__Password: ${RabbitMQ__Connections__Default__Password}
RabbitMQ__EventBus__ClientProvidedName: MyTelegram.BotApi
RabbitMQ__EventBus__ExchangeName: ${RabbitMQ__EventBus__ExchangeName}
MongoDB__ConnectionString: ${ConnectionStrings__Default}
MongoDB__DatabaseName: tg
BotApi__Port: 8081
BotApi__LocalMode: true
BotApi__MaxFileSize: 2147483648
volumes:
- ./data/mytelegram/bot-api/logs:/app/Logs
depends_on:
- mongodb
- rabbitmq
- redis
### 8.TURN/STUN server for VoIP
turn-server:
image: coturn/coturn:latest
restart: always
network_mode: host
# networks:
# - tg-net
# ports:
# - "3478:3478/udp"
# - "3478:3478/tcp"
# - "5349:5349/tcp"
# Note: network_mode: host exposes all ports directly, including relay ports 49152-65535
volumes:
- ./turnserver.conf:/etc/coturn/turnserver.conf:ro
- ./data/coturn/logs:/var/log/coturn
environment:
TURN_EXTERNAL_IP: "${TURN_EXTERNAL_IP:-auto-detect}"
command: ["-c", "/etc/coturn/turnserver.conf"]
### 9.Sms sender
sms-sender:
image: ${MyTelegramRegistry}/mytelegram-sms-sender:${MyTelegramVersion}
restart: always
networks:
- tg-net
environment:
Serilog__MinimumLevel__Default: ${Serilog__MinimumLevel__Default}
# TwilioSms__Enabled: ${TwilioSms__Enabled}
# TwilioSms__AccountSId: ${TwilioSms__AccountSId}
# TwilioSms__AuthToken: ${TwilioSms__AuthToken}
# TwilioSms__FromNumber: ${TwilioSms__FromNumber}
# TwilioSms__MessagingServiceSId: ${TwilioSms__MessagingServiceSId}
# VonageSms__Enabled: ${VonageSms__Enabled}
# VonageSms__BrandName: ${VonageSms__BrandName}
# VonageSms__ApiKey: ${VonageSms__ApiKey}
# VonageSms__ApiSecret: ${VonageSms__ApiSecret}
RabbitMQ__Connections__Default__HostName: ${RabbitMQ__Connections__Default__HostName}
RabbitMQ__Connections__Default__Port: ${RabbitMQ__Connections__Default__Port}
RabbitMQ__Connections__Default__UserName: ${RabbitMQ__Connections__Default__UserName}
RabbitMQ__Connections__Default__Password: ${RabbitMQ__Connections__Default__Password}
# RabbitMQ__EventBus__ClientName: ${RabbitMQ__EventBus__ClientName}
# RabbitMQ__EventBus__ExchangeName: ${RabbitMQ__EventBus__ExchangeName}
volumes:
- ./data/mytelegram/sms-sender/logs:/app/Logs
depends_on:
- rabbitmq
### 10.Fragment Backend API (Run locally with npm run dev)
# fragment-backend:
# build:
# context: ../../fragment/fragment-backend
# dockerfile: Dockerfile
# restart: always
# networks:
# - tg-net
# ports:
# - "3001:3001"
# environment:
# PORT: 3001
# MONGODB_URI: mongodb://mongodb:27017/tg
# JWT_SECRET: fragment_secret_key_change_in_production
# BOT_API_URL: http://bot-api-server:8081
# FRAGMENT_BOT_TOKEN: ${FRAGMENT_BOT_TOKEN}
# volumes:
# - ./data/fragment/backend/logs:/app/logs
# depends_on:
# - mongodb
# - bot-api-server