# 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 " 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)/tinode?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=false ENV INTERNAL_API_TIME_WINDOW_SECONDS=300 ENV INTERNAL_API_HOTGO_SERVICE_NAME=hotgo-admin ENV INTERNAL_API_HOTGO_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=la6YsO+bNX/+XIkOqc5Svw== # 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