mirror of
https://github.com/mattermost/mattermost.git
synced 2025-02-25 18:55:24 -06:00
Merge release branch 'release-1.0.0'
This commit is contained in:
@@ -52,10 +52,12 @@ There are multiple ways to install Mattermost depending on your needs.
|
||||
|
||||
[](https://travis-ci.org/mattermost/platform)
|
||||
|
||||
#### Production Deployment (for Beta2 and later)
|
||||
#### Production Deployment
|
||||
|
||||
Prior to production installation, please review [Mattermost system requirements](doc/install/requirements.md).
|
||||
|
||||
- [Production Install on Ubuntu 14.04](https://github.com/mattermost/platform/blob/release-1.0.0/doc/install/prod-ubuntu.md) - Install Mattermost for production environments.
|
||||
|
||||
- [GitLab Mattermost Production Installation](https://gitlab.com/gitlab-org/gitlab-mattermost) - Install Mattermost for production environments bundled with GitLab, a leading open source Git repository, using an omnibus package for Ubuntu 12.04, Ubuntu 14.04, Debian 7, Debian 8, and CentOS 6 (and RedHat/Oracle/Scientific Linux 6), CentOS 7 (and RedHat/Oracle/Scientific Linux 7).
|
||||
|
||||
For technical questions and answers, please visit the [Mattermost forum](http://forum.mattermost.org).
|
||||
|
||||
@@ -198,7 +198,7 @@ func CreateUser(c *Context, team *model.Team, user *model.User) *model.User {
|
||||
l4g.Error("Encountered an issue joining default channels user_id=%s, team_id=%s, err=%v", ruser.Id, ruser.TeamId, err)
|
||||
}
|
||||
|
||||
fireAndForgetWelcomeEmail(ruser.Email, team.DisplayName, c.GetTeamURLFromTeam(team))
|
||||
fireAndForgetWelcomeEmail(ruser.Email, team.DisplayName, c.GetSiteURL(), c.GetTeamURLFromTeam(team))
|
||||
if user.EmailVerified {
|
||||
if cresult := <-Srv.Store.User().VerifyEmail(ruser.Id); cresult.Err != nil {
|
||||
l4g.Error("Failed to set email verified err=%v", cresult.Err)
|
||||
@@ -218,12 +218,13 @@ func CreateUser(c *Context, team *model.Team, user *model.User) *model.User {
|
||||
}
|
||||
}
|
||||
|
||||
func fireAndForgetWelcomeEmail(email, teamDisplayName, teamURL string) {
|
||||
func fireAndForgetWelcomeEmail(email, teamDisplayName, siteURL, teamURL string) {
|
||||
go func() {
|
||||
|
||||
subjectPage := NewServerTemplatePage("welcome_subject")
|
||||
subjectPage.Props["TeamDisplayName"] = teamDisplayName
|
||||
bodyPage := NewServerTemplatePage("welcome_body")
|
||||
bodyPage.Props["SiteURL"] = siteURL
|
||||
bodyPage.Props["TeamURL"] = teamURL
|
||||
|
||||
if err := utils.SendMail(email, subjectPage.Render(), bodyPage.Render()); err != nil {
|
||||
|
||||
187
doc/install/prod-ubuntu.md
Normal file
187
doc/install/prod-ubuntu.md
Normal file
@@ -0,0 +1,187 @@
|
||||
# Production Installation on Ubuntu 14.04 LTS
|
||||
|
||||
## Install Ubuntu Server 14.04 LTS
|
||||
1. Set up 3 machines with Ubuntu 14.04 with 2GB of RAM or more. The servers will be used for the Load Balancer, Mattermost, and Database.
|
||||
1. Make sure the system is up to date with the most recent security patches.
|
||||
* ``` sudo apt-get update```
|
||||
* ``` sudo apt-get upgrade```
|
||||
|
||||
## Setup Database Server
|
||||
1. For the purposes of this guide we will assume this server has an IP address of 10.10.10.1
|
||||
1. Install PostgreSQL 9.3+ (or MySQL 5.2+)
|
||||
* ``` sudo apt-get install postgresql postgresql-contrib```
|
||||
1. PostgreSQL created a user account called `postgres`. You will need to log into that account with:
|
||||
* ``` sudo -i -u postgres```
|
||||
1. You can get a PostgreSQL prompt by typing:
|
||||
* ``` psql```
|
||||
1. Create the Mattermost database by typing:
|
||||
* ```postgres=# CREATE DATABASE mattermost;```
|
||||
1. Create the Mattermost user by typing:
|
||||
* ```postgres=# CREATE USER mmuser WITH PASSWORD 'mmuser_password';```
|
||||
1. Grant the user access to the Mattermost database by typing:
|
||||
* ```postgres=# GRANT ALL PRIVILEGES ON DATABASE mattermost to mmuser;```
|
||||
1. You can exit out of PostgreSQL by typing:
|
||||
* ```postgre=# \q```
|
||||
1. You can exit the postgres account by typing:
|
||||
* ``` exit```
|
||||
|
||||
## Setup Mattermost Server
|
||||
1. For the purposes of this guide we will assume this server has an IP address of 10.10.10.2
|
||||
1. Download the latest Mattermost Server by typing:
|
||||
* ``` wget https://github.com/mattermost/platform/releases/download/v1.0.0/mattermost.tar.gz```
|
||||
1. Unzip the Mattermost Server by typing:
|
||||
* ``` tar -xvzf mattermost.tar.gz```
|
||||
1. For the sake of making this guide simple we located the files at `/home/ubuntu/mattermost`, in the future we will give guidance for storing under `/opt`.
|
||||
1. We have also elected to run the Mattermost Server as the `ubuntu` account for simplicity. We recommend settings up and running the service under a `mattermost` user account with limited permissions.
|
||||
1. Create the storage directory for files. We assume you will have attached a large drive for storage of images and files. For this setup we will assume the directory is located at `/mattermost/data`.
|
||||
* Create the directory by typing:
|
||||
* ``` sudo mkdir -p /mattermost/data```
|
||||
* Set the ubuntu account as the directory owner by typing:
|
||||
* ``` sudo chown -R ubuntu /mattermost```
|
||||
1. Configure Mattermost Server by editing the config.json file at /home/ubuntu/mattermost/config`
|
||||
* ``` cd ~/mattermost/config```
|
||||
* Edit the file by typing:
|
||||
* ``` vi config.json```
|
||||
* replace `DriverName": "mysql"` with `DriverName": "postgres"`
|
||||
* replace `"DataSource": "mmuser:mostest@tcp(dockerhost:3306)/mattermost_test?charset=utf8mb4,utf8"` with `"DataSource": "postgres://mmuser:mmuser_password@10.10.10.1:5432/mattermost?sslmode=disable&connect_timeout=10"`
|
||||
* Optionally you may continue to edit configuration settings in `config.json` or use the System Console described in a later section to finish the configuration.
|
||||
1. Test the Mattermost Server
|
||||
* ``` cd ~/mattermost/bin```
|
||||
* Run the Mattermost Server by typing:
|
||||
* ``` ./platform```
|
||||
* You should see a console log like `Server is listening on :8065` letting you know the service is running.
|
||||
* Stop the server for now by typing `ctrl-c`
|
||||
1. Setup Mattermost to use the Ubuntu Upstart daemon which handles supervision of the Mattermost process.
|
||||
* ``` sudo touch /etc/init/mattermost.conf```
|
||||
* ``` sudo vi /etc/init/mattermost.conf```
|
||||
* Copy the following lines into `/etc/init/mattermost.conf`
|
||||
```
|
||||
start on runlevel [2345]
|
||||
stop on runlevel [016]
|
||||
respawn
|
||||
chdir /home/ubuntu/mattermost
|
||||
setuid ubuntu
|
||||
exec bin/platform
|
||||
```
|
||||
* You can manage the process by typing:
|
||||
* ``` sudo start mattermost```
|
||||
* Verify the service is running by typing:
|
||||
* ``` curl http://10.10.10.2:8065```
|
||||
* You should see a page titles *Mattermost - Signup*
|
||||
* You can also stop the process by running the command ` sudo stop mattermost`, but we will skip this step for now.
|
||||
|
||||
## Setup Nginx Server
|
||||
1. For the purposes of this guide we will assume this server has an IP address of 10.10.10.3
|
||||
1. We use Nginx for proxying request to the Mattermost Server. The main benefits are:
|
||||
* SSL termination
|
||||
* http to https redirect
|
||||
* Port mapping :80 to :8065
|
||||
* Standard request logs
|
||||
1. Install Nginx on Ubuntu with
|
||||
* ``` sudo apt-get install nginx```
|
||||
1. Verify Nginx is running
|
||||
* ``` curl http://10.10.10.3```
|
||||
* You should see a *Welcome to nginx!* page
|
||||
1. You can manage Nginx with the following commands
|
||||
* ``` sudo service nginx stop```
|
||||
* ``` sudo service nginx start```
|
||||
* ``` sudo service nginx restart```
|
||||
1. Map a FQDN (fully qualified domain name) like **mattermost.example.com** to point to the Nginx server.
|
||||
1. Configure Nginx to proxy connections from the internet to the Mattermost Server
|
||||
* Create a configuration for Mattermost
|
||||
* ``` sudo touch /etc/nginx/sites-available/mattermost```
|
||||
* Below is a sample configuration with the minimum settings required to configure Mattermost.
|
||||
*
|
||||
```
|
||||
server {
|
||||
server_name mattermost.example.com;
|
||||
location / {
|
||||
client_max_body_size 50M;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
proxy_set_header Host $http_host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_set_header X-Frame-Options SAMEORIGIN;
|
||||
proxy_pass http://localhost:8065;
|
||||
}
|
||||
}
|
||||
```
|
||||
* Remove the existing file with
|
||||
* ``` sudo rm /etc/nginx/sites-enabled/default```
|
||||
* Link the mattermost config by typing:
|
||||
* ```sudo ln -s /etc/nginx/sites-available/mattermost /etc/nginx/sites-enabled/mattermost```
|
||||
* Restart Nginx by typing:
|
||||
* ``` sudo service nginx restart```
|
||||
* Verify you can see Mattermost thru the proxy by typing:
|
||||
* ``` curl http://localhost```
|
||||
* You should see a page titles *Mattermost - Signup*
|
||||
|
||||
## Setup Nginx with SSL (Recommended)
|
||||
1. You will need a SSL cert from a certificate authority.
|
||||
1. For simplicity we will generate a test certificate.
|
||||
* ``` mkdir ~/cert```
|
||||
* ``` cd ~/cert```
|
||||
* ``` sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout mattermost.key -out mattermost.crt```
|
||||
* Input the following info
|
||||
```
|
||||
Country Name (2 letter code) [AU]:US
|
||||
State or Province Name (full name) [Some-State]:California
|
||||
Locality Name (eg, city) []:Palo Alto
|
||||
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Example LLC
|
||||
Organizational Unit Name (eg, section) []:
|
||||
Common Name (e.g. server FQDN or YOUR name) []:mattermost.example.com
|
||||
Email Address []:admin@mattermost.example.com
|
||||
```
|
||||
1. Modify the file at `/etc/nginx/sites-available/mattermost` and add the following lines
|
||||
*
|
||||
```
|
||||
server {
|
||||
listen 80;
|
||||
server_name mattermost.example.com;
|
||||
return 301 https://$server_name$request_uri;
|
||||
}
|
||||
|
||||
server {
|
||||
listen 443 ssl;
|
||||
server_name mattermost.example.com;
|
||||
|
||||
ssl on;
|
||||
ssl_certificate /home/ubuntu/cert/mattermost.crt;
|
||||
ssl_certificate_key /home/ubuntu/cert/mattermost.key;
|
||||
ssl_session_timeout 5m;
|
||||
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
|
||||
ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES";
|
||||
ssl_prefer_server_ciphers on;
|
||||
|
||||
# add to location / above
|
||||
location / {
|
||||
gzip off;
|
||||
proxy_set_header X-Forwarded-Ssl on;
|
||||
```
|
||||
## Finish Mattermost Server setup
|
||||
1. Navigate to https://mattermost.example.com and create a team and user.
|
||||
1. The first user in the system is automatically granted the `system_admin` role, which gives you access to the System Console.
|
||||
1. From the `town-square` channel click the dropdown and choose the `System Console` option
|
||||
1. Update Email Settings. We recommend using an email sending service. The example below assumes AmazonSES.
|
||||
* Set *Send Email Notifications* to true
|
||||
* Set *Require Email Verification* to true
|
||||
* Set *Feedback Name* to `No-Reply`
|
||||
* Set *Feedback Email* to `mattermost@example.com`
|
||||
* Set *SMTP Username* to `AFIADTOVDKDLGERR`
|
||||
* Set *SMTP Password* to `DFKJoiweklsjdflkjOIGHLSDFJewiskdjf`
|
||||
* Set *SMTP Server* to `email-smtp.us-east-1.amazonaws.com`
|
||||
* Set *SMTP Port* to `465`
|
||||
* Set *Connection Security* to `TLS`
|
||||
* Save the Settings
|
||||
1. Update File Settings
|
||||
* Change *Local Directory Location* from `./data/` to `/mattermost/data`
|
||||
1. Update Log Settings
|
||||
* Set *Log to The Console* to false
|
||||
1. Update Rate Limit Settings
|
||||
* Set *Vary By Remote Address* to false
|
||||
* Set *Vary By HTTP Header* to X-Real-IP
|
||||
1. Feel free to modify other settings.
|
||||
1. Restart the Mattermost Service by typing:
|
||||
* ``` sudo restart mattermost```
|
||||
@@ -1,100 +0,0 @@
|
||||
# Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved.
|
||||
# See License.txt for license information.
|
||||
FROM ubuntu:14.04
|
||||
|
||||
# Install Dependancies
|
||||
RUN apt-get update && apt-get install -y build-essential
|
||||
RUN apt-get install -y curl
|
||||
RUN curl -sL https://deb.nodesource.com/setup | bash -
|
||||
RUN apt-get install -y nodejs
|
||||
RUN apt-get install -y ruby-full
|
||||
RUN gem install compass
|
||||
|
||||
# Postfix
|
||||
RUN apt-get install -y postfix
|
||||
|
||||
#
|
||||
# Install GO
|
||||
#
|
||||
|
||||
RUN apt-get update && apt-get install -y \
|
||||
gcc libc6-dev make git mercurial \
|
||||
--no-install-recommends \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
ENV GOLANG_VERSION 1.4.2
|
||||
|
||||
RUN curl -sSL https://golang.org/dl/go$GOLANG_VERSION.src.tar.gz \
|
||||
| tar -v -C /usr/src -xz
|
||||
|
||||
RUN cd /usr/src/go/src && ./make.bash --no-clean 2>&1
|
||||
|
||||
ENV PATH /usr/src/go/bin:$PATH
|
||||
|
||||
RUN mkdir -p /go/src /go/bin && chmod -R 777 /go
|
||||
ENV GOPATH /go
|
||||
ENV PATH /go/bin:$PATH
|
||||
WORKDIR /go
|
||||
|
||||
# ---------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
#
|
||||
# Install SQL
|
||||
#
|
||||
|
||||
ENV MYSQL_ROOT_PASSWORD=mostest
|
||||
ENV MYSQL_USER=mmuser
|
||||
ENV MYSQL_PASSWORD=mostest
|
||||
ENV MYSQL_DATABASE=mattermost_test
|
||||
|
||||
RUN groupadd -r mysql && useradd -r -g mysql mysql
|
||||
|
||||
RUN apt-get update && apt-get install -y perl --no-install-recommends && rm -rf /var/lib/apt/lists/*
|
||||
|
||||
RUN apt-key adv --keyserver pool.sks-keyservers.net --recv-keys A4A9406876FCBD3C456770C88C718D3B5072E1F5
|
||||
|
||||
ENV MYSQL_MAJOR 5.6
|
||||
ENV MYSQL_VERSION 5.6.25
|
||||
|
||||
RUN echo "deb http://repo.mysql.com/apt/debian/ wheezy mysql-${MYSQL_MAJOR}" > /etc/apt/sources.list.d/mysql.list
|
||||
|
||||
RUN apt-get update \
|
||||
&& export DEBIAN_FRONTEND=noninteractive \
|
||||
&& apt-get -y install mysql-server \
|
||||
&& rm -rf /var/lib/apt/lists/* \
|
||||
&& rm -rf /var/lib/mysql && mkdir -p /var/lib/mysql
|
||||
|
||||
RUN sed -Ei 's/^(bind-address|log)/#&/' /etc/mysql/my.cnf
|
||||
|
||||
VOLUME /var/lib/mysql
|
||||
# ---------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
#
|
||||
# Install Redis
|
||||
#
|
||||
|
||||
RUN apt-get update && apt-get install -y wget
|
||||
RUN wget http://download.redis.io/redis-stable.tar.gz; \
|
||||
tar xvzf redis-stable.tar.gz; \
|
||||
cd redis-stable; \
|
||||
make install
|
||||
|
||||
# ---------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
# Copy over files
|
||||
ADD https://github.com/mattermost/platform/archive/v0.50.tar.gz /go/src/github.com/mattermost/
|
||||
RUN mkdir /go/src/github.com/mattermost/platform && tar -zxvf /go/src/github.com/mattermost/v0.50.tar.gz -C /go/src/github.com/mattermost/platform --strip-components=1
|
||||
|
||||
# Insert postfix config
|
||||
ADD ./main.cf /etc/postfix/
|
||||
|
||||
RUN go get github.com/tools/godep
|
||||
RUN cd /go/src/github.com/mattermost/platform; godep restore
|
||||
RUN go install github.com/mattermost/platform
|
||||
RUN cd /go/src/github.com/mattermost/platform/web/react; npm install
|
||||
|
||||
RUN chmod +x /go/src/github.com/mattermost/platform/docker/docker-entry.sh
|
||||
ENTRYPOINT /go/src/github.com/mattermost/platform/docker/docker-entry.sh
|
||||
|
||||
# Ports
|
||||
EXPOSE 80
|
||||
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"AWSEBDockerrunVersion": "1",
|
||||
"Image": {
|
||||
"Name": "mattermost/platform:helium",
|
||||
"Update": "true"
|
||||
},
|
||||
"Ports": [
|
||||
{
|
||||
"ContainerPort": "80"
|
||||
}
|
||||
],
|
||||
"Logging": "/var/log/"
|
||||
}
|
||||
@@ -1,122 +0,0 @@
|
||||
#!/bin/bash
|
||||
# Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved.
|
||||
# See License.txt for license information.
|
||||
|
||||
mkdir -p web/static/js
|
||||
|
||||
echo "127.0.0.1 dockerhost" >> /etc/hosts
|
||||
/etc/init.d/networking restart
|
||||
|
||||
echo configuring mysql
|
||||
|
||||
# SQL!!!
|
||||
set -e
|
||||
|
||||
get_option () {
|
||||
local section=$1
|
||||
local option=$2
|
||||
local default=$3
|
||||
ret=$(my_print_defaults $section | grep '^--'${option}'=' | cut -d= -f2-)
|
||||
[ -z $ret ] && ret=$default
|
||||
echo $ret
|
||||
}
|
||||
|
||||
|
||||
# Get config
|
||||
DATADIR="$("mysqld" --verbose --help 2>/dev/null | awk '$1 == "datadir" { print $2; exit }')"
|
||||
SOCKET=$(get_option mysqld socket "$DATADIR/mysql.sock")
|
||||
PIDFILE=$(get_option mysqld pid-file "/var/run/mysqld/mysqld.pid")
|
||||
|
||||
if [ ! -d "$DATADIR/mysql" ]; then
|
||||
if [ -z "$MYSQL_ROOT_PASSWORD" -a -z "$MYSQL_ALLOW_EMPTY_PASSWORD" ]; then
|
||||
echo >&2 'error: database is uninitialized and MYSQL_ROOT_PASSWORD not set'
|
||||
echo >&2 ' Did you forget to add -e MYSQL_ROOT_PASSWORD=... ?'
|
||||
exit 1
|
||||
fi
|
||||
|
||||
mkdir -p "$DATADIR"
|
||||
chown -R mysql:mysql "$DATADIR"
|
||||
|
||||
echo 'Running mysql_install_db'
|
||||
mysql_install_db --user=mysql --datadir="$DATADIR" --rpm --keep-my-cnf
|
||||
echo 'Finished mysql_install_db'
|
||||
|
||||
mysqld --user=mysql --datadir="$DATADIR" --skip-networking &
|
||||
for i in $(seq 30 -1 0); do
|
||||
[ -S "$SOCKET" ] && break
|
||||
echo 'MySQL init process in progress...'
|
||||
sleep 1
|
||||
done
|
||||
if [ $i = 0 ]; then
|
||||
echo >&2 'MySQL init process failed.'
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# These statements _must_ be on individual lines, and _must_ end with
|
||||
# semicolons (no line breaks or comments are permitted).
|
||||
# TODO proper SQL escaping on ALL the things D:
|
||||
|
||||
tempSqlFile=$(mktemp /tmp/mysql-first-time.XXXXXX.sql)
|
||||
cat > "$tempSqlFile" <<-EOSQL
|
||||
-- What's done in this file shouldn't be replicated
|
||||
-- or products like mysql-fabric won't work
|
||||
SET @@SESSION.SQL_LOG_BIN=0;
|
||||
|
||||
DELETE FROM mysql.user ;
|
||||
CREATE USER 'root'@'%' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD}' ;
|
||||
GRANT ALL ON *.* TO 'root'@'%' WITH GRANT OPTION ;
|
||||
DROP DATABASE IF EXISTS test ;
|
||||
EOSQL
|
||||
|
||||
if [ "$MYSQL_DATABASE" ]; then
|
||||
echo "CREATE DATABASE IF NOT EXISTS \`$MYSQL_DATABASE\` ;" >> "$tempSqlFile"
|
||||
fi
|
||||
|
||||
if [ "$MYSQL_USER" -a "$MYSQL_PASSWORD" ]; then
|
||||
echo "CREATE USER '"$MYSQL_USER"'@'%' IDENTIFIED BY '"$MYSQL_PASSWORD"' ;" >> "$tempSqlFile"
|
||||
|
||||
if [ "$MYSQL_DATABASE" ]; then
|
||||
echo "GRANT ALL ON \`"$MYSQL_DATABASE"\`.* TO '"$MYSQL_USER"'@'%' ;" >> "$tempSqlFile"
|
||||
fi
|
||||
fi
|
||||
|
||||
echo 'FLUSH PRIVILEGES ;' >> "$tempSqlFile"
|
||||
|
||||
mysql -uroot < "$tempSqlFile"
|
||||
|
||||
rm -f "$tempSqlFile"
|
||||
kill $(cat $PIDFILE)
|
||||
for i in $(seq 30 -1 0); do
|
||||
[ -f "$PIDFILE" ] || break
|
||||
echo 'MySQL init process in progress...'
|
||||
sleep 1
|
||||
done
|
||||
if [ $i = 0 ]; then
|
||||
echo >&2 'MySQL hangs during init process.'
|
||||
exit 1
|
||||
fi
|
||||
echo 'MySQL init process done. Ready for start up.'
|
||||
fi
|
||||
|
||||
chown -R mysql:mysql "$DATADIR"
|
||||
|
||||
mysqld &
|
||||
|
||||
sleep 5
|
||||
|
||||
# ------------------------
|
||||
|
||||
echo starting postfix
|
||||
/etc/init.d/postfix restart
|
||||
|
||||
echo starting redis
|
||||
redis-server &
|
||||
|
||||
echo starting react processor
|
||||
cd /go/src/github.com/mattermost/platform/web/react && npm start &
|
||||
|
||||
echo starting go web server
|
||||
cd /go/src/github.com/mattermost/platform/; go run mattermost.go -config=config_docker.json &
|
||||
|
||||
echo starting compass watch
|
||||
cd /go/src/github.com/mattermost/platform/web/sass-files && compass watch
|
||||
@@ -1,28 +0,0 @@
|
||||
myorigin = mattermost.com
|
||||
myhostname = mattermost.com
|
||||
|
||||
smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
|
||||
biff = no
|
||||
|
||||
append_dot_mydomain = no
|
||||
|
||||
readme_directory = no
|
||||
|
||||
# TLS parameters
|
||||
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
|
||||
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
|
||||
smtpd_use_tls=no
|
||||
smtp_use_tls=no
|
||||
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
|
||||
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
|
||||
|
||||
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
|
||||
alias_maps = hash:/etc/aliases
|
||||
alias_database = hash:/etc/aliases
|
||||
mydestination = localhost, localhost.localdomain, localhost
|
||||
relayhost =
|
||||
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
|
||||
mailbox_size_limit = 0
|
||||
recipient_delimiter = +
|
||||
inet_interfaces = all
|
||||
inet_protocols = all
|
||||
Binary file not shown.
@@ -1,99 +0,0 @@
|
||||
{
|
||||
"LogSettings": {
|
||||
"ConsoleEnable": false,
|
||||
"ConsoleLevel": "DEBUG",
|
||||
"FileEnable": true,
|
||||
"FileLevel": "INFO",
|
||||
"FileFormat": "",
|
||||
"FileLocation": ""
|
||||
},
|
||||
"ServiceSettings": {
|
||||
"SiteName": "Mattermost",
|
||||
"Mode" : "dev",
|
||||
"AllowTesting" : false,
|
||||
"UseSSL": false,
|
||||
"Port": "80",
|
||||
"Version": "developer",
|
||||
"Shards": {
|
||||
},
|
||||
"InviteSalt": "gxHVDcKUyP2y1eiyW8S8na1UYQAfq6J6",
|
||||
"PublicLinkSalt": "TO3pTyXIZzwHiwyZgGql7lM7DG3zeId4",
|
||||
"ResetSalt": "IPxFzSfnDFsNsRafZxz8NaYqFKhf9y2t",
|
||||
"AnalyticsUrl": "",
|
||||
"UseLocalStorage": true,
|
||||
"StorageDirectory": "/mattermost/data/",
|
||||
"AllowedLoginAttempts": 10
|
||||
},
|
||||
"SSOSettings": {
|
||||
"gitlab": {
|
||||
"Allow": false,
|
||||
"Secret" : "",
|
||||
"Id": "",
|
||||
"AuthEndpoint": "",
|
||||
"TokenEndpoint": "",
|
||||
"UserApiEndpoint": ""
|
||||
}
|
||||
},
|
||||
"SqlSettings": {
|
||||
"DriverName": "mysql",
|
||||
"DataSource": "mmuser:mostest@tcp(localhost:3306)/mattermost_test?charset=utf8mb4,utf8",
|
||||
"DataSourceReplicas": ["mmuser:mostest@tcp(localhost:3306)/mattermost_test?charset=utf8mb4,utf8"],
|
||||
"MaxIdleConns": 10,
|
||||
"MaxOpenConns": 10,
|
||||
"Trace": false,
|
||||
"AtRestEncryptKey": "Ya0xMrybACJ3sZZVWQC7e31h5nSDWZFS"
|
||||
},
|
||||
"AWSSettings": {
|
||||
"S3AccessKeyId": "",
|
||||
"S3SecretAccessKey": "",
|
||||
"S3Bucket": "",
|
||||
"S3Region": ""
|
||||
},
|
||||
"ImageSettings": {
|
||||
"ThumbnailWidth": 120,
|
||||
"ThumbnailHeight": 100,
|
||||
"PreviewWidth": 1024,
|
||||
"PreviewHeight": 0,
|
||||
"ProfileWidth": 128,
|
||||
"ProfileHeight": 128,
|
||||
"InitialFont": "luximbi.ttf"
|
||||
},
|
||||
"EmailSettings": {
|
||||
"ByPassEmail" : true,
|
||||
"SMTPUsername": "",
|
||||
"SMTPPassword": "",
|
||||
"SMTPServer": "",
|
||||
"UseTLS": false,
|
||||
"UseStartTLS": false,
|
||||
"FeedbackEmail": "",
|
||||
"FeedbackName": "",
|
||||
"ApplePushServer": "",
|
||||
"ApplePushCertPublic": "",
|
||||
"ApplePushCertPrivate": ""
|
||||
},
|
||||
"RateLimitSettings": {
|
||||
"UseRateLimiter": true,
|
||||
"PerSec": 10,
|
||||
"MemoryStoreSize": 10000,
|
||||
"VaryByRemoteAddr": true,
|
||||
"VaryByHeader": ""
|
||||
},
|
||||
"PrivacySettings": {
|
||||
"ShowEmailAddress": true,
|
||||
"ShowPhoneNumber": true,
|
||||
"ShowSkypeId": true,
|
||||
"ShowFullName": true
|
||||
},
|
||||
"TeamSettings": {
|
||||
"MaxUsersPerTeam": 150,
|
||||
"AllowPublicLink": true,
|
||||
"AllowValetDefault": false,
|
||||
"TermsLink": "/static/help/configure_links.html",
|
||||
"PrivacyLink": "/static/help/configure_links.html",
|
||||
"AboutLink": "/static/help/configure_links.html",
|
||||
"HelpLink": "/static/help/configure_links.html",
|
||||
"ReportProblemLink": "/static/help/configure_links.html",
|
||||
"TourLink": "/static/help/configure_links.html",
|
||||
"DefaultThemeColor": "#2389D7"
|
||||
}
|
||||
}
|
||||
@@ -13,8 +13,6 @@ ENV MYSQL_DATABASE=mattermost_test
|
||||
|
||||
RUN groupadd -r mysql && useradd -r -g mysql mysql
|
||||
|
||||
RUN apt-get update && apt-get install -y perl --no-install-recommends && rm -rf /var/lib/apt/lists/*
|
||||
|
||||
RUN apt-key adv --keyserver pool.sks-keyservers.net --recv-keys A4A9406876FCBD3C456770C88C718D3B5072E1F5
|
||||
|
||||
ENV MYSQL_MAJOR 5.6
|
||||
@@ -24,7 +22,7 @@ RUN echo "deb http://repo.mysql.com/apt/debian/ wheezy mysql-${MYSQL_MAJOR}" > /
|
||||
|
||||
RUN apt-get update \
|
||||
&& export DEBIAN_FRONTEND=noninteractive \
|
||||
&& apt-get -y install mysql-server \
|
||||
&& apt-get -y install perl wget mysql-server \
|
||||
&& rm -rf /var/lib/apt/lists/* \
|
||||
&& rm -rf /var/lib/mysql && mkdir -p /var/lib/mysql
|
||||
|
||||
@@ -36,8 +34,8 @@ VOLUME /var/lib/mysql
|
||||
WORKDIR /mattermost
|
||||
|
||||
# Copy over files
|
||||
ADD https://github.com/mattermost/platform/releases/download/v0.6.0/mattermost.tar.gz /
|
||||
RUN tar -zxvf /mattermost.tar.gz --strip-components=1
|
||||
ADD https://github.com/mattermost/platform/releases/download/v1.0.0-rc1/mattermost.tar.gz /
|
||||
RUN tar -zxvf /mattermost.tar.gz --strip-components=1 && rm /mattermost.tar.gz
|
||||
ADD config_docker.json /
|
||||
ADD docker-entry.sh /
|
||||
|
||||
BIN
docker/1.0/Dockerrun.aws.zip
Normal file
BIN
docker/1.0/Dockerrun.aws.zip
Normal file
Binary file not shown.
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"AWSEBDockerrunVersion": "1",
|
||||
"Image": {
|
||||
"Name": "mattermost/platform:0.6",
|
||||
"Name": "mattermost/platform:1.0",
|
||||
"Update": "true"
|
||||
},
|
||||
"Ports": [
|
||||
89
docker/1.0/config_docker.json
Normal file
89
docker/1.0/config_docker.json
Normal file
@@ -0,0 +1,89 @@
|
||||
{
|
||||
"ServiceSettings": {
|
||||
"ListenAddress": ":80",
|
||||
"MaximumLoginAttempts": 10,
|
||||
"SegmentDeveloperKey": "",
|
||||
"GoogleDeveloperKey": "",
|
||||
"EnableOAuthServiceProvider": false,
|
||||
"EnableIncomingWebhooks": false,
|
||||
"EnableTesting": false
|
||||
},
|
||||
"TeamSettings": {
|
||||
"SiteName": "Mattermost",
|
||||
"MaxUsersPerTeam": 50,
|
||||
"EnableTeamCreation": true,
|
||||
"EnableUserCreation": true,
|
||||
"RestrictCreationToDomains": ""
|
||||
},
|
||||
"SqlSettings": {
|
||||
"DriverName": "mysql",
|
||||
"DataSource": "mmuser:mostest@tcp(dockerhost:3306)/mattermost_test?charset=utf8mb4,utf8",
|
||||
"DataSourceReplicas": [],
|
||||
"MaxIdleConns": 10,
|
||||
"MaxOpenConns": 10,
|
||||
"Trace": false,
|
||||
"AtRestEncryptKey": "7rAh6iwQCkV4cA1Gsg3fgGOXJAQ43QV"
|
||||
},
|
||||
"LogSettings": {
|
||||
"EnableConsole": false,
|
||||
"ConsoleLevel": "INFO",
|
||||
"EnableFile": true,
|
||||
"FileLevel": "INFO",
|
||||
"FileFormat": "",
|
||||
"FileLocation": ""
|
||||
},
|
||||
"FileSettings": {
|
||||
"DriverName": "local",
|
||||
"Directory": "/mattermost/data/",
|
||||
"EnablePublicLink": true,
|
||||
"PublicLinkSalt": "LhaAWC6lYEKHTkBKsvyXNIOfUIT37AX",
|
||||
"ThumbnailWidth": 120,
|
||||
"ThumbnailHeight": 100,
|
||||
"PreviewWidth": 1024,
|
||||
"PreviewHeight": 0,
|
||||
"ProfileWidth": 128,
|
||||
"ProfileHeight": 128,
|
||||
"InitialFont": "luximbi.ttf",
|
||||
"AmazonS3AccessKeyId": "",
|
||||
"AmazonS3SecretAccessKey": "",
|
||||
"AmazonS3Bucket": "",
|
||||
"AmazonS3Region": ""
|
||||
},
|
||||
"EmailSettings": {
|
||||
"EnableSignUpWithEmail": true,
|
||||
"SendEmailNotifications": false,
|
||||
"RequireEmailVerification": false,
|
||||
"FeedbackName": "",
|
||||
"FeedbackEmail": "",
|
||||
"SMTPUsername": "",
|
||||
"SMTPPassword": "",
|
||||
"SMTPServer": "",
|
||||
"SMTPPort": "",
|
||||
"ConnectionSecurity": "",
|
||||
"InviteSalt": "bjlSR4QqkXFBr7TP4oDzlfZmcNuH9Yo",
|
||||
"PasswordResetSalt": "vZ4DcKyVVRlKHHJpexcuXzojkE5PZ5e",
|
||||
"ApplePushServer": "",
|
||||
"ApplePushCertPublic": "",
|
||||
"ApplePushCertPrivate": ""
|
||||
},
|
||||
"RateLimitSettings": {
|
||||
"EnableRateLimiter": true,
|
||||
"PerSec": 10,
|
||||
"MemoryStoreSize": 10000,
|
||||
"VaryByRemoteAddr": true,
|
||||
"VaryByHeader": ""
|
||||
},
|
||||
"PrivacySettings": {
|
||||
"ShowEmailAddress": true,
|
||||
"ShowFullName": true
|
||||
},
|
||||
"GitLabSettings": {
|
||||
"Enable": false,
|
||||
"Secret": "",
|
||||
"Id": "",
|
||||
"Scope": "",
|
||||
"AuthEndpoint": "",
|
||||
"TokenEndpoint": "",
|
||||
"UserApiEndpoint": ""
|
||||
}
|
||||
}
|
||||
@@ -12,7 +12,7 @@ import (
|
||||
// It should be maitained in chronological order with most current
|
||||
// release at the front of the list.
|
||||
var versions = []string{
|
||||
"0.8.0",
|
||||
"1.0.0",
|
||||
"0.7.1",
|
||||
"0.7.0",
|
||||
"0.6.0",
|
||||
|
||||
@@ -36,7 +36,7 @@ func TestSplitVersion(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestGetPreviousVersion(t *testing.T) {
|
||||
if major, minor := GetPreviousVersion("0.8.0"); major != 0 || minor != 7 {
|
||||
if major, minor := GetPreviousVersion("1.0.0"); major != 0 || minor != 7 {
|
||||
t.Fatal(major, minor)
|
||||
}
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ export default class GitLabSettings extends React.Component {
|
||||
this.handleSubmit = this.handleSubmit.bind(this);
|
||||
|
||||
this.state = {
|
||||
Allow: this.props.config.GitLabSettings.Allow,
|
||||
Enable: this.props.config.GitLabSettings.Enable,
|
||||
saveNeeded: false,
|
||||
serverError: null
|
||||
};
|
||||
@@ -21,12 +21,12 @@ export default class GitLabSettings extends React.Component {
|
||||
handleChange(action) {
|
||||
var s = {saveNeeded: true, serverError: this.state.serverError};
|
||||
|
||||
if (action === 'AllowTrue') {
|
||||
s.Allow = true;
|
||||
if (action === 'EnableTrue') {
|
||||
s.Enable = true;
|
||||
}
|
||||
|
||||
if (action === 'AllowFalse') {
|
||||
s.Allow = false;
|
||||
if (action === 'EnableFalse') {
|
||||
s.Enable = false;
|
||||
}
|
||||
|
||||
this.setState(s);
|
||||
@@ -37,7 +37,7 @@ export default class GitLabSettings extends React.Component {
|
||||
$('#save-button').button('loading');
|
||||
|
||||
var config = this.props.config;
|
||||
config.GitLabSettings.Allow = React.findDOMNode(this.refs.Allow).checked;
|
||||
config.GitLabSettings.Enable = React.findDOMNode(this.refs.Enable).checked;
|
||||
config.GitLabSettings.Secret = React.findDOMNode(this.refs.Secret).value.trim();
|
||||
config.GitLabSettings.Id = React.findDOMNode(this.refs.Id).value.trim();
|
||||
config.GitLabSettings.AuthEndpoint = React.findDOMNode(this.refs.AuthEndpoint).value.trim();
|
||||
@@ -87,7 +87,7 @@ export default class GitLabSettings extends React.Component {
|
||||
<div className='form-group'>
|
||||
<label
|
||||
className='control-label col-sm-4'
|
||||
htmlFor='Allow'
|
||||
htmlFor='Enable'
|
||||
>
|
||||
{'Enable Sign Up With GitLab: '}
|
||||
</label>
|
||||
@@ -95,21 +95,21 @@ export default class GitLabSettings extends React.Component {
|
||||
<label className='radio-inline'>
|
||||
<input
|
||||
type='radio'
|
||||
name='Allow'
|
||||
name='Enable'
|
||||
value='true'
|
||||
ref='Allow'
|
||||
defaultChecked={this.props.config.GitLabSettings.Allow}
|
||||
onChange={this.handleChange.bind(this, 'AllowTrue')}
|
||||
ref='Enable'
|
||||
defaultChecked={this.props.config.GitLabSettings.Enable}
|
||||
onChange={this.handleChange.bind(this, 'EnableTrue')}
|
||||
/>
|
||||
{'true'}
|
||||
</label>
|
||||
<label className='radio-inline'>
|
||||
<input
|
||||
type='radio'
|
||||
name='Allow'
|
||||
name='Enable'
|
||||
value='false'
|
||||
defaultChecked={!this.props.config.GitLabSettings.Allow}
|
||||
onChange={this.handleChange.bind(this, 'AllowFalse')}
|
||||
defaultChecked={!this.props.config.GitLabSettings.Enable}
|
||||
onChange={this.handleChange.bind(this, 'EnableFalse')}
|
||||
/>
|
||||
{'false'}
|
||||
</label>
|
||||
@@ -133,7 +133,7 @@ export default class GitLabSettings extends React.Component {
|
||||
placeholder='Ex "jcuS8PuvcpGhpgHhlcpT1Mx42pnqMxQY"'
|
||||
defaultValue={this.props.config.GitLabSettings.Id}
|
||||
onChange={this.handleChange}
|
||||
disabled={!this.state.Allow}
|
||||
disabled={!this.state.Enable}
|
||||
/>
|
||||
<p className='help-text'>{'Obtain this value via the instructions above for logging into GitLab'}</p>
|
||||
</div>
|
||||
@@ -155,7 +155,7 @@ export default class GitLabSettings extends React.Component {
|
||||
placeholder='Ex "jcuS8PuvcpGhpgHhlcpT1Mx42pnqMxQY"'
|
||||
defaultValue={this.props.config.GitLabSettings.Secret}
|
||||
onChange={this.handleChange}
|
||||
disabled={!this.state.Allow}
|
||||
disabled={!this.state.Enable}
|
||||
/>
|
||||
<p className='help-text'>{'Obtain this value via the instructions above for logging into GitLab.'}</p>
|
||||
</div>
|
||||
@@ -177,7 +177,7 @@ export default class GitLabSettings extends React.Component {
|
||||
placeholder='Ex ""'
|
||||
defaultValue={this.props.config.GitLabSettings.AuthEndpoint}
|
||||
onChange={this.handleChange}
|
||||
disabled={!this.state.Allow}
|
||||
disabled={!this.state.Enable}
|
||||
/>
|
||||
<p className='help-text'>{'Enter <your-gitlab-url>/oauth/authorize (example http://localhost:3000/oauth/authorize). Make sure you use HTTP or HTTPS in your URLs as appropriate.'}</p>
|
||||
</div>
|
||||
@@ -199,7 +199,7 @@ export default class GitLabSettings extends React.Component {
|
||||
placeholder='Ex ""'
|
||||
defaultValue={this.props.config.GitLabSettings.TokenEndpoint}
|
||||
onChange={this.handleChange}
|
||||
disabled={!this.state.Allow}
|
||||
disabled={!this.state.Enable}
|
||||
/>
|
||||
<p className='help-text'>{'Enter <your-gitlab-url>/oauth/token. Make sure you use HTTP or HTTPS in your URLs as appropriate.'}</p>
|
||||
</div>
|
||||
@@ -221,7 +221,7 @@ export default class GitLabSettings extends React.Component {
|
||||
placeholder='Ex ""'
|
||||
defaultValue={this.props.config.GitLabSettings.UserApiEndpoint}
|
||||
onChange={this.handleChange}
|
||||
disabled={!this.state.Allow}
|
||||
disabled={!this.state.Enable}
|
||||
/>
|
||||
<p className='help-text'>{'Enter <your-gitlab-url>/api/v3/user. Make sure you use HTTP or HTTPS in your URLs as appropriate.'}</p>
|
||||
</div>
|
||||
|
||||
@@ -388,7 +388,6 @@ export function toTitleCase(str) {
|
||||
export function applyTheme(theme) {
|
||||
if (theme.sidebarBg) {
|
||||
changeCss('.sidebar--left', 'background:' + theme.sidebarBg, 1);
|
||||
changeCss('@media(max-width: 768px){.search-bar__container', 'background:' + theme.sidebarBg, 1);
|
||||
}
|
||||
|
||||
if (theme.sidebarText) {
|
||||
@@ -423,6 +422,7 @@ export function applyTheme(theme) {
|
||||
changeCss('.sidebar--left .team__header, .sidebar--menu .team__header', 'background:' + theme.sidebarHeaderBg, 1);
|
||||
changeCss('.modal .modal-header', 'background:' + theme.sidebarHeaderBg, 1);
|
||||
changeCss('#navbar .navbar-default', 'background:' + theme.sidebarHeaderBg, 1);
|
||||
changeCss('@media(max-width: 768px){.search-bar__container', 'background:' + theme.sidebarHeaderBg, 1);
|
||||
}
|
||||
|
||||
if (theme.sidebarHeaderTextColor) {
|
||||
@@ -430,8 +430,9 @@ export function applyTheme(theme) {
|
||||
changeCss('.sidebar--left .team__header .user__name, .sidebar--menu .team__header .user__name', 'color:' + changeOpacity(theme.sidebarHeaderTextColor, 0.8), 1);
|
||||
changeCss('.sidebar--left .team__header:hover .user__name, .sidebar--menu .team__header:hover .user__name', 'color:' + theme.sidebarHeaderTextColor, 1);
|
||||
changeCss('.modal .modal-header .modal-title, .modal .modal-header .modal-title .name, .modal .modal-header button.close', 'color:' + theme.sidebarHeaderTextColor, 1);
|
||||
changeCss('#navbar .navbar-default .navbar-brand .heading, ', 'color:' + theme.sidebarHeaderTextColor, 1);
|
||||
changeCss('#navbar .navbar-default .navbar-brand .heading', 'color:' + theme.sidebarHeaderTextColor, 1);
|
||||
changeCss('#navbar .navbar-default .navbar-toggle .icon-bar, ', 'background:' + theme.sidebarHeaderTextColor, 1);
|
||||
changeCss('@media(max-width: 768px){.search-bar__container', 'color:' + theme.sidebarHeaderTextColor, 2);
|
||||
}
|
||||
|
||||
if (theme.onlineIndicator) {
|
||||
@@ -452,7 +453,6 @@ export function applyTheme(theme) {
|
||||
changeCss('.app__content, .markdown__table, .markdown__table tbody tr, .command-box', 'background:' + theme.centerChannelBg, 1);
|
||||
changeCss('#post-list .post-list-holder-by-time', 'background:' + theme.centerChannelBg, 1);
|
||||
changeCss('#post-create', 'background:' + theme.centerChannelBg, 1);
|
||||
changeCss('.search-bar__container .search__form .search-bar', 'background:' + theme.centerChannelBg, 1);
|
||||
changeCss('.date-separator .separator__text, .new-separator .separator__text', 'background:' + theme.centerChannelBg, 1);
|
||||
changeCss('.post-image__column .post-image__details', 'background:' + theme.centerChannelBg, 1);
|
||||
changeCss('.sidebar--right', 'background:' + theme.centerChannelBg, 1);
|
||||
@@ -475,7 +475,7 @@ export function applyTheme(theme) {
|
||||
changeCss('.post-image__column', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2), 2);
|
||||
changeCss('.post-image__column .post-image__details', 'color:' + theme.centerChannelColor, 2);
|
||||
changeCss('.post-image__column a, .post-image__column a:hover, .post-image__column a:focus', 'color:' + theme.centerChannelColor, 1);
|
||||
changeCss('.search-bar__container .search__form .search-bar', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2) + '; color: ' + theme.centerChannelColor, 2);
|
||||
changeCss('.search-bar__container .search__form .search-bar', 'background:' + changeOpacity(theme.centerChannelColor, 0.2), 1);
|
||||
changeCss('.search-bar__container .search__form', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2), 1);
|
||||
changeCss('.channel-intro .channel-intro__content', 'background:' + changeOpacity(theme.centerChannelColor, 0.05), 1);
|
||||
changeCss('.date-separator .separator__text', 'color:' + theme.centerChannelColor, 2);
|
||||
@@ -512,7 +512,6 @@ export function applyTheme(theme) {
|
||||
changeCss('.btn.btn-primary', 'color:' + theme.buttonColor, 2);
|
||||
}
|
||||
}
|
||||
|
||||
export function changeCss(className, classValue, classRepeat) {
|
||||
// we need invisible container to store additional css definitions
|
||||
var cssMainContainer = $('#css-modifier-container');
|
||||
|
||||
@@ -553,13 +553,7 @@
|
||||
padding: 0 10px 0 31px;
|
||||
background: rgba(black, 0.2);
|
||||
@include border-radius(3px);
|
||||
color: #fff;
|
||||
}
|
||||
input[type=text] {
|
||||
@include input-placeholder {
|
||||
color: #fff;
|
||||
color: rgba(#fff, 0.5);
|
||||
}
|
||||
color: inherit;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,8 +32,7 @@
|
||||
top: 15px;
|
||||
margin-left: 10px;
|
||||
font-size: 14px;
|
||||
color: #fff;
|
||||
color: rgba(#fff, 0.5);
|
||||
@include opacity(0.5);
|
||||
display: none;
|
||||
}
|
||||
.search__form {
|
||||
|
||||
Reference in New Issue
Block a user