249 lines
7.5 KiB
Docker
249 lines
7.5 KiB
Docker
# Docker file builds an image with a tinode chat server.
|
|
#
|
|
# In order to run the image you have to link it to a running database container. For example, to
|
|
# to use RethinkDB (named 'rethinkdb') and map the port where the tinode server accepts connections:
|
|
#
|
|
# $ docker run -p 6060:6060 -d --link rethinkdb \
|
|
# --env UID_ENCRYPTION_KEY=base64+encoded+16+bytes= \
|
|
# --env API_KEY_SALT=base64+encoded+32+bytes \
|
|
# --env AUTH_TOKEN_KEY=base64+encoded+32+bytes \
|
|
# tinode-server
|
|
|
|
FROM alpine:3.22
|
|
|
|
ARG VERSION=0.25
|
|
ENV VERSION=$VERSION
|
|
ARG BINVERS=$VERSION
|
|
|
|
LABEL maintainer="Tinode Team <info@tinode.co>"
|
|
LABEL name="TinodeChatServer"
|
|
LABEL version=$VERSION
|
|
|
|
# Build-time options.
|
|
|
|
# Database selector. Builds for MySQL by default.
|
|
# Alternatively use one of: postgres mongodb rethinkdb for a corresponsing
|
|
# DB backend or alldbs to build a generic Tinode docker image, for example:
|
|
# `--build-arg TARGET_DB=postgres` to build for PostgreSQL.
|
|
ARG TARGET_DB=mysql
|
|
ENV TARGET_DB=$TARGET_DB
|
|
|
|
# Runtime options.
|
|
|
|
# Specifies the database host:port pair to wait for before running Tinode.
|
|
# Ignored if empty.
|
|
ENV WAIT_FOR=
|
|
|
|
# An option to reset database.
|
|
ENV RESET_DB=false
|
|
|
|
# An option to upgrade database.
|
|
ENV UPGRADE_DB=false
|
|
|
|
# Option to skip DB initialization when it's missing.
|
|
ENV NO_DB_INIT=true
|
|
|
|
# Load sample data to database from data.json.
|
|
ARG SAMPLE_DATA=data.json
|
|
ENV SAMPLE_DATA=$SAMPLE_DATA
|
|
|
|
# Default country code to use in communication.
|
|
ENV DEFAULT_COUNTRY_CODE=US
|
|
|
|
# The MySQL DSN connection.
|
|
ENV MYSQL_DSN='root@tcp(mysql)/meeting_im?parseTime=true&collation=utf8mb4_0900_ai_ci'
|
|
ENV REDIS_ADDR=
|
|
ENV REDIS_USERNAME=
|
|
ENV REDIS_PASSWORD=
|
|
ENV REDIS_DB=0
|
|
ENV REDIS_KEY_PREFIX=im
|
|
ENV REDIS_DIAL_TIMEOUT_MS=2000
|
|
ENV REDIS_READ_TIMEOUT_MS=2000
|
|
ENV REDIS_WRITE_TIMEOUT_MS=2000
|
|
ENV REDIS_PENDING_TTL_SECONDS=120
|
|
ENV REDIS_DONE_TTL_SECONDS=86400
|
|
ENV REDIS_FAILED_TTL_SECONDS=600
|
|
ENV REDIS_HOT_MESSAGE_TTL_SECONDS=86400
|
|
ENV REDIS_PRESENCE_TTL_SECONDS=120
|
|
ENV REDIS_CACHE_TTL_SECONDS=300
|
|
ENV REDIS_SHORT_STATE_TTL_SECONDS=600
|
|
ENV REDIS_GROUP_FANOUT_ENABLED=true
|
|
ENV KAFKA_ENABLED=false
|
|
ENV KAFKA_BROKERS_JSON='[]'
|
|
ENV KAFKA_CLIENT_ID=im-server
|
|
ENV KAFKA_CONSUMER_GROUP=im-server
|
|
ENV KAFKA_DIAL_TIMEOUT_MS=3000
|
|
ENV KAFKA_WRITE_TIMEOUT_MS=3000
|
|
ENV KAFKA_READ_TIMEOUT_MS=3000
|
|
ENV KAFKA_BATCH_TIMEOUT_MS=10
|
|
ENV KAFKA_REQUIRED_ACKS=1
|
|
ENV KAFKA_ALLOW_AUTO_TOPIC_CREATION=false
|
|
ENV KAFKA_TLS_ENABLED=false
|
|
ENV KAFKA_SASL_ENABLED=false
|
|
ENV KAFKA_SASL_MECHANISM=SCRAM-SHA-512
|
|
ENV KAFKA_SASL_USERNAME=
|
|
ENV KAFKA_SASL_PASSWORD=
|
|
ENV KAFKA_MAX_RETRY_COUNT=3
|
|
ENV KAFKA_RETRY_BACKOFF_MS='[10000,30000,60000,300000,900000]'
|
|
ENV KAFKA_DEAD_LETTER_RETENTION_SECONDS=7776000
|
|
ENV KAFKA_TOPIC_ADMIN_COMMAND=im.admin.command
|
|
ENV KAFKA_TOPIC_ADMIN_COMMAND_RESULT=im.admin.command.result
|
|
ENV KAFKA_TOPIC_CONFIG_EVENT=im.config.event
|
|
ENV KAFKA_TOPIC_BUSINESS_EVENT=im.business.event
|
|
ENV KAFKA_TOPIC_MESSAGE_PERSIST=im.message.persist
|
|
ENV KAFKA_TOPIC_GROUP_MESSAGE_PERSIST=im.group.message.persist
|
|
ENV KAFKA_TOPIC_MESSAGE_PUSH=im.message.push
|
|
ENV KAFKA_TOPIC_FILE_SECURITY=im.file.security
|
|
ENV KAFKA_TOPIC_CACHE_INVALIDATE=im.cache.invalidate
|
|
ENV KAFKA_TOPIC_AUDIT_EVENT=im.audit.event
|
|
ENV KAFKA_TOPIC_DEAD_LETTER=im.dead.letter
|
|
ENV INTERNAL_API_ENABLED=true
|
|
ENV INTERNAL_API_TIME_WINDOW_SECONDS=300
|
|
ENV INTERNAL_API_HOTGO_SERVICE_NAME=hotgo-admin
|
|
ENV INTERNAL_API_HOTGO_SECRET=
|
|
ENV INTERNAL_API_CULTIVATE_SERVICE_NAME=cultivate-server
|
|
ENV INTERNAL_API_CULTIVATE_SECRET=
|
|
ENV ADMIN_INTERNAL_API_ENABLED=false
|
|
ENV ADMIN_INTERNAL_API_BASE_URL=
|
|
ENV ADMIN_INTERNAL_API_SERVICE_NAME=im-server
|
|
ENV ADMIN_INTERNAL_API_SECRET=
|
|
ENV ADMIN_INTERNAL_API_TIMEOUT_MS=3000
|
|
|
|
# The PostgreSQL DSN connection.
|
|
ENV POSTGRES_DSN='postgresql://postgres:postgres@localhost:5432/tinode?sslmode=disable&connect_timeout=10'
|
|
|
|
# Disable chatbot plugin by default.
|
|
ENV PLUGIN_PYTHON_CHAT_BOT_ENABLED=false
|
|
|
|
# Default handler for large files
|
|
ENV MEDIA_HANDLER=sys_config
|
|
|
|
# Whitelisted domains for file and S3 large media handler.
|
|
ENV FS_CORS_ORIGINS='["*"]'
|
|
ENV AWS_CORS_ORIGINS='["*"]'
|
|
|
|
# AWS S3 parameters
|
|
ENV AWS_ACCESS_KEY_ID=
|
|
ENV AWS_SECRET_ACCESS_KEY=
|
|
ENV AWS_REGION=
|
|
ENV AWS_S3_BUCKET=
|
|
ENV AWS_S3_ENDPOINT=
|
|
|
|
# Default externally-visible hostname for email verification.
|
|
ENV SMTP_HOST_URL='http://localhost:6060'
|
|
# Email parameters decalarations.
|
|
ENV SMTP_SERVER=
|
|
ENV SMTP_PORT=
|
|
ENV SMTP_SENDER=
|
|
ENV SMTP_LOGIN=
|
|
ENV SMTP_PASSWORD=
|
|
ENV SMTP_AUTH_MECHANISM=
|
|
ENV SMTP_HELO_HOST=
|
|
ENV EMAIL_VERIFICATION_REQUIRED=
|
|
ENV DEBUG_EMAIL_VERIFICATION_CODE=
|
|
|
|
# Whitelist of permitted email domains for email verification (empty list means all domains are permitted)
|
|
ENV SMTP_DOMAINS=''
|
|
|
|
# Various encryption and salt keys. Replace with your own in production.
|
|
|
|
# Salt used to generate the API key. Don't change it unless you also change the
|
|
# API key in the webapp & Android.
|
|
ENV API_KEY_SALT=T713/rYYgW7g4m3vG6zGRh7+FM1t0T8j13koXScOAj4=
|
|
|
|
# Key used to sign authentication tokens.
|
|
ENV AUTH_TOKEN_KEY=wfaY2RgF2S1OQI/ZlK+LSrp1KB2jwAdGAIHQ7JZn+Kc=
|
|
|
|
# Key to initialize UID generator
|
|
ENV UID_ENCRYPTION_KEY=dkXxWLwqUNRfYmdXRzOkZw==
|
|
|
|
# Disable TLS by default.
|
|
ENV TLS_ENABLED=false
|
|
ENV TLS_DOMAIN_NAME=
|
|
ENV TLS_CONTACT_ADDRESS=
|
|
|
|
# Disable push notifications by default.
|
|
ENV FCM_PUSH_ENABLED=false
|
|
# Declare FCM-related vars
|
|
ENV FCM_API_KEY=
|
|
ENV FCM_APP_ID=
|
|
ENV FCM_SENDER_ID=
|
|
ENV FCM_PROJECT_ID=
|
|
ENV FCM_VAPID_KEY=
|
|
ENV FCM_MEASUREMENT_ID=
|
|
|
|
# Enable Android-specific notifications by default.
|
|
ENV FCM_INCLUDE_ANDROID_NOTIFICATION=true
|
|
|
|
# Disable push notifications via Tinode Push Gateway.
|
|
ENV TNPG_PUSH_ENABLED=false
|
|
|
|
# Tinode Push Gateway authentication token.
|
|
ENV TNPG_AUTH_TOKEN=
|
|
|
|
# Tinode Push Gateway organization name as registered at console.tinode.co
|
|
ENV TNPG_ORG=
|
|
|
|
# Disable JPush by default. The handler can be enabled from HotGo sys_config
|
|
# through the im_jpush dictionary group when the config stanza is present.
|
|
ENV JPUSH_PUSH_ENABLED=false
|
|
ENV JPUSH_API_DOMAIN=https://api.jpush.cn
|
|
ENV JPUSH_PUSH_PATH=/v3/push
|
|
ENV JPUSH_DEFAULT_TTL_SECONDS=86400
|
|
ENV JPUSH_CALL_TTL_SECONDS=60
|
|
ENV JPUSH_APNS_PRODUCTION=false
|
|
ENV JPUSH_USE_ALIAS=false
|
|
ENV JPUSH_CLASSIFICATION=1
|
|
ENV JPUSH_TITLE=MeetingIM
|
|
|
|
# Video calls configuration.
|
|
ENV WEBRTC_ENABLED=false
|
|
ENV ICE_SERVERS_FILE=/opt/tinode/ice-servers.json
|
|
|
|
# Use the target db by default.
|
|
# When TARGET_DB is "alldbs", it is the user's responsibility
|
|
# to set STORE_USE_ADAPTER to the desired db adapter correctly.
|
|
ENV STORE_USE_ADAPTER=$TARGET_DB
|
|
|
|
# Url path for exposing the server's internal status. E.g. '/status'
|
|
ENV SERVER_STATUS_PATH=''
|
|
|
|
# Garbage collection of unfinished account registrations.
|
|
ENV ACC_GC_ENABLED=false
|
|
|
|
# Install root certificates, they are needed for email validator to work
|
|
# with the TLS SMTP servers like Gmail or Mailjet. Also add bash and grep.
|
|
RUN apk update && \
|
|
apk add --no-cache ca-certificates bash grep
|
|
|
|
WORKDIR /opt/tinode
|
|
|
|
# Copy config template to the container.
|
|
COPY config.template .
|
|
COPY entrypoint.sh .
|
|
COPY ice-servers.json .
|
|
|
|
# Get the desired Tinode build.
|
|
ADD https://github.com/tinode/chat/releases/download/v$BINVERS/tinode-$TARGET_DB.linux-amd64.tar.gz .
|
|
|
|
# Unpack the Tinode archive.
|
|
RUN tar -xzf tinode-$TARGET_DB.linux-amd64.tar.gz \
|
|
&& rm tinode-$TARGET_DB.linux-amd64.tar.gz
|
|
|
|
# Create directory for chatbot data.
|
|
RUN mkdir /botdata
|
|
|
|
# Make scripts runnable
|
|
RUN chmod +x entrypoint.sh
|
|
RUN chmod +x credentials.sh
|
|
|
|
# Healthcheck: verify the process and database dependency are responsive.
|
|
HEALTHCHECK --interval=1m --timeout=3s --start-period=30s \
|
|
CMD wget -q -O /dev/null http://localhost:6060/healthz || exit 1
|
|
|
|
# Generate config from template and run the server.
|
|
ENTRYPOINT ["./entrypoint.sh"]
|
|
|
|
# HTTP, gRPC, cluster ports
|
|
EXPOSE 6060 16060 12000-12003
|