5 changed files with 220 additions and 0 deletions
@ -0,0 +1,56 @@
@@ -0,0 +1,56 @@
|
||||
FROM alpine:3.10 |
||||
|
||||
# Some ENV variables |
||||
ENV PATH="/mattermost/bin:${PATH}" |
||||
ENV MM_VERSION=5.27.0 |
||||
|
||||
# Build argument to set Mattermost edition |
||||
ARG edition=enterprise |
||||
ARG PUID=2000 |
||||
ARG PGID=2000 |
||||
ARG MM_BINARY= |
||||
|
||||
|
||||
# Install some needed packages |
||||
RUN apk add --no-cache \ |
||||
ca-certificates \ |
||||
curl \ |
||||
jq \ |
||||
libc6-compat \ |
||||
libffi-dev \ |
||||
libcap \ |
||||
linux-headers \ |
||||
mailcap \ |
||||
netcat-openbsd \ |
||||
xmlsec-dev \ |
||||
tzdata \ |
||||
&& rm -rf /tmp/* |
||||
|
||||
# Get Mattermost |
||||
RUN mkdir -p /mattermost/data /mattermost/plugins /mattermost/client/plugins \ |
||||
&& if [ ! -z "$MM_BINARY" ]; then curl $MM_BINARY | tar -xvz ; \ |
||||
elif [ "$edition" = "team" ] ; then curl https://releases.mattermost.com/$MM_VERSION/mattermost-team-$MM_VERSION-linux-amd64.tar.gz?src=docker-app | tar -xvz ; \ |
||||
else curl https://releases.mattermost.com/$MM_VERSION/mattermost-$MM_VERSION-linux-amd64.tar.gz?src=docker-app | tar -xvz ; fi \ |
||||
&& cp /mattermost/config/config.json /config.json.save \ |
||||
&& rm -rf /mattermost/config/config.json \ |
||||
&& addgroup -g ${PGID} mattermost \ |
||||
&& adduser -D -u ${PUID} -G mattermost -h /mattermost -D mattermost \ |
||||
&& chown -R mattermost:mattermost /mattermost /config.json.save /mattermost/plugins /mattermost/client/plugins \ |
||||
&& setcap cap_net_bind_service=+ep /mattermost/bin/mattermost |
||||
|
||||
USER mattermost |
||||
|
||||
#Healthcheck to make sure container is ready |
||||
HEALTHCHECK CMD curl --fail http://localhost:8000 || exit 1 |
||||
|
||||
# Configure entrypoint and command |
||||
COPY entrypoint.sh / |
||||
ENTRYPOINT ["/entrypoint.sh"] |
||||
WORKDIR /mattermost |
||||
CMD ["mattermost"] |
||||
|
||||
# Expose port 8000 of the container |
||||
EXPOSE 8000 |
||||
|
||||
# Declare volumes for mount point directories |
||||
VOLUME ["/mattermost/data", "/mattermost/logs", "/mattermost/config", "/mattermost/plugins", "/mattermost/client/plugins"] |
||||
@ -0,0 +1,74 @@
@@ -0,0 +1,74 @@
|
||||
#!/bin/sh |
||||
|
||||
# Function to generate a random salt |
||||
generate_salt() { |
||||
tr -dc 'a-zA-Z0-9' < /dev/urandom | fold -w 48 | head -n 1 |
||||
} |
||||
|
||||
# Read environment variables or set default values |
||||
DB_HOST=${DB_HOST:-db} |
||||
DB_PORT_NUMBER=${DB_PORT_NUMBER:-5432} |
||||
MM_DBNAME=${MM_DBNAME:-mattermost} |
||||
MM_CONFIG=${MM_CONFIG:-/mattermost/config/config.json} |
||||
|
||||
if [ "${1:0:1}" = '-' ]; then |
||||
set -- mattermost "$@" |
||||
fi |
||||
|
||||
if [ "$1" = 'mattermost' ]; then |
||||
# Check CLI args for a -config option |
||||
for ARG in $@; |
||||
do |
||||
case "$ARG" in |
||||
-config=*) |
||||
MM_CONFIG=${ARG#*=};; |
||||
esac |
||||
done |
||||
|
||||
if [ ! -f "$MM_CONFIG" ]; then |
||||
# If there is no configuration file, create it with some default values |
||||
echo "No configuration file" $MM_CONFIG |
||||
echo "Creating a new one" |
||||
# Copy default configuration file |
||||
cp /config.json.save "$MM_CONFIG" |
||||
# Substitute some parameters with jq |
||||
jq '.ServiceSettings.ListenAddress = ":8000"' $MM_CONFIG > $MM_CONFIG.tmp && mv $MM_CONFIG.tmp $MM_CONFIG |
||||
jq '.LogSettings.EnableConsole = true' $MM_CONFIG > $MM_CONFIG.tmp && mv $MM_CONFIG.tmp $MM_CONFIG |
||||
jq '.LogSettings.ConsoleLevel = "ERROR"' $MM_CONFIG > $MM_CONFIG.tmp && mv $MM_CONFIG.tmp $MM_CONFIG |
||||
jq '.FileSettings.Directory = "/mattermost/data/"' $MM_CONFIG > $MM_CONFIG.tmp && mv $MM_CONFIG.tmp $MM_CONFIG |
||||
jq '.FileSettings.EnablePublicLink = true' $MM_CONFIG > $MM_CONFIG.tmp && mv $MM_CONFIG.tmp $MM_CONFIG |
||||
jq '.FileSettings.PublicLinkSalt = "'$(generate_salt)'"' $MM_CONFIG > $MM_CONFIG.tmp && mv $MM_CONFIG.tmp $MM_CONFIG |
||||
jq '.EmailSettings.SendEmailNotifications = false' $MM_CONFIG > $MM_CONFIG.tmp && mv $MM_CONFIG.tmp $MM_CONFIG |
||||
jq '.EmailSettings.FeedbackEmail = ""' $MM_CONFIG > $MM_CONFIG.tmp && mv $MM_CONFIG.tmp $MM_CONFIG |
||||
jq '.EmailSettings.SMTPServer = ""' $MM_CONFIG > $MM_CONFIG.tmp && mv $MM_CONFIG.tmp $MM_CONFIG |
||||
jq '.EmailSettings.SMTPPort = ""' $MM_CONFIG > $MM_CONFIG.tmp && mv $MM_CONFIG.tmp $MM_CONFIG |
||||
jq '.EmailSettings.InviteSalt = "'$(generate_salt)'"' $MM_CONFIG > $MM_CONFIG.tmp && mv $MM_CONFIG.tmp $MM_CONFIG |
||||
jq '.EmailSettings.PasswordResetSalt = "'$(generate_salt)'"' $MM_CONFIG > $MM_CONFIG.tmp && mv $MM_CONFIG.tmp $MM_CONFIG |
||||
jq '.RateLimitSettings.Enable = true' $MM_CONFIG > $MM_CONFIG.tmp && mv $MM_CONFIG.tmp $MM_CONFIG |
||||
jq '.SqlSettings.DriverName = "postgres"' $MM_CONFIG > $MM_CONFIG.tmp && mv $MM_CONFIG.tmp $MM_CONFIG |
||||
jq '.SqlSettings.AtRestEncryptKey = "'$(generate_salt)'"' $MM_CONFIG > $MM_CONFIG.tmp && mv $MM_CONFIG.tmp $MM_CONFIG |
||||
jq '.PluginSettings.Directory = "/mattermost/plugins/"' $MM_CONFIG > $MM_CONFIG.tmp && mv $MM_CONFIG.tmp $MM_CONFIG |
||||
else |
||||
echo "Using existing config file $MM_CONFIG" |
||||
fi |
||||
|
||||
# Configure database access |
||||
if [[ -z "$MM_SQLSETTINGS_DATASOURCE" && ! -z "$MM_USERNAME" && ! -z "$MM_PASSWORD" ]] |
||||
then |
||||
echo -ne "Configure database connection..." |
||||
# URLEncode the password, allowing for special characters |
||||
ENCODED_PASSWORD=$(printf %s $MM_PASSWORD | jq -s -R -r @uri) |
||||
export MM_SQLSETTINGS_DATASOURCE="postgres://$MM_USERNAME:$ENCODED_PASSWORD@$DB_HOST:$DB_PORT_NUMBER/$MM_DBNAME?sslmode=disable&connect_timeout=10" |
||||
echo "OK" |
||||
else |
||||
echo "Using existing database connection" |
||||
fi |
||||
|
||||
# Wait another second for the database to be properly started. |
||||
# Necessary to avoid "panic: Failed to open sql connection pq: the database system is starting up" |
||||
sleep 1 |
||||
|
||||
echo "Starting mattermost" |
||||
fi |
||||
|
||||
exec "$@" |
||||
@ -0,0 +1,79 @@
@@ -0,0 +1,79 @@
|
||||
version: "3" |
||||
|
||||
services: |
||||
|
||||
db: |
||||
build: db |
||||
read_only: true |
||||
restart: unless-stopped |
||||
volumes: |
||||
- ../../mistborn_volumes/extra/mattermost/db/var/lib/postgresql/data:/var/lib/postgresql/data |
||||
- /etc/localtime:/etc/localtime:ro |
||||
env_file: |
||||
- ../.envs/.production/.mattermost |
||||
#environment: |
||||
# - POSTGRES_USER=mmuser |
||||
# - POSTGRES_PASSWORD=mmuser_password |
||||
# - POSTGRES_DB=mattermost |
||||
# uncomment the following to enable backup |
||||
# - AWS_ACCESS_KEY_ID=XXXX |
||||
# - AWS_SECRET_ACCESS_KEY=XXXX |
||||
# - WALE_S3_PREFIX=s3://BUCKET_NAME/PATH |
||||
# - AWS_REGION=us-east-1 |
||||
|
||||
app: |
||||
build: |
||||
context: compose/production/mattermost #app |
||||
# uncomment following lines for team edition or change UID/GID |
||||
args: |
||||
- edition=team |
||||
- PUID=1000 |
||||
- PGID=1000 |
||||
restart: unless-stopped |
||||
volumes: |
||||
- ../../mistborn_volumes/extra/mattermost/app/mattermost/config:/mattermost/config:rw |
||||
- ../../mistborn_volumes/extra/mattermost/app/mattermost/data:/mattermost/data:rw |
||||
- ../../mistborn_volumes/extra/mattermost/app/mattermost/logs:/mattermost/logs:rw |
||||
- ../../mistborn_volumes/extra/mattermost/app/mattermost/plugins:/mattermost/plugins:rw |
||||
- ../../mistborn_volumes/extra/mattermost/app/mattermost/client-plugins:/mattermost/client/plugins:rw |
||||
- /etc/localtime:/etc/localtime:ro |
||||
# 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) |
||||
# - <path_to_your_gitlab_pki>/pki_chain.pem:/etc/ssl/certs/pki_chain.pem:ro |
||||
env_file: |
||||
- ../.envs/.production/.mattermost |
||||
environment: |
||||
# set same as db credentials and dbname |
||||
#- MM_USERNAME=mmuser |
||||
#- MM_PASSWORD=mmuser_password |
||||
#- MM_DBNAME=mattermost |
||||
|
||||
# use the credentials you've set above, in the format: |
||||
# MM_SQLSETTINGS_DATASOURCE=postgres://${MM_USERNAME}:${MM_PASSWORD}@db:5432/${MM_DBNAME}?sslmode=disable&connect_timeout=10 |
||||
#- MM_SQLSETTINGS_DATASOURCE=postgres://mmuser:mmuser_password@db:5432/mattermost?sslmode=disable&connect_timeout=10 |
||||
- MM_SQLSETTINGS_DATASOURCE=postgres://${MM_USERNAME}:${MM_PASSWORD}@db:5432/${MM_DBNAME}?sslmode=disable&connect_timeout=10 |
||||
|
||||
# in case your config is not in default location |
||||
#- MM_CONFIG=/mattermost/config/config.json |
||||
|
||||
web: |
||||
build: web |
||||
#ports: |
||||
# - "80:80" |
||||
# - "443:443" |
||||
labels: |
||||
- "traefik.enable=true" |
||||
- "traefik.http.routers.mattermost-http.rule=Host(`mattermost.mistborn`)" |
||||
- "traefik.http.routers.mattermost-http.entrypoints=web" |
||||
- "traefik.http.routers.mattermost-http.middlewares=mistborn_auth@file" |
||||
- "traefik.http.routers.mattermost-https.rule=Host(`mattermost.mistborn`)" |
||||
- "traefik.http.routers.mattermost-https.entrypoints=websecure" |
||||
- "traefik.http.routers.mattermost-https.middlewares=mistborn_auth@file" |
||||
- "traefik.http.routers.mattermost-https.tls.certresolver=basic" |
||||
- "traefik.http.services.mattermost-service.loadbalancer.server.port=80" |
||||
read_only: true |
||||
restart: unless-stopped |
||||
volumes: |
||||
# This directory must have cert files if you want to enable SSL |
||||
#- ./volumes/web/cert:/cert:ro |
||||
- /etc/localtime:/etc/localtime:ro |
||||
Loading…
Reference in new issue