Coder Social home page Coder Social logo

docker's Introduction

docker's People

Contributors

azigler avatar benlloydpearson avatar cobenash avatar coltoneshaw avatar craph avatar cwarnermm avatar erfantkerfan avatar jthebab avatar metanerd avatar mrckndt avatar mvitale1989 avatar robinmetral avatar streamer45 avatar svelle avatar topelrapha avatar ucyang avatar va2xjm avatar wietsewind avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

docker's Issues

Upgrade Old mattermost-docker

Hi everyone,

Thanks for an absolutely awesome platform.

I have a question about the upgrade scripts. is it possible to simply restore an old database dump to a new instance as opposed to upgrading an existing instance?

nginx: [emerg] cannot load certificate "/cert.pem"

Hi,

I have the following errors running sudo docker-compose -f docker-compose.yml -f docker-compose.nginx.yml up -d:

/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: can not modify /etc/nginx/conf.d/default.conf (read-only file system?)
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
nginx: [emerg] cannot load certificate "/cert.pem": PEM_read_bio_X509_AUX() failed (SSL: error:0909006C:PEM routines:get_name:no start line:Expecting: TRUSTED CERTIFICATE)

It appears that the ngnix docker is looking for /cert.pem, which I cannot provide, as in my network, the SSL is terminated at the gateway level by a reverse proxy (pfsense ACME with Let's Encrypt + HAProxy).

However, that pfsense HAProxy is only a reverse proxy, I still need a ngnix server for serving mattermost in http mode, right?

If so, how to run the ngnix docker in http mode only, without it looking for cert.pem or key-no-password.pem (or ignoring the errors if these .pem files don't exist)?

.env:

# Domain of service
DOMAIN=[redacted]

# Container settings
## Timezone inside the containers. The value needs to be in the form 'Europe/Berlin'.
## A list of these tz database names can be looked up at Wikipedia
## https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
TZ=[redacted]
RESTART_POLICY=unless-stopped

# Postgres settings
## Documentation for this image and available settings can be found on hub.docker.com
## https://hub.docker.com/_/postgres
## Please keep in mind this will create a superuser and it's recommended to use a less privileged
## user to connect to the database.
## A guide on how to change the database user to a nonsuperuser can be found in docs/creation-of-nonsuperuser.md
POSTGRES_IMAGE_TAG=13-alpine
POSTGRES_DATA_PATH=./volumes/db/var/lib/postgresql/data

POSTGRES_USER=mmuser
POSTGRES_PASSWORD=[redacted]
POSTGRES_DB=mattermost

# Nginx
## The nginx container will use a configuration found at the NGINX_MATTERMOST_CONFIG. The config aims
## to be secure and uses a catch-all server vhost which will work out-of-the-box. For additional settings
## or changes ones can edit it or provide another config. Important note: inside the container, nginx sources
## every config file inside */etc/nginx/conf.d* ending with a *.conf* file extension.

## Inside the container the uid and gid is 101. The folder owner can be set with
## `sudo chown -R 101:101 ./nginx` if needed.
NGINX_IMAGE_TAG=alpine

## The folder containing server blocks and any additional config to nginx.conf
NGINX_CONFIG_PATH=./nginx/conf.d
NGINX_DHPARAMS_FILE=./nginx/dhparams4096.pem

CERT_PATH=./volumes/web/cert/cert.pem
KEY_PATH=./volumes/web/cert/key-no-password.pem
#GITLAB_PKI_CHAIN_PATH=<path_to_your_gitlab_pki>/pki_chain.pem
#CERT_PATH=./certs/etc/letsencrypt/live/${DOMAIN}/fullchain.pem
#KEY_PATH=./certs/etc/letsencrypt/live/${DOMAIN}/privkey.pem

## Exposed ports to the host. Inside the container 80 and 443 will be used
HTTPS_PORT=4431
HTTP_PORT=8001

# Mattermost settings
## Inside the container the uid and gid is 2000. The folder owner can be set with
## `sudo chown -R 2000:2000 ./volumes/app/mattermost`.
MATTERMOST_CONFIG_PATH=./volumes/app/mattermost/config
MATTERMOST_DATA_PATH=./volumes/app/mattermost/data
MATTERMOST_LOGS_PATH=./volumes/app/mattermost/logs
MATTERMOST_PLUGINS_PATH=./volumes/app/mattermost/plugins
MATTERMOST_CLIENT_PLUGINS_PATH=./volumes/app/mattermost/client/plugins

## This will be 'mattermost-enterprise-edition' or 'mattermost-team-edition' based on the version of Mattermost you're installing.
MATTERMOST_IMAGE=mattermost-team-edition
MATTERMOST_IMAGE_TAG=5.37

## Make Mattermost container readonly. This interferes with the regeneration of root.html inside the container. Only use
## it if you know what you're doing.
## See https://github.com/mattermost/docker/issues/18
MATTERMOST_CONTAINER_READONLY=false

## The app port is only relevant for using Mattermost without the nginx container as reverse proxy. This is not meant
## to be used with the internal HTTP server exposed but rather in case one wants to host several services on one host
## or for using it behind another existing reverse proxy.
#APP_PORT=8001

## Configuration settings for Mattermost. Documentation on the variables and the settings itself can be found at
## https://docs.mattermost.com/administration/config-settings.html
## Keep in mind that variables set here will take precedence over the same setting in config.json. This includes
## the system console as well and settings set with env variables will be greyed out.

## Below one can find necessary settings to spin up the Mattermost container
MM_SQLSETTINGS_DRIVERNAME=postgres
MM_SQLSETTINGS_DATASOURCE=postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}?sslmode=disable&connect_timeout=10

## Example settings (any additional setting added here also needs to be introduced in the docker-compose.yml)
MM_SERVICESETTINGS_SITEURL=https://${DOMAIN}

docker-compose.nginx.yml:

version: "2.4"

services:
  nginx:
    depends_on:
      - mattermost
    container_name: nginx_mattermost
    image: nginx:${NGINX_IMAGE_TAG}
    restart: ${RESTART_POLICY}
    security_opt:
      - no-new-privileges:true
    pids_limit: 100
    read_only: true
    tmpfs:
      - /var/run
      - /var/cache
      - /var/log/nginx
    volumes:
      - ${NGINX_CONFIG_PATH}:/etc/nginx/conf.d:ro
      - ${NGINX_DHPARAMS_FILE}:/dhparams4096.pem
      - ${CERT_PATH}:/cert.pem:ro
      - ${KEY_PATH}:/key.pem:ro
      - shared-webroot:/usr/share/nginx/html
      # When you want to use SSO with GitLab, you have to add the cert pki chain of GitLab inside Alpine
      # to avoid Token request failed: certificate signed by unknown authority 
      # (link: https://github.com/mattermost/mattermost-server/issues/13059 and https://github.com/mattermost/docker/issues/34)
      # - ${GITLAB_PKI_CHAIN_PATH}:/etc/ssl/certs/pki_chain.pem:ro
    environment:
      # timezone inside container
      - TZ
    ports:
      #- ${HTTPS_PORT}:443
      - ${HTTP_PORT}:80

# Shared volume for Let's Encrypt certificate renewal with a webroot
volumes:
  shared-webroot:
    name: shared-webroot

# This network name is being used for Let's Encrypt certificate renewal
networks:
  default:
    name: mattermost

config.json

{
    "ServiceSettings": {
        "SiteURL": [redacted],
        "WebsocketURL": "",
        "LicenseFileLocation": "",
        "ListenAddress": ":8001",
        "ConnectionSecurity": "",
        "TLSCertFile": "",
        "TLSKeyFile": "",
        "TLSMinVer": "1.2",
        "TLSStrictTransport": false,
        "TLSStrictTransportMaxAge": 63072000,
        "TLSOverwriteCiphers": [],
        "UseLetsEncrypt": false,
        "LetsEncryptCertificateCacheFile": "./config/letsencrypt.cache",
        "Forward80To443": false,
        "TrustedProxyIPHeader": [
            "X-Forwarded-For",
            "X-Real-IP"
        ],
        "ReadTimeout": 300,
        "WriteTimeout": 300,
        "IdleTimeout": 60,
        "MaximumLoginAttempts": 10,
        "GoroutineHealthThreshold": -1,
        "EnableOAuthServiceProvider": false,
        "EnableIncomingWebhooks": true,
        "EnableOutgoingWebhooks": true,
        "EnableCommands": true,
        "EnablePostUsernameOverride": false,
        "EnablePostIconOverride": false,
        "GoogleDeveloperKey": "",
        "EnableOnlyAdminIntegrations": true,
        "EnableLinkPreviews": true,
        "RestrictLinkPreviews": "",
        "EnableTesting": false,
        "EnableDeveloper": false,
        "EnableOpenTracing": false,
        "EnableSecurityFixAlert": true,
        "EnableInsecureOutgoingConnections": false,
        "AllowedUntrustedInternalConnections": "",
        "EnableMultifactorAuthentication": false,
        "EnforceMultifactorAuthentication": false,
        "EnableUserAccessTokens": false,
        "AllowCorsFrom": "",
        "CorsExposedHeaders": "",
        "CorsAllowCredentials": false,
        "CorsDebug": false,
        "AllowCookiesForSubdomains": false,
        "ExtendSessionLengthWithActivity": false,
        "SessionLengthWebInDays": 180,
        "SessionLengthMobileInDays": 180,
        "SessionLengthSSOInDays": 30,
        "SessionCacheInMinutes": 10,
        "SessionIdleTimeoutInMinutes": 43200,
        "WebsocketSecurePort": 443,
        "WebsocketPort": 80,
        "WebserverMode": "gzip",
        "EnableGifPicker": true,
        "GfycatApiKey": "2_KtH_W5",
        "GfycatApiSecret": "3wLVZPiswc3DnaiaFoLkDvB4X0IV6CpMkj4tf2inJRsBY6-FnkT08zGmppWFgeof",
        "EnableCustomEmoji": true,
        "EnableEmojiPicker": true,
        "RestrictCustomEmojiCreation": "all",
        "RestrictPostDelete": "all",
        "AllowEditPost": "always",
        "PostEditTimeLimit": -1,
        "TimeBetweenUserTypingUpdatesMilliseconds": 5000,
        "EnablePostSearch": true,
        "EnableFileSearch": true,
        "MinimumHashtagLength": 3,
        "EnableUserTypingMessages": true,
        "EnableChannelViewedMessages": true,
        "EnableUserStatuses": true,
        "ExperimentalEnableAuthenticationTransfer": true,
        "ClusterLogTimeoutMilliseconds": 2000,
        "CloseUnusedDirectMessages": false,
        "EnablePreviewFeatures": true,
        "EnableTutorial": true,
        "ExperimentalEnableDefaultChannelLeaveJoinMessages": true,
        "ExperimentalGroupUnreadChannels": "disabled",
        "ExperimentalChannelOrganization": false,
        "ImageProxyType": "",
        "ImageProxyURL": "",
        "ImageProxyOptions": "",
        "EnableAPITeamDeletion": false,
        "EnableAPIUserDeletion": false,
        "ExperimentalEnableHardenedMode": false,
        "DisableLegacyMFA": false,
        "ExperimentalStrictCSRFEnforcement": false,
        "EnableEmailInvitations": true,
        "DisableBotsWhenOwnerIsDeactivated": true,
        "EnableBotAccountCreation": false,
        "EnableSVGs": true,
        "EnableLatex": true,
        "EnableAPIChannelDeletion": false,
        "EnableLocalMode": false,
        "LocalModeSocketLocation": "/var/tmp/mattermost_local.socket",
        "EnableAWSMetering": false,
        "SplitKey": "",
        "FeatureFlagSyncIntervalSeconds": 30,
        "DebugSplit": false,
        "ThreadAutoFollow": true,
        "CollapsedThreads": "disabled",
        "ManagedResourcePaths": "",
        "EnableLegacySidebar": false,
        "EnableReliableWebSockets": false
    },
    "TeamSettings": {
        "SiteName": "Mattermost",
        "MaxUsersPerTeam": 50,
        "EnableTeamCreation": true,
        "EnableUserCreation": true,
        "EnableOpenServer": false,
        "EnableUserDeactivation": false,
        "RestrictCreationToDomains": "",
        "EnableCustomUserStatuses": true,
        "EnableCustomBrand": false,
        "CustomBrandText": "",
        "CustomDescriptionText": "",
        "RestrictDirectMessage": "any",
        "RestrictTeamInvite": "all",
        "RestrictPublicChannelManagement": "all",
        "RestrictPrivateChannelManagement": "all",
        "RestrictPublicChannelCreation": "all",
        "RestrictPrivateChannelCreation": "all",
        "RestrictPublicChannelDeletion": "all",
        "RestrictPrivateChannelDeletion": "all",
        "RestrictPrivateChannelManageMembers": "all",
        "EnableXToLeaveChannelsFromLHS": false,
        "UserStatusAwayTimeout": 300,
        "MaxChannelsPerTeam": 2000,
        "MaxNotificationsPerChannel": 1000,
        "EnableConfirmNotificationsToChannel": true,
        "TeammateNameDisplay": "username",
        "ExperimentalViewArchivedChannels": true,
        "ExperimentalEnableAutomaticReplies": false,
        "ExperimentalHideTownSquareinLHS": false,
        "ExperimentalTownSquareIsReadOnly": false,
        "LockTeammateNameDisplay": false,
        "ExperimentalPrimaryTeam": "",
        "ExperimentalDefaultChannels": []
    },
    "ClientRequirements": {
        "AndroidLatestVersion": "",
        "AndroidMinVersion": "",
        "DesktopLatestVersion": "",
        "DesktopMinVersion": "",
        "IosLatestVersion": "",
        "IosMinVersion": ""
    },
    "SqlSettings": {
        "DriverName": "postgres",
        "DataSource": "postgres://mmuser:mostest@localhost/mattermost_test?sslmode=disable\u0026connect_timeout=10",
        "DataSourceReplicas": [],
        "DataSourceSearchReplicas": [],
        "MaxIdleConns": 20,
        "ConnMaxLifetimeMilliseconds": 3600000,
        "ConnMaxIdleTimeMilliseconds": 300000,
        "MaxOpenConns": 300,
        "Trace": false,
        "AtRestEncryptKey": "wtan3scu6jbhsa6zdmnta8sefs87aqrg",
        "QueryTimeout": 30,
        "DisableDatabaseSearch": false,
        "ReplicaLagSettings": []
    },
    "LogSettings": {
        "EnableConsole": true,
        "ConsoleLevel": "DEBUG",
        "ConsoleJson": true,
        "EnableColor": false,
        "EnableFile": true,
        "FileLevel": "INFO",
        "FileJson": true,
        "FileLocation": "",
        "EnableWebhookDebugging": true,
        "EnableDiagnostics": true,
        "EnableSentry": true,
        "AdvancedLoggingConfig": ""
    },
    "ExperimentalAuditSettings": {
        "FileEnabled": false,
        "FileName": "",
        "FileMaxSizeMB": 100,
        "FileMaxAgeDays": 0,
        "FileMaxBackups": 0,
        "FileCompress": false,
        "FileMaxQueueSize": 1000,
        "AdvancedLoggingConfig": ""
    },
    "NotificationLogSettings": {
        "EnableConsole": true,
        "ConsoleLevel": "DEBUG",
        "ConsoleJson": true,
        "EnableColor": false,
        "EnableFile": true,
        "FileLevel": "INFO",
        "FileJson": true,
        "FileLocation": "",
        "AdvancedLoggingConfig": ""
    },
    "PasswordSettings": {
        "MinimumLength": 10,
        "Lowercase": true,
        "Number": true,
        "Uppercase": true,
        "Symbol": true
    },
    "FileSettings": {
        "EnableFileAttachments": true,
        "EnableMobileUpload": true,
        "EnableMobileDownload": true,
        "MaxFileSize": 104857600,
        "DriverName": "local",
        "Directory": "./data/",
        "EnablePublicLink": false,
        "ExtractContent": true,
        "ArchiveRecursion": false,
        "PublicLinkSalt": "yucprtr7jbpgu33mb3j4q1eixagrtrjz",
        "InitialFont": "nunito-bold.ttf",
        "AmazonS3AccessKeyId": "",
        "AmazonS3SecretAccessKey": "",
        "AmazonS3Bucket": "",
        "AmazonS3PathPrefix": "",
        "AmazonS3Region": "",
        "AmazonS3Endpoint": "s3.amazonaws.com",
        "AmazonS3SSL": true,
        "AmazonS3SignV2": false,
        "AmazonS3SSE": false,
        "AmazonS3Trace": false
    },
    "EmailSettings": {
        "EnableSignUpWithEmail": true,
        "EnableSignInWithEmail": true,
        "EnableSignInWithUsername": true,
        "SendEmailNotifications": true,
        "UseChannelInEmailNotifications": false,
        "RequireEmailVerification": false,
        "FeedbackName": "",
        "FeedbackEmail": "[email protected]",
        "ReplyToAddress": "[email protected]",
        "FeedbackOrganization": "",
        "EnableSMTPAuth": false,
        "SMTPUsername": "",
        "SMTPPassword": "",
        "SMTPServer": "localhost",
        "SMTPPort": "10025",
        "SMTPServerTimeout": 10,
        "ConnectionSecurity": "",
        "SendPushNotifications": false,
        "PushNotificationServer": "",
        "PushNotificationContents": "full",
        "PushNotificationBuffer": 1000,
        "EnableEmailBatching": false,
        "EmailBatchingBufferSize": 256,
        "EmailBatchingInterval": 30,
        "EnablePreviewModeBanner": true,
        "SkipServerCertificateVerification": false,
        "EmailNotificationContentsType": "full",
        "LoginButtonColor": "#0000",
        "LoginButtonBorderColor": "#2389D7",
        "LoginButtonTextColor": "#2389D7"
    },
    "RateLimitSettings": {
        "Enable": false,
        "PerSec": 10,
        "MaxBurst": 100,
        "MemoryStoreSize": 10000,
        "VaryByRemoteAddr": true,
        "VaryByUser": false,
        "VaryByHeader": ""
    },
    "PrivacySettings": {
        "ShowEmailAddress": true,
        "ShowFullName": true
    },
    "SupportSettings": {
        "TermsOfServiceLink": "https://mattermost.com/terms-of-service/",
        "PrivacyPolicyLink": "https://mattermost.com/privacy-policy/",
        "AboutLink": "https://about.mattermost.com/default-about/",
        "HelpLink": "https://about.mattermost.com/default-help/",
        "ReportAProblemLink": "https://about.mattermost.com/default-report-a-problem/",
        "SupportEmail": "",
        "CustomTermsOfServiceEnabled": false,
        "CustomTermsOfServiceReAcceptancePeriod": 365,
        "EnableAskCommunityLink": true
    },
    "AnnouncementSettings": {
        "EnableBanner": false,
        "BannerText": "",
        "BannerColor": "#f2a93b",
        "BannerTextColor": "#333333",
        "AllowBannerDismissal": true,
        "AdminNoticesEnabled": true,
        "UserNoticesEnabled": true,
        "NoticesURL": "https://notices.mattermost.com/",
        "NoticesFetchFrequency": 3600,
        "NoticesSkipCache": false
    },
    "ThemeSettings": {
        "EnableThemeSelection": true,
        "DefaultTheme": "default",
        "AllowCustomThemes": true,
        "AllowedThemes": []
    },
    "GitLabSettings": {
        "Enable": false,
        "Secret": "",
        "Id": "",
        "Scope": "",
        "AuthEndpoint": "",
        "TokenEndpoint": "",
        "UserApiEndpoint": "",
        "DiscoveryEndpoint": "",
        "ButtonText": "",
        "ButtonColor": ""
    },
    "GoogleSettings": {
        "Enable": false,
        "Secret": "",
        "Id": "",
        "Scope": "profile email",
        "AuthEndpoint": "https://accounts.google.com/o/oauth2/v2/auth",
        "TokenEndpoint": "https://www.googleapis.com/oauth2/v4/token",
        "UserApiEndpoint": "https://people.googleapis.com/v1/people/me?personFields=names,emailAddresses,nicknames,metadata",
        "DiscoveryEndpoint": "",
        "ButtonText": "",
        "ButtonColor": ""
    },
    "Office365Settings": {
        "Enable": false,
        "Secret": "",
        "Id": "",
        "Scope": "User.Read",
        "AuthEndpoint": "https://login.microsoftonline.com/common/oauth2/v2.0/authorize",
        "TokenEndpoint": "https://login.microsoftonline.com/common/oauth2/v2.0/token",
        "UserApiEndpoint": "https://graph.microsoft.com/v1.0/me",
        "DiscoveryEndpoint": "",
        "DirectoryId": ""
    },
    "OpenIdSettings": {
        "Enable": false,
        "Secret": "",
        "Id": "",
        "Scope": "profile openid email",
        "AuthEndpoint": "",
        "TokenEndpoint": "",
        "UserApiEndpoint": "",
        "DiscoveryEndpoint": "",
        "ButtonText": "",
        "ButtonColor": "#145DBF"
    },
    "LdapSettings": {
        "Enable": false,
        "EnableSync": false,
        "LdapServer": "",
        "LdapPort": 389,
        "ConnectionSecurity": "",
        "BaseDN": "",
        "BindUsername": "",
        "BindPassword": "",
        "UserFilter": "",
        "GroupFilter": "",
        "GuestFilter": "",
        "EnableAdminFilter": false,
        "AdminFilter": "",
        "GroupDisplayNameAttribute": "",
        "GroupIdAttribute": "",
        "FirstNameAttribute": "",
        "LastNameAttribute": "",
        "EmailAttribute": "",
        "UsernameAttribute": "",
        "NicknameAttribute": "",
        "IdAttribute": "",
        "PositionAttribute": "",
        "LoginIdAttribute": "",
        "PictureAttribute": "",
        "SyncIntervalMinutes": 60,
        "SkipCertificateVerification": false,
        "PublicCertificateFile": "",
        "PrivateKeyFile": "",
        "QueryTimeout": 60,
        "MaxPageSize": 0,
        "LoginFieldName": "",
        "LoginButtonColor": "#0000",
        "LoginButtonBorderColor": "#2389D7",
        "LoginButtonTextColor": "#2389D7",
        "Trace": false
    },
    "ComplianceSettings": {
        "Enable": false,
        "Directory": "./data/",
        "EnableDaily": false,
        "BatchSize": 30000
    },
    "LocalizationSettings": {
        "DefaultServerLocale": "en",
        "DefaultClientLocale": "en",
        "AvailableLocales": ""
    },
    "SamlSettings": {
        "Enable": false,
        "EnableSyncWithLdap": false,
        "EnableSyncWithLdapIncludeAuth": false,
        "IgnoreGuestsLdapSync": false,
        "Verify": true,
        "Encrypt": true,
        "SignRequest": false,
        "IdpUrl": "",
        "IdpDescriptorUrl": "",
        "IdpMetadataUrl": "",
        "ServiceProviderIdentifier": "",
        "AssertionConsumerServiceURL": "",
        "SignatureAlgorithm": "RSAwithSHA1",
        "CanonicalAlgorithm": "Canonical1.0",
        "ScopingIDPProviderId": "",
        "ScopingIDPName": "",
        "IdpCertificateFile": "",
        "PublicCertificateFile": "",
        "PrivateKeyFile": "",
        "IdAttribute": "",
        "GuestAttribute": "",
        "EnableAdminAttribute": false,
        "AdminAttribute": "",
        "FirstNameAttribute": "",
        "LastNameAttribute": "",
        "EmailAttribute": "",
        "UsernameAttribute": "",
        "NicknameAttribute": "",
        "LocaleAttribute": "",
        "PositionAttribute": "",
        "LoginButtonText": "SAML",
        "LoginButtonColor": "#34a28b",
        "LoginButtonBorderColor": "#2389D7",
        "LoginButtonTextColor": "#ffffff"
    },
    "NativeAppSettings": {
        "AppCustomURLSchemes": [
            "mmauth://",
            "mmauthbeta://"
        ],
        "AppDownloadLink": "https://mattermost.com/download/#mattermostApps",
        "AndroidAppDownloadLink": "https://about.mattermost.com/mattermost-android-app/",
        "IosAppDownloadLink": "https://about.mattermost.com/mattermost-ios-app/"
    },
    "ClusterSettings": {
        "Enable": false,
        "ClusterName": "",
        "OverrideHostname": "",
        "NetworkInterface": "",
        "BindAddress": "",
        "AdvertiseAddress": "",
        "UseIpAddress": true,
        "UseExperimentalGossip": true,
        "EnableGossipCompression": true,
        "EnableExperimentalGossipEncryption": false,
        "ReadOnlyConfig": true,
        "GossipPort": 8074,
        "StreamingPort": 8075,
        "MaxIdleConns": 100,
        "MaxIdleConnsPerHost": 128,
        "IdleConnTimeoutMilliseconds": 90000
    },
    "MetricsSettings": {
        "Enable": false,
        "BlockProfileRate": 0,
        "ListenAddress": ":8067"
    },
    "ExperimentalSettings": {
        "ClientSideCertEnable": false,
        "ClientSideCertCheck": "secondary",
        "EnableClickToReply": false,
        "LinkMetadataTimeoutMilliseconds": 5000,
        "RestrictSystemAdmin": false,
        "UseNewSAMLLibrary": false,
        "CloudUserLimit": 0,
        "CloudBilling": false,
        "EnableSharedChannels": false,
        "EnableRemoteClusterService": false
    },
    "AnalyticsSettings": {
        "MaxUsersForStatistics": 2500
    },
    "ElasticsearchSettings": {
        "ConnectionUrl": "http://localhost:9200",
        "Username": "elastic",
        "Password": "changeme",
        "EnableIndexing": false,
        "EnableSearching": false,
        "EnableAutocomplete": false,
        "Sniff": true,
        "PostIndexReplicas": 1,
        "PostIndexShards": 1,
        "ChannelIndexReplicas": 1,
        "ChannelIndexShards": 1,
        "UserIndexReplicas": 1,
        "UserIndexShards": 1,
        "AggregatePostsAfterDays": 365,
        "PostsAggregatorJobStartTime": "03:00",
        "IndexPrefix": "",
        "LiveIndexingBatchSize": 1,
        "BulkIndexingTimeWindowSeconds": 3600,
        "RequestTimeoutSeconds": 30,
        "SkipTLSVerification": false,
        "Trace": ""
    },
    "BleveSettings": {
        "IndexDir": "",
        "EnableIndexing": false,
        "EnableSearching": false,
        "EnableAutocomplete": false,
        "BulkIndexingTimeWindowSeconds": 3600
    },
    "DataRetentionSettings": {
        "EnableMessageDeletion": false,
        "EnableFileDeletion": false,
        "MessageRetentionDays": 365,
        "FileRetentionDays": 365,
        "DeletionJobStartTime": "02:00"
    },
    "MessageExportSettings": {
        "EnableExport": false,
        "ExportFormat": "actiance",
        "DailyRunTime": "01:00",
        "ExportFromTimestamp": 0,
        "BatchSize": 10000,
        "DownloadExportResults": false,
        "GlobalRelaySettings": {
            "CustomerType": "A9",
            "SmtpUsername": "",
            "SmtpPassword": "",
            "EmailAddress": "",
            "SMTPServerTimeout": 1800
        }
    },
    "JobSettings": {
        "RunJobs": true,
        "RunScheduler": true
    },
    "PluginSettings": {
        "Enable": true,
        "EnableUploads": false,
        "AllowInsecureDownloadUrl": false,
        "EnableHealthCheck": true,
        "Directory": "./plugins",
        "ClientDirectory": "./client/plugins",
        "Plugins": {},
        "PluginStates": {
            "com.mattermost.nps": {
                "Enable": true
            }
        },
        "EnableMarketplace": true,
        "EnableRemoteMarketplace": true,
        "AutomaticPrepackagedPlugins": true,
        "RequirePluginSignature": false,
        "MarketplaceUrl": "https://api.integrations.mattermost.com",
        "SignaturePublicKeyFiles": []
    },
    "DisplaySettings": {
        "CustomUrlSchemes": [],
        "ExperimentalTimezone": true
    },
    "GuestAccountsSettings": {
        "Enable": false,
        "AllowEmailAccounts": true,
        "EnforceMultifactorAuthentication": false,
        "RestrictCreationToDomains": ""
    },
    "ImageProxySettings": {
        "Enable": false,
        "ImageProxyType": "local",
        "RemoteImageProxyURL": "",
        "RemoteImageProxyOptions": ""
    },
    "CloudSettings": {
        "CWSUrl": "https://customers.mattermost.com",
        "CWSAPIUrl": "https://portal.internal.prod.cloud.mattermost.com"
    },
    "ImportSettings": {
        "Directory": "./import",
        "RetentionDays": 30
    },
    "ExportSettings": {
        "Directory": "./export",
        "RetentionDays": 30
    }
}

README Typo error

Removing The Docker Containers
Remove the containers

sudo docker-compose -f docker-compose.yml -f docker-compose.nginx.ymp down
# OR
sudo docker-compose -f docker-compose.yml -f docker-compose.without-nginx.yml down

It should be sudo docker-compose -f docker-compose.yml -f docker-compose.nginx.yml down

Matermost CLI not working in Docker deployment

Executing Mattermost CLI commands are not successful.
Missing credentials.

Error:
docker exec mattermost mmctl user list
Error: cannot read user credentials, maybe you need to use login first: stat /mattermost/.config/mmctl/config: no such file or directory

Mattermost server:
mattermost/mattermost-team-edition:6.0.2

Unable to activate plugin

I have deployed the mattermost-team-edition in ubuntu server on an amazon ec2 using the mattermost docker.
I installed a plugin named mattermost-plugin-oembed by compressing it into tar.gz following the documentation of plugin but I got following error while enabling the plugin.

image

I used the same plugin compressed file in my local environment without using docker it works fine but when I use it in my docker environment I get the following message in my server logs.

{"timestamp":"2021-10-22 04:28:53.738 Z","level":"error","msg":"Unable to activate plugin","caller":"app/plugin.go:146","plugin_id":"com.mattermost.oembed","error":"unable to start plugin: com.mattermost.oembed: Unrecognized remote plugin message: \n\nThis usually means that the plugin is either invalid or simply\nneeds to be recompiled to support the latest protocol."}

I am unaware why I am getting this error or is this an issue with the docker version of mattermost.

Additional Information:

  1. MATTERMOST_IMAGE=mattermost-team-edition
  2. MATTERMOST_IMAGE_TAG=5.33.1
  3. Database Schema Version: 5.33.1
  4. Database: postgres

Missing certificate signed by unknown authority

Hello @jasonblais ,

Sorry for the time without no news about my tests.
After reviewing the code in the docker-compose.yml I think there is something missing.
The 13 may 2020 I fix an issue about self-signed certificate : mattermost/mattermost-docker#474 for this issue : mattermost/mattermost#13059

I think, this is missing in the new repository.
Can I reopen a PR for this ?

Thank you very much.

Originally posted by @craph in mattermost/mattermost-docker#529 (comment)

failed to load configuration

After deploying using Quick setup from readme I've got error in app (Mattermost):
Error: failed to load configuration: failed to create store: unable to load on store creation: invalid config: Config.IsValid: model.config.is_valid.site_url.app_error,

Config volume ownership is 2000:2000 and volume is empty. There is no config.json file.

WAL-E backups to AWS S3

The original git repo mattermost/mattermost-docker has the WAL-E supports to deploy to AWS S3.

AWS
If deploying to AWS, you could also set following variables to enable Wal-E backup to S3 :
AWS_ACCESS_KEY_ID: AWS access key
AWS_SECRET_ACCESS_KEY: AWS secret
WALE_S3_PREFIX: AWS s3 bucket name
AWS_REGION: AWS region
All four environment variables are required. It will enable completed WAL segments sent to archive storage (S3). The base backup and clean up can be done through the following command:

It will be nice if we could have this kind of backup function in the current repo.

Mattermost can't connect to postgres: password authentication failed

Hi, the mattermost service can't manage to connect to postgres, here is the result of docker logs:

{"level":"info","ts":1638953734.2359033,"caller":"app/server.go:214","msg":"Server is initializing..."}
{"level":"info","ts":1638953734.2365377,"caller":"app/web_hub.go:83","msg":"Starting websocket hubs","number_of_hubs":6}
{"level":"warn","ts":1638953734.2369666,"caller":"app/server.go:223","msg":"Sentry reporting is enabled, but SENTRY_DSN is not set. Disabling reporting."}
{"level":"info","ts":1638953734.2381017,"caller":"utils/i18n.go:90","msg":"Loaded system translations","for locale":"fr","from locale":"/mattermost/i18n/fr.json"}
{"level":"info","ts":1638953734.2580488,"caller":"sqlstore/supplier.go:235","msg":"Pinging SQL","database":"master"}
{"level":"error","ts":1638953734.2681053,"caller":"sqlstore/supplier.go:247","msg":"Failed to ping DB","error":"pq: password authentication failed for user \"mmuser\"","retrying in seconds":10}

But I have the postgres service running well, I can connect to it using psql -h 127.0.0.1 -p 5433 -U mmuser mattermost from my docker host.

I am not using nginx because I have already a reverse proxy, so I use the docker-compose.without-nginx.yml file in addition to the regular docker-compose file.

I have another postgres container running on my docker host, so I changed the port of the postgres service to 5433, in my docker-compose.without-nginx.yml:

version: "2.4"

services:
  postgres:
    ports:
      - ${PGPORT}:5432

  mattermost:
    ports:
      - ${APP_PORT}:8065

I launch the whole with docker-compose -f docker-compose.yml -f docker-compose.without-nginx.yml up -d.

What am I missing? Thanks!

Here is the postgres part of my .env:

POSTGRES_IMAGE_TAG=12.4-alpine
POSTGRES_DATA_PATH=./volumes/db/var/lib/postgresql/data

POSTGRES_USER=mmuser
POSTGRES_PASSWORD=mypassword
POSTGRES_DB=mattermost
PGPORT=5433

MM_SQLSETTINGS_DRIVERNAME=postgres
MM_SQLSETTINGS_DATASOURCE=postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}?sslmode=disable&connect_timeout=10

docker logs of postgres service:

2021-12-08 08:54:11.679 UTC [1] LOG:  starting PostgreSQL 12.4 on x86_64-pc-linux-musl, compiled by gcc (Alpine 9.3.0) 9.3.0, 64-bit
2021-12-08 08:54:11.680 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
2021-12-08 08:54:11.680 UTC [1] LOG:  listening on IPv6 address "::", port 5432
2021-12-08 08:54:11.686 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
2021-12-08 08:54:11.723 UTC [23] LOG:  database system was shut down at 2021-12-08 08:49:54 UTC
2021-12-08 08:54:11.739 UTC [1] LOG:  database system is ready to accept connections

Upgrade Script - POSTGRES_OLD_VERSION

I migrated from the Old Mattermost Docker with Postgres 9.4.26 to 9.13 using the Upgrade Script.

To make the script work it was necessary to set the POSTGRES_OLD_VERSION variable to 9.4, instead of 9.4.26 which the upgrade script found in docker-compose.yml.

This was necessary because 9.4.26-to-13 does not exist https://github.com/tianon/docker-postgres-upgrade - as all other patch versions do not exist.

Therefore I propose to update the script to set the POSTGRES_OLD_VERSION only to the minor version without the patch version. Or add a note in the Upgrade Readme to set the variable before executing the script.

Mattermost container failling on start

Various error while trying to start mattermost/docker as a brand new deployment. Error below has been resolved in the presented order

Invalid site url

docker logs mattermost : Error: failed to load configuration: failed to create store: unable to load on store creation: invalid config: Config.IsValid: model.config.is_valid.site_url.app_error

To resolve the problem, I edited docker-compose.yml to indicate the site url directly instead:

      # additional settings
      - MM_SERVICESETTINGS_SITEURL:http://test.domain.net

Cannot ping database

{"level":"info","ts":1626710596.067384,"caller":"sqlstore/store.go:289","msg":"Pinging SQL","database":"master"}
{"level":"error","ts":1626710596.0676122,"caller":"sqlstore/store.go:301","msg":"Failed to ping DB","error":"parse \"postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}?sslmode=disable&connect_timeout=10\": net/url: invalid userinfo","retrying in seconds":10}

To resolve I replaced the variables into .env line where the POSTGRES connection is generated with required values:
MM_SQLSETTINGS_DATASOURCE=postgres://User:MyPassword@postgres:5432/MyDB?sslmode=disable&connect_timeout=10

Done

Now MM is starting properly :)

It leads me to believe that variables set inside a file and re-used inside the same file are not translated to values.

ERROR when starting mattermost , postgres and nginx read_only file system

Hello,

I just followed all the steps to start with a fresh installation of MM with the version 5.38.2 and when I ran docker-compose up -d I have errors with the database and nginx.

Here are the errors:

postgres_mattermost | 2021-09-20 10:09:21.430 UTC [1] LOG:  starting PostgreSQL 13.4 on x86_64-pc-linux-musl, compiled by gcc (Alpine 10.3.1_git20210424) 10.3.1 20210424, 64-bit
postgres_mattermost | 2021-09-20 10:09:21.430 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
postgres_mattermost | 2021-09-20 10:09:21.430 UTC [1] LOG:  listening on IPv6 address "::", port 5432
postgres_mattermost | 2021-09-20 10:09:21.430 UTC [1] FATAL:  could not create lock file "/var/run/postgresql/.s.PGSQL.5432.lock": Read-only file system
postgres_mattermost | 2021-09-20 10:09:21.432 UTC [1] LOG:  database system is shut down
mattermost    | {"level":"info","ts":1632132609.2597942,"caller":"sqlstore/store.go:308","msg":"Pinging SQL","database":"master"}
mattermost    | {"level":"error","ts":1632132609.2736187,"caller":"sqlstore/store.go:320","msg":"Failed to ping DB","error":"dial tcp: lookup postgres on 127.0.0.11:53: server misbehaving","retrying in seconds":10}
mattermost    | {"level":"info","ts":1632132619.2740848,"caller":"sqlstore/store.go:308","msg":"Pinging SQL","database":"master"}
mattermost    | {"level":"error","ts":1632132619.280617,"caller":"sqlstore/store.go:320","msg":"Failed to ping DB","error":"dial tcp: lookup postgres on 127.0.0.11:53: server misbehaving","retrying in seconds":10}
postgres_mattermost exited with code 1

and for nginx :

/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
nginx: [warn] "ssl_stapling" ignored, issuer certificate not found for certificate "/cert.pem"
nginx: [emerg] open() "/var/run/nginx.pid" failed (30: Read-only file system)

I have existing certificate and key from a previous installation of MM 5.31.0 so I moved the file to the new directory.

Here is the .env file :

# Domain of service
DOMAIN=mymattermost

# Container settings
## Timezone inside the containers. The value needs to be in the form 'Europe/Berlin'.
## A list of these tz database names can be looked up at Wikipedia
## https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
TZ=UTC
RESTART_POLICY=unless-stopped

# Postgres settings
## Documentation for this image and available settings can be found on hub.docker.com
## https://hub.docker.com/_/postgres
## Please keep in mind this will create a superuser and it's recommended to use a less privileged
## user to connect to the database.
## A guide on how to change the database user to a nonsuperuser can be found in docs/creation-of-nonsuperuser.md
POSTGRES_IMAGE_TAG=13-alpine
POSTGRES_DATA_PATH=./volumes/db/var/lib/postgresql/data

POSTGRES_USER=mmuser
POSTGRES_PASSWORD=mmuser_password
POSTGRES_DB=mattermost

# Nginx
## The nginx container will use a configuration found at the NGINX_MATTERMOST_CONFIG. The config aims
## to be secure and uses a catch-all server vhost which will work out-of-the-box. For additional settings
## or changes ones can edit it or provide another config. Important note: inside the container, nginx sources
## every config file inside */etc/nginx/conf.d* ending with a *.conf* file extension.

## Inside the container the uid and gid is 101. The folder owner can be set with
## `sudo chown -R 101:101 ./nginx` if needed.
NGINX_IMAGE_TAG=alpine

## The folder containing server blocks and any additional config to nginx.conf
NGINX_CONFIG_PATH=./nginx/conf.d
NGINX_DHPARAMS_FILE=./nginx/dhparams4096.pem

CERT_PATH=./volumes/web/cert/cert.pem
KEY_PATH=./volumes/web/cert/key-no-password.pem
GITLAB_PKI_CHAIN_PATH=/root/certpki/my_pki_chain.pem
#CERT_PATH=./certs/etc/letsencrypt/live/${DOMAIN}/fullchain.pem
#KEY_PATH=./certs/etc/letsencrypt/live/${DOMAIN}/privkey.pem

## Exposed ports to the host. Inside the container 80 and 443 will be used
HTTPS_PORT=4434
HTTP_PORT=8008

# Mattermost settings
## Inside the container the uid and gid is 2000. The folder owner can be set with
## `sudo chown -R 2000:2000 ./volumes/app/mattermost`.
MATTERMOST_CONFIG_PATH=./volumes/app/mattermost/config
MATTERMOST_DATA_PATH=./volumes/app/mattermost/data
MATTERMOST_LOGS_PATH=./volumes/app/mattermost/logs
MATTERMOST_PLUGINS_PATH=./volumes/app/mattermost/plugins
MATTERMOST_CLIENT_PLUGINS_PATH=./volumes/app/mattermost/client/plugins

## This will be 'mattermost-enterprise-edition' or 'mattermost-team-edition' based on the version of Mattermost you're installing.
MATTERMOST_IMAGE=mattermost-team-edition
MATTERMOST_IMAGE_TAG=5.38.2

## The app port is only relevant for using Mattermost without the nginx container as reverse proxy. This is not meant
## to be used with the internal HTTP server exposed but rather in case one wants to host several services on one host
## or for using it behind another existing reverse proxy.
APP_PORT=8065

## Configuration settings for Mattermost. Documentation on the variables and the settings itself can be found at
## https://docs.mattermost.com/administration/config-settings.html
## Keep in mind that variables set here will take precedence over the same setting in config.json. This includes
## the system console as well and settings set with env variables will be greyed out.

## Below one can find necessary settings to spin up the Mattermost container
MM_SQLSETTINGS_DRIVERNAME=postgres
MM_SQLSETTINGS_DATASOURCE=postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}?sslmode=disable&connect_timeout=10

## Example settings (any additional setting added here also needs to be introduced in the docker-compose.yml)
MM_SERVICESETTINGS_SITEURL=https://${DOMAIN}:4434

Session is expiring on each site refresh

Hi, i have issue with sessions in my mattermost instance.
First of all, i'm coming from mattermost-docker, i've used upgrade script to move to the new repo.

The problem is:
On each page refresh or desktop app re-run (Right-click > exit from tray and then run), logged user is losing his session.
I'm running Haproxy reverse-proxy which is also ssl terminator.

docker version:
Docker version 20.10.6, build 370c289

docker-compose version:
docker-compose version 1.28.5, build c4eb3a1f

Host:

PRETTY_NAME="Debian GNU/Linux 10 (buster)"
NAME="Debian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster

Mattermost server:

Team edition
Mattermost Version: 5.39.0
Database Schema Version: 5.39.0
Database: postgres

Of course i will provide logs, but i would need to know, which one do you need.

Upgrading from mattermost-docker

Hello @jasonblais , @mrckndt
As mentioned in mattermost/mattermost-docker#529 I did my tests to migrate from MM 5.31 to 5.32.1 with the migration script.

I have few remarks about the script :

  1. When he try to get the POSTGRES_OLD_VERSION from the docker container he gets : 9.4.21 instead of 9.4 so when you try to find the docker image it results in :
docker: Error response from daemon: manifest for tianon/postgres-upgrade:9.4.21-to-13 not found: manifest unknown: manifest unknown.

So I suggest that the version must be fixed in the script or export before running it.

  1. Same for the MM_VERSION when we do the docker-compose build. When the version is commented like that # - MM_VERSION=5.31 in the docker-compose.yml and in the Dockerfile you have : ARG MM_VERSION=5.31.0
    the sed command will write 5.32.1.0 instead of 5.32.1

so what do you think about reading the value directly from the Dockerfile instead of the docker-compose.yml file ?

Then the last step, when the migration is done, how to swith from the old directories/files structures to the new one with the new repo ? Is it possible to change the path for the volume directly in the .env file and that's all ?

Thank you very much.

Best regards,

Mattermost can't be started Invalid Configuration

I have pulled the project. Done all the steps in the README and ended up with:

Error: failed to load configuration: failed to create store: unable to load on store creation: invalid config: Config.IsValid: model.config.is_valid.site_url.app_error

Usage:
mattermost | mattermost [flags]
mattermost | mattermost [command]
mattermost |
mattermost | Available Commands:
mattermost | channel Management of channels
mattermost | command Management of slash commands

...

Maybe the README is missing a step. Do I need a default configuration file somewhere? My .env is configured just the way described in the README.

v6.0.0 to v6.1.0 updgrade - database schema migration

Hello, I'm running the mattermost-enterprise-edition docker image, v6.0.0

I noticed the main release v6.1.0 notes mention a database schema change
https://docs.mattermost.com/install/self-managed-changelog.html#release-v6.1-feature-release
https://gist.github.com/streamer45/997b726a86b5d2a624ac2af435a66086

However, there is no mention of the change for the docker version. Do I need to apply the same migration steps mentioned in the above link, or can I proceed with my upgrade like normal with no issues?

Thanks!

could not open file "./analyze_new_cluster.sh": Permission denied

The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with locale "en_US.utf8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".

Data page checksums are disabled.

fixing permissions on existing directory /var/lib/postgresql/13/data ... ok
creating subdirectories ... ok
selecting dynamic shared memory implementation ... posix
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting default time zone ... Etc/UTC
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... initdb: warning: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the option -A, or
--auth-local and --auth-host, the next time you run initdb.
ok


Success. You can now start the database server using:

    pg_ctl -D /var/lib/postgresql/13/data -l logfile start

Performing Consistency Checks
-----------------------------
Checking cluster versions                                   ok
Checking database user is the install user                  ok
Checking database connection settings                       ok
Checking for prepared transactions                          ok
Checking for system-defined composite types in user tables  ok
Checking for reg* data types in user tables                 ok
Checking for contrib/isn with bigint-passing mismatch       ok
Checking for tables WITH OIDS                               ok
Checking for invalid "sql_identifier" user columns          ok
Checking for invalid "unknown" user columns                 ok
Checking for roles starting with "pg_"                      ok
Creating dump of global objects                             ok
Creating dump of database schemas
  mattermost
  postgres
  template1
                                                            ok
Checking for presence of required libraries                 ok
Checking database user is the install user                  ok
Checking for prepared transactions                          ok
Checking for new cluster tablespace directories             ok

If pg_upgrade fails after this point, you must re-initdb the
new cluster before continuing.

Performing Upgrade
------------------
Analyzing all rows in the new cluster                       ok
Freezing all rows in the new cluster                        ok
Deleting files from new pg_xact                             ok
Copying old pg_clog to new server                           ok
Setting oldest XID for new cluster                          ok
Setting next transaction ID and epoch for new cluster       ok
Deleting files from new pg_multixact/offsets                ok
Copying old pg_multixact/offsets to new server              ok
Deleting files from new pg_multixact/members                ok
Copying old pg_multixact/members to new server              ok
Setting next multixact ID and offset for new cluster        ok
Resetting WAL archives                                      ok
Setting frozenxid and minmxid counters in new cluster       ok
Restoring global objects in the new cluster                 ok
Restoring database schemas in the new cluster
  template1
  mattermost
  postgres
                                                            ok
Adding ".old" suffix to old global/pg_control               ok

If you want to start the old cluster, you will need to remove
the ".old" suffix from /var/lib/postgresql/9.4/data/global/pg_control.old.
Because "link" mode was used, the old cluster cannot be safely
started once the new cluster has been started.

Linking user relation files
  /var/lib/postgresql/9.4/data/base/16384/12095
  /var/lib/postgresql/9.4/data/base/16384/12097

..
...
..

  /var/lib/postgresql/9.4/data/base/1/12095
  /var/lib/postgresql/9.4/data/base/1/12097
                                                            ok
Setting next OID for new cluster                            ok
Sync data directory to disk                                 ok
Creating script to analyze new cluster
could not open file "./analyze_new_cluster.sh": Permission denied
Failure, exiting

linux version : Linux 3.10.0-862.14.4.el7.x86_64 #1 SMP Wed Sep 26 15:12:11 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

CentOS Linux release 7.8.2003 (Core)
Derived from Red Hat Enterprise Linux 7.8 (Source)
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

CentOS Linux release 7.8.2003 (Core)
CentOS Linux release 7.8.2003 (Core)
cpe:/o:centos:centos:7

docker version : Docker version 19.03.13, build 4484c46d9d

could not open file "./analyze_new_cluster.sh": Permission denied
Failure, exiting

It doesn't go any further with that error.
help me.

Containers in restart loop

I have a fresh install of Mattermost with latest version. I've followed the steps verbatim in the readme file.

In the docker logs for containers, I see the following output:

standard_init_linux.go:228: exec user process caused: operation not permitted

It's in a restart loop. Any suggestions? I only found a relevant search bringing up an issue with windows encoding compatibility. This is a Linux server so that shouldn't be the issue?

Docker version 20.10.8, build 3967b7d28e
docker-compose version 1.25.5, build unknown
Installed on Ubuntu 20.04LTS using snap

Error after upgrading from mattermost-docker manually

Dear Community!

I have upgraded the database before manually (using the scripts) and now I wanted to move to this new repo.

After starting up the containers (I'm using it without nginx, with another reverse proxy - caddy), the only logs I can see:

{"level":"error","ts":1630660849.027481,"caller":"log/log.go:184","msg":"[ERR] plugin: plugin acceptAndServe error: timeout waiting for accept","source":"stdlog"}

{"level":"error","ts":1630660849.0275328,"caller":"log/log.go:184","msg":"[ERR] plugin: plugin acceptAndServe error: timeout waiting for accept","source":"stdlog"}

{"level":"error","ts":1630660849.0275788,"caller":"log/log.go:184","msg":"[ERR] plugin: plugin acceptAndServe error: timeout waiting for accept","source":"stdlog"}

{"level":"error","ts":1630660849.3331985,"caller":"log/log.go:184","msg":"[ERR] plugin: plugin acceptAndServe error: timeout waiting for accept","source":"stdlog"}

{"level":"error","ts":1630660852.308998,"caller":"log/log.go:184","msg":"[ERR] plugin: plugin acceptAndServe error: timeout waiting for accept","source":"stdlog"}

{"level":"error","ts":1630660852.3092558,"caller":"log/log.go:184","msg":"[ERR] plugin: plugin acceptAndServe error: timeout waiting for accept","source":"stdlog"}

Database logs:

2021-09-03 09:15:48.713 UTC [84] ERROR:  relation "idx_teammembers_team_id" does not exist

2021-09-03 09:15:48.713 UTC [84] STATEMENT:  SELECT $1::regclass

2021-09-03 09:15:48.714 UTC [84] ERROR:  relation "idx_teams_name" does not exist

2021-09-03 09:15:48.714 UTC [84] STATEMENT:  SELECT $1::regclass

2021-09-03 09:15:48.769 UTC [84] ERROR:  constraint "fk_retentionpolicieschannels_retentionpolicies" for relation "retentionpolicieschannels" already exists

2021-09-03 09:15:48.769 UTC [84] STATEMENT:  

		ALTER TABLE RetentionPoliciesChannels

		ADD CONSTRAINT FK_RetentionPoliciesChannels_RetentionPolicies

		FOREIGN KEY (PolicyId) REFERENCES RetentionPolicies (Id)

		ON DELETE CASCADE;

2021-09-03 09:15:48.770 UTC [84] ERROR:  constraint "fk_retentionpoliciesteams_retentionpolicies" for relation "retentionpoliciesteams" already exists

2021-09-03 09:15:48.770 UTC [84] STATEMENT:  

		ALTER TABLE RetentionPoliciesTeams

		ADD CONSTRAINT FK_RetentionPoliciesTeams_RetentionPolicies

		FOREIGN KEY (PolicyId) REFERENCES RetentionPolicies (Id)

		ON DELETE CASCADE;

2021-09-03 09:15:52.070 UTC [87] ERROR:  duplicate key value violates unique constraint "users_username_key"

2021-09-03 09:15:52.070 UTC [87] DETAIL:  Key (username)=(surveybot) already exists.

2021-09-03 09:15:52.070 UTC [87] STATEMENT:  insert into "users" ("id","createat","updateat","deleteat","username","password","authdata","authservice","email","emailverified","nickname","firstname","lastname","position","roles","allowmarketing","props","notifyprops","lastpasswordupdate","lastpictureupdate","failedattempts","locale","timezone","mfaactive","mfasecret","remoteid") values ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22,$23,$24,$25,$26);

2021-09-03 09:20:41.162 UTC [100] ERROR:  relation "idx_posts_channel_id" does not exist

2021-09-03 09:20:41.162 UTC [100] STATEMENT:  SELECT $1::regclass

2021-09-03 09:20:41.163 UTC [100] ERROR:  relation "idx_channels_name" does not exist

2021-09-03 09:20:41.163 UTC [100] STATEMENT:  SELECT $1::regclass

2021-09-03 09:20:41.177 UTC [100] ERROR:  relation "idx_publicchannels_name" does not exist

2021-09-03 09:20:41.177 UTC [100] STATEMENT:  SELECT $1::regclass

2021-09-03 09:20:41.178 UTC [100] ERROR:  relation "idx_channelmembers_channel_id" does not exist

2021-09-03 09:20:41.178 UTC [100] STATEMENT:  SELECT $1::regclass

2021-09-03 09:20:41.179 UTC [100] ERROR:  relation "idx_emoji_name" does not exist

2021-09-03 09:20:41.179 UTC [100] STATEMENT:  SELECT $1::regclass

2021-09-03 09:20:41.179 UTC [100] ERROR:  relation "idx_oauthaccessdata_client_id" does not exist

2021-09-03 09:20:41.179 UTC [100] STATEMENT:  SELECT $1::regclass

2021-09-03 09:20:41.180 UTC [100] ERROR:  relation "idx_oauthauthdata_client_id" does not exist

2021-09-03 09:20:41.180 UTC [100] STATEMENT:  SELECT $1::regclass

2021-09-03 09:20:41.181 UTC [100] ERROR:  relation "idx_preferences_user_id" does not exist

2021-09-03 09:20:41.181 UTC [100] STATEMENT:  SELECT $1::regclass

2021-09-03 09:20:41.181 UTC [100] ERROR:  relation "idx_notice_views_user_id" does not exist

2021-09-03 09:20:41.181 UTC [100] STATEMENT:  SELECT $1::regclass

2021-09-03 09:20:41.182 UTC [100] ERROR:  relation "idx_notice_views_user_notice" does not exist

2021-09-03 09:20:41.182 UTC [100] STATEMENT:  SELECT $1::regclass

2021-09-03 09:20:41.183 UTC [100] ERROR:  relation "idx_status_user_id" does not exist

2021-09-03 09:20:41.183 UTC [100] STATEMENT:  SELECT $1::regclass

2021-09-03 09:20:41.184 UTC [100] ERROR:  relation "idx_teammembers_team_id" does not exist

2021-09-03 09:20:41.184 UTC [100] STATEMENT:  SELECT $1::regclass

2021-09-03 09:20:41.185 UTC [100] ERROR:  relation "idx_teams_name" does not exist

2021-09-03 09:20:41.185 UTC [100] STATEMENT:  SELECT $1::regclass

2021-09-03 09:20:41.186 UTC [100] ERROR:  relation "idx_user_access_tokens_token" does not exist

2021-09-03 09:20:41.186 UTC [100] STATEMENT:  SELECT $1::regclass

2021-09-03 09:20:41.187 UTC [100] ERROR:  relation "idx_user_terms_of_service_user_id" does not exist

2021-09-03 09:20:41.187 UTC [100] STATEMENT:  SELECT $1::regclass

2021-09-03 09:20:41.188 UTC [100] ERROR:  relation "idx_users_email" does not exist

2021-09-03 09:20:41.188 UTC [100] STATEMENT:  SELECT $1::regclass

2021-09-03 09:20:41.188 UTC [100] ERROR:  relation "idx_sharedchannelusers_user_id" does not exist

2021-09-03 09:20:41.188 UTC [100] STATEMENT:  SELECT $1::regclass

2021-09-03 09:20:41.189 UTC [100] ERROR:  relation "idx_retentionpolicies_displayname_id" does not exist

2021-09-03 09:20:41.189 UTC [100] STATEMENT:  SELECT $1::regclass

2021-09-03 09:20:41.211 UTC [100] ERROR:  constraint "fk_retentionpolicieschannels_retentionpolicies" for relation "retentionpolicieschannels" already exists

2021-09-03 09:20:41.211 UTC [100] STATEMENT:  

		ALTER TABLE RetentionPoliciesChannels

		ADD CONSTRAINT FK_RetentionPoliciesChannels_RetentionPolicies

		FOREIGN KEY (PolicyId) REFERENCES RetentionPolicies (Id)

		ON DELETE CASCADE;

2021-09-03 09:20:41.212 UTC [100] ERROR:  constraint "fk_retentionpoliciesteams_retentionpolicies" for relation "retentionpoliciesteams" already exists

2021-09-03 09:20:41.212 UTC [100] STATEMENT:  

		ALTER TABLE RetentionPoliciesTeams

		ADD CONSTRAINT FK_RetentionPoliciesTeams_RetentionPolicies

		FOREIGN KEY (PolicyId) REFERENCES RetentionPolicies (Id)

		ON DELETE CASCADE;

2021-09-03 09:20:48.339 UTC [105] ERROR:  duplicate key value violates unique constraint "users_username_key"

2021-09-03 09:20:48.339 UTC [105] DETAIL:  Key (username)=(surveybot) already exists.

2021-09-03 09:20:48.339 UTC [105] STATEMENT:  insert into "users" ("id","createat","updateat","deleteat","username","password","authdata","authservice","email","emailverified","nickname","firstname","lastname","position","roles","allowmarketing","props","notifyprops","lastpasswordupdate","lastpictureupdate","failedattempts","locale","timezone","mfaactive","mfasecret","remoteid") values ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22,$23,$24,$25,$26);

HTTPS_PROXY / HTTP_PROXY?

Hello

We are behind an outgoing proxy, and I suspect Mattermost not being able to connect to stuff

For example, docker logs mattermost :

{"timestamp":"2021-12-15 23:58:50.950 Z","level":"debug","msg":"ERROR: sending request - Post \"https://pdat.matterlytics.com/v1/batch\": context deadline exceeded (Client.Timeout exceeded while awaiting headers)","caller":"log/log.go:184","source":"rudder"}

I remember with a previous version of Mattermost (https://github.com/mattermost/mattermost-docker), I had to somehow configure outgoing http proxy. I precisely modified the Dockerfile to recompile it.

Please, what's the solution here?

Thanks!

Readonly on the Nginx with letsencrypt

Hello team,

I faced an error on the nginx container when I used letsencrypt service.

I need to remove readonly on the docker-compose.nginx.yml line 21 and line 22 or I can't start the nginx container as normal.

  nginx:
    depends_on:
      - mattermost
    container_name: nginx_mattermost
    image: nginx:${NGINX_IMAGE_TAG}
    restart: ${RESTART_POLICY}
    security_opt:
      - no-new-privileges:true
    pids_limit: 100
    # read_only: true
    tmpfs:
      - /var/run
      - /var/cache
      - /var/log/nginx
    volumes:
      - ${NGINX_CONFIG_PATH}:/etc/nginx/conf.d:ro
      - ${NGINX_DHPARAMS_FILE}:/dhparams4096.pem
      - ${CERT_PATH}:/cert.pem
      - ${KEY_PATH}:/key.pem
      - shared-webroot:/usr/share/nginx/html
    environment:
      # timezone inside container
      - TZ
    ports:
      - ${HTTPS_PORT}:443
      - ${HTTP_PORT}:80

Mmctl auth login issue

Fresh install of Mattermost v6.1.1 using docker with teams version. I have a need to delete a user and am trying to figure out mmctl

I enter into the container via:

docker exec -ti mattermost /bin/sh

and execute the following command:

mmctl auth login https://{my subdomain.domain} --name local-server --username {myusername}

results in:

Password:

I enter my password and this results with:

Post "https://{mydomain}/api/v4/users/login": dial tcp 127.0.1.1:443: connect: connection refused

I expect to be able to login with these steps.

Is there a quirk with this being docker and should I configure something further or is there a bug with latest version of mmctl?

incomplete documentation

please just include openssl clients for making a stupid self signed certificate so that people can AT LEAST use this for testing without screwing around

502 Bad Gateway problem

Maybe I'm just too stupid or too unexperienced with docker to get this to run OR it is a bug.

I tried every possible config combination but I can't get it to run.

I use this slight changed docker-compose.yml to get it all running and mattermost is the only service creating the 502 Error.

version: '3'

services:

  nginx-proxy:
    image: jwilder/nginx-proxy:latest
    labels:
      - "com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy=true"
    container_name: kollektiv-proxy
    networks:
      - kollektiv-cloud
    ports:
      - 80:80
      - 443:443
    volumes:
      - /data/kollektiv-cloud/nginx/vhost.d:/etc/nginx/vhost.d:rw
      - /data/kollektiv-cloud/nginx/html:/usr/share/nginx/html:rw
      - /data/kollektiv-cloud/nginx/certs:/etc/nginx/certs:ro
      - /etc/localtime:/etc/localtime:ro
      - /var/run/docker.sock:/tmp/docker.sock:ro
    restart: unless-stopped

  letsencrypt:
    image: jrcs/letsencrypt-nginx-proxy-companion:v1.12
    container_name: kollektiv-letsencrypt
    depends_on:
      - nginx-proxy
    networks:
      - kollektiv-cloud
    volumes:
      - /data/kollektiv-cloud/nginx/vhost.d:/etc/nginx/vhost.d:rw
      - /data/kollektiv-cloud/nginx/html:/usr/share/nginx/html:rw
      - /data/kollektiv-cloud/nginx/certs:/etc/nginx/certs:rw
      - /etc/localtime:/etc/localtime:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro
    restart: unless-stopped

  nextcloud-mysql:
    image: mariadb:10.4.10
    container_name: nextcloud-mysql
    networks:
      - kollektiv-cloud
    volumes:
      - /data/kollektiv-cloud/mysql:/var/lib/mysql
      - /etc/localtime:/etc/localtime:ro
    environment:
      - MYSQL_ROOT_PASSWORD=****
      - MYSQL_PASSWORD=****
      - MYSQL_DATABASE=kollektiv-db
      - MYSQL_USER=kollektiv-user
    restart: unless-stopped

  wordpress-mysql:
    image: mysql:5.7
    volumes:
      - /data/kollektiv-cloud/mysql-wordpress:/var/lib/mysql
      - /etc/localtime:/etc/localtime:ro
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=****
      - MYSQL_DATABASE=wordpress
      - MYSQL_USER=wordpress
      - MYSQL_PASSWORD=****
    container_name: wordpress_db
    networks: 
      - kollektiv-cloud

  postgres:
    container_name: postgres_mattermost
    image: postgres:13-alpine
    restart: unless-stopped
    security_opt:
      - no-new-privileges:true
    pids_limit: 100
    read_only: true
    tmpfs:
      - /tmp
      - /var/run/postgresql
    volumes:
      -  /data/kollektiv-cloud/var/lib/postgresql/data:/var/lib/postgresql/data
    environment:

      # necessay Postgres options/variables
      - POSTGRES_USER=mmuser
      - POSTGRES_PASSWORD=****
      - POSTGRES_DB=mattermost

  nextcloud-app:
    image: nextcloud:17.0.1-apache
    container_name: nextcloud-app
    networks:
      - kollektiv-cloud
    depends_on:
      - letsencrypt
      - nginx-proxy
      - nextcloud-mysql
    volumes:
      - /data/kollektiv-cloud/app/html:/var/www/html
      - /data/kollektiv-cloud/app/config:/var/www/html/config
      - /data/kollektiv-cloud/app/custom_apps:/var/www/html/custom_apps
      - /data/kollektiv-cloud/app/data:/var/www/html/data
      - /data/kollektiv-cloud/app/themes:/var/www/html/themes
      - /etc/localtime:/etc/localtime:ro
    environment:
      - VIRTUAL_HOST=next.kollektiv.cloud
      - LETSENCRYPT_HOST=next.kollektiv.cloud
      - [email protected]
    restart: unless-stopped

  wordpress:
    depends_on:
      - wordpress-mysql
      - letsencrypt
      - nginx-proxy
    image: wordpress:latest
    restart: always
    environment:
      - VIRTUAL_HOST=kollektiv.cloud
      - LETSENCRYPT_HOST=kollektiv.cloud
      - [email protected]
      - WORDPRESS_DB_HOST=wordpress-mysql
      - WORDPRESS_DB_USER=wordpress
      - WORDPRESS_DB_PASSWORD=****
      - WORDPRESS_DB_NAME=wordpress
    container_name: wordpress
    networks:
      - kollektiv-cloud

  mattermost:
    depends_on:
      - postgres
      - letsencrypt
      - nginx-proxy
    container_name: mattermost
    image: mattermost/mattermost-team-edition:latest
    restart: unless-stopped
    security_opt:
      - no-new-privileges:true
    pids_limit: 200
    read_only: true
    tmpfs:
      - /tmp
    volumes:
      - ./volumes/app/mattermost/config:/mattermost/config:rw
      - ./volumes/app/mattermost/data:/mattermost/data:rw
      - ./volumes/app/mattermost/logs:/mattermost/logs:rw
      - ./volumes/app/mattermost/plugins:/mattermost/plugins:rw
      - ./volumes/app/mattermost/client/plugins:/mattermost/client/plugins:rw
    environment:
      VIRTUAL_HOST: chat.kollektiv.cloud
      LETSENCRYPT_HOST: chat.kollektiv.cloud
      LETSENCRYPT_EMAIL: [email protected]

      # necessary Mattermost options/variables (see env.example)
      MM_SQLSETTINGS_DRIVERNAME: postgres
      MM_SQLSETTINGS_DATASOURCE: postgres://mmuser:****@postgres/mattermost?sslmode=disable&connect_timeout=10

      # additional settings
      MM_SERVICESETTINGS_SITEURL: https://chat.kollektiv.cloud


networks:
  kollektiv-cloud:

Readyonly app

Hello,

I tried to use this new docker setup (which is awesome btw, super clean) and at startup of Mattermost I had an error

2021-07-30T13:19:47.738Z        error   web/static.go:26        Failed to update assets subpath from config     {"error": "failed to update root.html with subpath /: open /mattermost/client/root.html: read-only file system", "errorVerbose": "open /mattermost/client/root.html: read-only file system\nfailed to update root.html with subpath /\ngithub.com/mattermost/mattermost-server/v5/utils.UpdateAssetsSubpathInDir\n\tgithub.com/mattermost/mattermost-server/v5/utils/subpath.go:117\ngithub.com/mattermost/mattermost-server/v5/utils.UpdateAssetsSubpath\n\tgithub.com/mattermost/mattermost-server/v5/utils/subpath.go:145\ngithub.com/mattermost/mattermost-server/v5/utils.UpdateAssetsSubpathFromConfig\n\tgithub.com/mattermost/mattermost-server/v5/utils/subpath.go:168\ngithub.com/mattermost/mattermost-server/v5/web.(*Web).InitStatic\n\tgithub.com/mattermost/mattermost-server/v5/web/static.go:25\ngithub.com/mattermost/mattermost-server/v5/web.New\n\tgithub.com/mattermost/mattermost-server/v5/web/web.go:36\ngithub.com/mattermost/mattermost-server/v5/cmd/mattermost/commands.runServer\n\tgithub.com/mattermost/mattermost-server/v5/cmd/mattermost/commands/server.go:101\ngithub.com/mattermost/mattermost-server/v5/cmd/mattermost/commands.serverCmdF\n\tgithub.com/mattermost/mattermost-server/v5/cmd/mattermost/commands/server.go:59\ngithub.com/spf13/cobra.(*Command).execute\n\tgithub.com/spf13/[email protected]/command.go:852\ngithub.com/spf13/cobra.(*Command).ExecuteC\n\tgithub.com/spf13/[email protected]/command.go:960\ngithub.com/spf13/cobra.(*Command).Execute\n\tgithub.com/spf13/[email protected]/command.go:897\ngithub.com/mattermost/mattermost-server/v5/cmd/mattermost/commands.Run\n\tgithub.com/mattermost/mattermost-server/v5/cmd/mattermost/commands/root.go:14\nmain.main\n\tgithub.com/mattermost/mattermost-server/v5/cmd/mattermost/main.go:31\nruntime.main\n\truntime/proc.go:204\nruntime.goexit\n\truntime/asm_amd64.s:1374"}

I fixed it by commenting out https://github.com/mattermost/docker/blob/main/docker-compose.yml#L37 not use if it's the right fix

Documentation on Mattermost migration

The documents use the simple export SQL and import SQL process. Also, provide the ways to migrate the files, plugins and configuration from the original mattermost/mattermost-docker repository to the mattermost/docker repository

Prepared

  1. App built via mattermost/mattermost-docker
  2. New App built via mattermost/docker

Steps

  1. Backup and dump the sql from the original mattermost/mattermost-docker Postgres service.
  2. Enable the new Postgres service from the mattermost/docker.
  3. Import the dumped SQL file into the Postgres service of mattermost/docker.
  4. Copy the matched volumes folder from the original mattermost/mattermost-docker to the mattermost/docker volumes folder.
  5. Restart the app from the mattermost/dockerversion
  6. Check the config.json and the settings.

Backup and dump the sql from the original mattermost/mattermost-docker version

  1. Enable the Postgres service from the original mattermost/mattermost-docker
docker-compose up -d db
  1. Dump from the original Postgres service.
docker exec -it mattermost-docker_db_1 pg_dump mattermost -U mmuser --no-privileges > dump.sql

Enable the new Postgres service from the mattermost/docker

  1. Enable the Postgres service from mattermost/docker.
docker-compose up -d postgres
  1. Remove the database and create a new one
docker exec -it postgres_mattermost dropdb mattermost -U mmuser
docker exec -it postgres_mattermost createdb mattermost -U mmuser

Import the dumped SQL file into the Postgres service of mattermost/docker

  1. Copy the dump.sql into the current mattermost/docker folder
  2. Import the dump SQL into the new database
docker exec -i postgres_mattermost psql -U mmuser -d mattermost < dump.sql

Copy the matched volumes folder from the original mattermost/mattermost-docker to the mattermost/docker volumes folder

  1. COPY mattermost-docker/volumes/app/mattermost/ TO docker/volumes/app/mattermost
  2. Change the client-plugins folder to clients/plugins
mv client-plugins clients/plugins
  1. Change the permission and owner
sudo chown -R 2000:2000 volumes

Restart the app from the mattermost/dockerversion

restart the app using the following command in mattermost/docker folder

sudo docker-compose -f docker-compose.yml -f docker-compose.nginx.yml up -d

Check the config.json and the admin settings.

Because of the SiteURL configuration and ListenAddress configuration in mattermost/docker are different from the original mattermost-docker version.

Therefore, please make sure the SiteURL and the ListenAddress matching the new environment or the mattermost service in mattermost/docker might not be enabled correctly.

docker compose install environments not found

Hello. when I run the script, it does not find the values of my .env file:

~/docker$ docker-compose -f docker-compose.yml -f docker-compose.without-nginx.yml up -d
WARNING: The POSTGRES_IMAGE_TAG variable is not set. Defaulting to a blank string.
WARNING: The RESTART_POLICY variable is not set. Defaulting to a blank string.
WARNING: The POSTGRES_DATA_PATH variable is not set. Defaulting to a blank string.
WARNING: The MATTERMOST_IMAGE variable is not set. Defaulting to a blank string.
WARNING: The MATTERMOST_IMAGE_TAG variable is not set. Defaulting to a blank string.
WARNING: The MATTERMOST_CONTAINER_READONLY variable is not set. Defaulting to a blank string.
ERROR: Error while attempting to convert service.mattermost.read_only to appropriate type: "" is not a valid boolean value

Running Ubuntu server 20.04, docker and docker-compose are latest versions.

Docker-compose file Version mismatch

user@test:~/docker/mattermost$ sudo docker-compose -f docker-compose.yml -f docker-compose.without-nginx.yml up -d
ERROR: Version mismatch: file ./docker-compose.yml specifies version 2.4 but extension file ./docker-compose.without-nginx.yml uses version 3.0

I changed docker-compose.without-nginx.yml version to 2.4 so it can proceed.

Postgres and Mattermost error

Hello,

I open this issue because when I check the docker-compose logs of my mattermost instance (version 5.38) I can see errors in Postgres and Mattermost.

Here is the output of docker-compose -f docker-compose.yml logs -f :

# docker-compose -f docker-compose.yml logs -f
Attaching to mattermost, postgres_mattermost
postgres_mattermost |
postgres_mattermost | PostgreSQL Database directory appears to contain a database; Skipping initialization
postgres_mattermost |
postgres_mattermost | 2021-11-08 13:59:23.648 UTC [1] LOG:  starting PostgreSQL 13.4 on x86_64-pc-linux-musl, compiled by gcc (Alpine 10.3.1_git20210424) 10.3.1 20210424, 64-bit
postgres_mattermost | 2021-11-08 13:59:23.648 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
postgres_mattermost | 2021-11-08 13:59:23.648 UTC [1] LOG:  listening on IPv6 address "::", port 5432
postgres_mattermost | 2021-11-08 13:59:23.649 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
postgres_mattermost | 2021-11-08 13:59:23.654 UTC [21] LOG:  database system was shut down at 2021-11-08 12:53:00 UTC
postgres_mattermost | 2021-11-08 13:59:23.660 UTC [1] LOG:  database system is ready to accept connections
postgres_mattermost | 2021-11-08 13:59:24.182 UTC [28] ERROR:  relation "idx_posts_channel_id" does not exist
postgres_mattermost | 2021-11-08 13:59:24.182 UTC [28] STATEMENT:  SELECT $1::regclass
postgres_mattermost | 2021-11-08 13:59:24.182 UTC [28] ERROR:  relation "idx_channels_name" does not exist
postgres_mattermost | 2021-11-08 13:59:24.182 UTC [28] STATEMENT:  SELECT $1::regclass
postgres_mattermost | 2021-11-08 13:59:24.183 UTC [28] ERROR:  relation "idx_publicchannels_name" does not exist
postgres_mattermost | 2021-11-08 13:59:24.183 UTC [28] STATEMENT:  SELECT $1::regclass
postgres_mattermost | 2021-11-08 13:59:24.183 UTC [28] ERROR:  relation "idx_channelmembers_channel_id" does not exist
postgres_mattermost | 2021-11-08 13:59:24.183 UTC [28] STATEMENT:  SELECT $1::regclass
postgres_mattermost | 2021-11-08 13:59:24.183 UTC [28] ERROR:  relation "idx_emoji_name" does not exist
postgres_mattermost | 2021-11-08 13:59:24.183 UTC [28] STATEMENT:  SELECT $1::regclass
postgres_mattermost | 2021-11-08 13:59:24.183 UTC [28] ERROR:  relation "idx_oauthaccessdata_client_id" does not exist
postgres_mattermost | 2021-11-08 13:59:24.183 UTC [28] STATEMENT:  SELECT $1::regclass
postgres_mattermost | 2021-11-08 13:59:24.183 UTC [28] ERROR:  relation "idx_oauthauthdata_client_id" does not exist
postgres_mattermost | 2021-11-08 13:59:24.183 UTC [28] STATEMENT:  SELECT $1::regclass
postgres_mattermost | 2021-11-08 13:59:24.184 UTC [28] ERROR:  relation "idx_preferences_user_id" does not exist
postgres_mattermost | 2021-11-08 13:59:24.184 UTC [28] STATEMENT:  SELECT $1::regclass
postgres_mattermost | 2021-11-08 13:59:24.184 UTC [28] ERROR:  relation "idx_notice_views_user_id" does not exist
postgres_mattermost | 2021-11-08 13:59:24.184 UTC [28] STATEMENT:  SELECT $1::regclass
postgres_mattermost | 2021-11-08 13:59:24.184 UTC [28] ERROR:  relation "idx_notice_views_user_notice" does not exist
postgres_mattermost | 2021-11-08 13:59:24.184 UTC [28] STATEMENT:  SELECT $1::regclass
postgres_mattermost | 2021-11-08 13:59:24.184 UTC [28] ERROR:  relation "idx_status_user_id" does not exist
postgres_mattermost | 2021-11-08 13:59:24.184 UTC [28] STATEMENT:  SELECT $1::regclass
postgres_mattermost | 2021-11-08 13:59:24.185 UTC [28] ERROR:  relation "idx_teammembers_team_id" does not exist
postgres_mattermost | 2021-11-08 13:59:24.185 UTC [28] STATEMENT:  SELECT $1::regclass
postgres_mattermost | 2021-11-08 13:59:24.185 UTC [28] ERROR:  relation "idx_teams_name" does not exist
postgres_mattermost | 2021-11-08 13:59:24.185 UTC [28] STATEMENT:  SELECT $1::regclass
postgres_mattermost | 2021-11-08 13:59:24.185 UTC [28] ERROR:  relation "idx_user_access_tokens_token" does not exist
postgres_mattermost | 2021-11-08 13:59:24.185 UTC [28] STATEMENT:  SELECT $1::regclass
postgres_mattermost | 2021-11-08 13:59:24.185 UTC [28] ERROR:  relation "idx_user_terms_of_service_user_id" does not exist
postgres_mattermost | 2021-11-08 13:59:24.185 UTC [28] STATEMENT:  SELECT $1::regclass
postgres_mattermost | 2021-11-08 13:59:24.185 UTC [28] ERROR:  relation "idx_users_email" does not exist
postgres_mattermost | 2021-11-08 13:59:24.185 UTC [28] STATEMENT:  SELECT $1::regclass
postgres_mattermost | 2021-11-08 13:59:24.186 UTC [28] ERROR:  relation "idx_sharedchannelusers_user_id" does not exist
postgres_mattermost | 2021-11-08 13:59:24.186 UTC [28] STATEMENT:  SELECT $1::regclass
postgres_mattermost | 2021-11-08 13:59:24.186 UTC [28] ERROR:  relation "idx_retentionpolicies_displayname_id" does not exist
postgres_mattermost | 2021-11-08 13:59:24.186 UTC [28] STATEMENT:  SELECT $1::regclass
postgres_mattermost | 2021-11-08 13:59:24.195 UTC [28] ERROR:  constraint "fk_retentionpolicieschannels_retentionpolicies" for relation "retentionpolicieschannels" already exists
postgres_mattermost | 2021-11-08 13:59:24.195 UTC [28] STATEMENT:
postgres_mattermost |           ALTER TABLE RetentionPoliciesChannels
postgres_mattermost |           ADD CONSTRAINT FK_RetentionPoliciesChannels_RetentionPolicies
postgres_mattermost |           FOREIGN KEY (PolicyId) REFERENCES RetentionPolicies (Id)
postgres_mattermost |           ON DELETE CASCADE;
postgres_mattermost | 2021-11-08 13:59:24.195 UTC [28] ERROR:  constraint "fk_retentionpoliciesteams_retentionpolicies" for relation "retentionpoliciesteams" already exists
postgres_mattermost | 2021-11-08 13:59:24.195 UTC [28] STATEMENT:
postgres_mattermost |           ALTER TABLE RetentionPoliciesTeams
postgres_mattermost |           ADD CONSTRAINT FK_RetentionPoliciesTeams_RetentionPolicies
postgres_mattermost |           FOREIGN KEY (PolicyId) REFERENCES RetentionPolicies (Id)
postgres_mattermost |           ON DELETE CASCADE;
mattermost    | {"level":"error","ts":1636379965.0950143,"caller":"app/plugin.go:320","msg":"Failed to sync plugin from file store","bundle":"plugins/com.mattermost.plugin-incident-management.tar.gz","error":"installExtractedPlugin: Unable to restart plugin on upgrade., a valid Mattermost Enterprise E20 license is required to use this plugin"}
mattermost    | {"level":"error","ts":1636379970.086079,"caller":"log/log.go:184","msg":"[ERR] plugin: plugin acceptAndServe error: timeout waiting for accept","source":"stdlog"}
mattermost    | {"level":"debug","ts":1636381998.905218,"caller":"app/notification.go:392","msg":"Notification not sent","logSource":"notifications","ackId":"","type":"message","userId":"dzthoyig53riicn68yreq5k1mc","postId":"58enoz9uy78q9mjj3nho73bpco","status":"Not Sent due to preferences"}

How can I solve the errors in Postgres ? and same for Plugins ?
I haven't installed any plugins and I'm using the mattermost-team-edition in version 5.38 (I did a migration from the previous repository)

Thank you very much.
Best regards,

Readme or upgrade instructions should mention the port change

legacy docker used port 8000, while this repository uses 8065. I now know this, because I found issues on this bug tracker that helped me. Nonetheless, that info would have been very helpful and I believe other people might run into the same upgrade-issue.

Question regarding Updates

Hi,
thanks for this amazing project!

I have question regarding the documentation of updating Mattermost.

The README states:

To update Mattermost to the latest version in this repo run the below commands. This will download a new image of the instance and update Mattermost.

## Based on what you followed in step 6
sudo docker-compose -f docker-compose.yml -f docker-compose.nginx.yml down
# OR
sudo docker-compose -f docker-compose.yml -f docker-compose.without-nginx.yml down

git pull  ## alternatively you can change the docker tag yourself as described below

sudo docker-compose -f docker-compose.yml -f docker-compose.nginx.yml up -d
## OR
sudo docker-compose -f docker-compose.yml -f docker-compose.without-nginx.yml up -d

I don't understand how this will update the container, since the docker tag is specified in the .env file, which is not updated by a git pull?

Thanks for helping me understand!

Regards

Question about switching from old git repo

Not really an issue, but i manually upgraded the database on my mattermost install of the old git repo that is deprecated, so my db is now on v13. Can I just update the images using this repo now then instead, without running the update script? Would assume so , as no db upgrade is needed. Just wanted to make sure,

My app version is 5.33.3 (enterprise).

Thanks,

Incorrect Client Plugin Volume

It looks like the client plugin is getting bound incorrectly:

- ${MATTERMOST_CLIENT_PLUGINS_PATH}:/mattermost/client-plugins:rw

Based on the volumes in the Dockerfile for both the official image and the community image, this should be /mattermost/client/plugins:
https://github.com/mattermost/mattermost-server/blob/e5386043453bc05264609f1a77fafb66aeea0857/build/Dockerfile#L50
https://github.com/mattermost/mattermost-docker/blob/ed8a619d3981060679afe80087f2e6a6be315b3c/app/Dockerfile#L57

It looks like the community version used client-plugins/ but mapped it to client/plugins/:
https://github.com/mattermost/mattermost-docker/blob/ed8a619d3981060679afe80087f2e6a6be315b3c/docker-compose.yml#L37

I'm no sure if it is preferable to just change the compose file to ${MATTERMOST_CLIENT_PLUGINS_PATH}:/mattermost/client/plugins:rw, or if MATTERMOST_CLIENT_PLUGINS_PATH should also be expanded out to ./volumes/app/mattermost/client/plugins, similar to how the DB data is in env.example.

POSTGRES_DATA_PATH=./volumes/db/var/lib/postgresql/data

How to map the docker's PUID:PGID (2000:2000) to a host user's PUID:PGID?

Hi,

I'm asking because in the old mattermost-docker's docker-compose.yml file, we had:

...
  app:
    build:
      context: app
      args:
         - edition=team
         - PUID=2000
         - PGID=2000

I had customized those numbers to 1000:1000 in mattermost/mattermost-docker.

And after migrating to mattermost/docker, I had various errors which appeared to be permission related.

So is there a way to map the UID:GID in this new docker?

Thanks!

ERROR: duplicate key value violates unique constraint "status_pkey"

After upgrading infinite of those errors show up, in addition to the previously occurring errors which the mattermost team said are 'normal' on the forum.

STATEMENT:  insert into "status" ("userid","status","manual","lastactivityat","dndendtime","prevstatus") values ($1,$2,$3,$4,$5,$6);
ERROR:  duplicate key value violates unique constraint "status_pkey"

While I'm at it, here's another error:

error   app/server.go:527       Mail server connection test is failed    {"error": "SendEmailNotifications is not true", "errorVerbose": "SendEmailNotifications is not true\ngith
ub.com/mattermost/mattermost-server/v5/shared/mail.TestConnection\n\tgithub.com/mattermost/mattermost-server/v5/shared/mail/mail.go:212\ngithub.com/mattermost/mattermost-server/v5/app.NewServer\n\tgithub.com/mattermost/matterm
ost-server/v5/app/server.go:526\ngithub.com/mattermost/mattermost-server/v5/cmd/mattermost/commands.runServer\n\tgithub.com/mattermost/mattermost-server/v5/cmd/mattermost/commands/server.go:75\ngithub.com/mattermost/mattermost
-server/v5/cmd/mattermost/commands.serverCmdF\n\tgithub.com/mattermost/mattermost-server/v5/cmd/mattermost/commands/server.go:59\ngithub.com/spf13/cobra.(*Command).execute\n\tgithub.com/spf13/[email protected]/command.go:852\ngithu
b.com/spf13/cobra.(*Command).ExecuteC\n\tgithub.com/spf13/[email protected]/command.go:960\ngithub.com/spf13/cobra.(*Command).Execute\n\tgithub.com/spf13/[email protected]/command.go:897\ngithub.com/mattermost/mattermost-server/v5/cmd/m
attermost/commands.Run\n\tgithub.com/mattermost/mattermost-server/v5/cmd/mattermost/commands/root.go:14\nmain.main\n\tgithub.com/mattermost/mattermost-server/v5/cmd/mattermost/main.go:31\nruntime.main\n\truntime/proc.go:204\nr
untime.goexit\n\truntime/asm_amd64.s:1374"}       

But wait, there's more!

termost-db | 2021-08-12 16:38:41.775 UTC [30] ERROR:  constraint "fk_retentionpolicieschannels_retentionpolici
es" for relation "retentionpolicieschannels" already exists
mattermost-db | 2021-08-12 16:38:41.775 UTC [30] STATEMENT:
mattermost-db |                 ALTER TABLE RetentionPoliciesChannels
mattermost-db |                 ADD CONSTRAINT FK_RetentionPoliciesChannels_RetentionPolicies
mattermost-db |                 FOREIGN KEY (PolicyId) REFERENCES RetentionPolicies (Id)
mattermost-db |                 ON DELETE CASCADE;                                                               mattermost-db | 2021-08-12 16:38:41.775 UTC [30] ERROR:  constraint "fk_retentionpoliciesteams_retentionpolicies$
 for relation "retentionpoliciesteams" already exists                                                            mattermost-db | 2021-08-12 16:38:41.775 UTC [30] STATEMENT:
mattermost-db |                 ALTER TABLE RetentionPoliciesTeams                                               mattermost-db |                 ADD CONSTRAINT FK_RetentionPoliciesTeams_RetentionPolicies
mattermost-db |                 FOREIGN KEY (PolicyId) REFERENCES RetentionPolicies (Id)                         mattermost-db |                 ON DELETE CASCADE;

Could someone finally deal with this please?
There is no point to having an error log if it spams thousands of errors. On the forum you previously said 'it's normal, ignore' and I did so, but now the new error literally spams dozens of times per second.

Fellow upgraders also note that the port changed from 8000 to 8065, you have to edit that in the mm config file.

For the record: previous version was 5.37 via the old method, new one via the prebuilt images is 5.37.1.

upgrading to 5.39 fails due to bleve

I had 5.38.2 up and running, no issues. Decided to upgrade to 5.39 as it was called a "quality release"... ;-) (well, I always prefer to be on the bleeding edge of technologies).
Performed "down" with compose, copied full directory where MTM lives just to back it up, changed tag to 5.39.0 in the .env, performed "up -d" with compose.
It got stuck on "starting bleve" (as per logs). I put it down back, and disabled bleve in config.json.
After that MTM started ok. I went to system console and enabled bleve back again. Dropped indexes, now indexing...

Post mattermost-docker migration minor issue with docker container health

Hey Mattermost team, great work!

I was on mattermost-docker up until now. I had used the early version of the upgrade script to get my postgres instance onto version 13.2 and all has been well.

I saw the movement towards this repo as the main docker repo and so I wanted to migrate over. I upgraded my mattermost-docker instance up to version 5.39, the latest, and that started up just fine.

Then rysnc'd my volumes directory from mattermost-docker to this repos volumes directory. I set up tthe .env witth all the old settings for the postgres username, database name, and password. The postgres database started okay, but the new mattermost docker was having errors about my postgres user not being able to authenticate of course causing mattermost to not start up.

I noticed a small discrepancy in the way the database directories were set between the 2 repos.

The new docker repo (this one) had the path being passed into the container like this:
./volumes/db/var/lib/postgresql/data:/var/lib/postgresql/data

However, with the upgrade script I used from the other repo on the mass thread about the postgres migrations has it set like this:
./volumes/db/13/data:/var/lib/postgresql/data

So, I ended up just updating my .env file from this new repo to have this instead:
POSTGRES_DATA_PATH=./volumes/db/13/data

So now the containers both start up, and it appears to be working just fine. However, the docker container for mattermost reports that it's state is "unhealthy".

Admittedly postgres is not my strong suite when it comes to databases. Should I do it differently somehow? Maybe copy the data from ./volumes/db/13/data to ./volumes/db/var/lib/postgresql/data?

Again, everything is working and I can't tell why the container reports as unhealthy, thus why I call it a minor issue. I'm just concerned there might be underlying issues I'm not seeing yet.

Any suggestions, concerns, thoughts?

Unable to save SMTP Settings

Tag : Master
After filling 'System Console -> Environment -> SMTP' and while testing, it do not save the information. It always use some default value for testing SMTP.

Connection unsuccessful: Connection unsuccessful: failed to set the to address: 550 Verification failed for <[email protected]> The mail server does not recognize [email protected] as a valid sender. Sender verify failed

HTTP_PROXY and uploading files error

I expect that I can upload files into channels.

But it is not working. I get the following in GUI:

Es gab ein Problem beim Hochladen ihrer Dateien.
There was a problem uploading your files. (translated)

I don't see any errors in my logs.

I use http proxy.

~/.docker/config.json

{
    "HttpHeaders": {
        "User-Agent": "Docker-Client/19.03.12 (linux)"
    },
    "proxies": {
        "default": {
            "httpProxy": "http://corporate.proxy.test:1234",
            "httpsProxy": "http://corporate.proxy.test:1234",
            "noProxy": "localhost,10.0.0.0/8,127.0.0.0/8,169.254.0.0/16,172.16.0.0/12,192.168.0.0/16,*.local"
        }
    }
}

Can you please tell me how to fix this problem?

I might start my server in a http proxy free environment and see if the error is gone. Later.

nginx misconfiguration

While troubleshooting an error related to safari users not being able to resolve the site in browser, I came to find that the nginx configuration needs tweaking.

First, I found that there was an error in the nginx logs.

The command docker exec -ti nginx_mattermost watch cat /var/log/nginx/error.log

I kept seeing the error:

No resolver defined to resolve r3.o.lencr.org while requesting certificate status, responder: r3.o.lencr.org

Based on replies to this thread here it seems this is related to OSCP. I notice the latest commit with this file comments out the resolver 1.1.1.1 line. Was this a regressive move?

I've tried to modify the nginx default.conf file unsuccessfully so far.

Using the default config and issuing docker exec -ti nginx_mattermost nginx -t -c /etc/nginx/conf.d/default.conf results in:

nginx: [emerg] "proxy_cache_path" directive is not allowed here in /etc/nginx/conf.d/default.conf:6
nginx: configuration file /etc/nginx/conf.d/default.conf test failed

This brings me to try many variations so far all unsuccessful. Interestingly, this failed config somehow doesn't result in a reboot loop and the image does run as-is.

I'm requesting someone look into the standard docker nginx config. Why was the resolver removed, why does the default config fail, and what should be shifted to ensure the correct configuration passes nginx config test?

Fix typo for TimeZone in compose file

Hello @metanerd , @mrckndt , @cpanato
This issue is to fixe the TimeZone in the compose file that is not valid due to a typo in docker-compose files. (introduced by my previous PR #52 ) verry sorry.

Use : docker-compose -f docker-compose.yml -f docker-compose.nginx.yml config to validate

# docker-compose -f docker-compose.yml -f docker-compose.nginx.yml config
ERROR: The Compose file './docker-compose.yml' is invalid because:
services.mattermost.environment contains {"TZ": "UTC"}, which is an invalid type, it should be a string
services.postgres.environment contains {"TZ": "UTC"}, which is an invalid type, it should be a string

Upgrade script fails if mattermost-docker is used with .env

While migrating to the new PostgreSQL and Mattermost versions using the upgrade-from-mattermost-docker.sh script, we encountered a problem with the parsed environment variables. The docker command to upgrade the db at L179-L186 of the script fails with the following message:

initdb: option requires an argument -- 'U'

This is only an assumption as we haven't been reproducing this error, but we guess that the problem lies in having used variables from .env with mattermost-docker like this:

environment:
  - POSTGRES_USER=${POSTGRES_USER}
  - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
  - POSTGRES_DB=${POSTGRES_DB}

So when exporting the variables in the shell the docker command worked as expected.

Thanks a lot for the great work you put into restructuring the docker setup for mattermost.

services.mattermost.environment.0 must be a string

The environment variable TZ cause the docker-compose yaml file typo error.

How to reproduce

  1. Git pull the latest code from main branch of the repo.
  2. Copy from the env.example to .env file.
  3. Use command docker-compose -f docker-compose.yml -f docker-compose.nginx.yml up -d to download and enable the containers.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.