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