├── k8s ├── namespace.yaml ├── database-setup.yaml ├── postgres.yaml └── taiga.yaml ├── backend ├── default.locale ├── build.sh ├── Dockerfile ├── docker-settings.py └── locale.gen ├── run.sh ├── .gitignore ├── frontend ├── run.sh ├── build.sh ├── Dockerfile ├── conf.json ├── nginx.conf └── taiga.conf ├── docker-compose.yml ├── setup.sh ├── setup.bat ├── Makefile ├── README.md └── LICENSE /k8s/namespace.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Namespace 3 | metadata: 4 | name: $NAMESPACE 5 | -------------------------------------------------------------------------------- /backend/default.locale: -------------------------------------------------------------------------------- 1 | LANG=en_US.UTF-8 2 | LC_TYPE=en_US.UTF-8 3 | LC_MESSAGES=POSIX 4 | LANGUAGE=en 5 | -------------------------------------------------------------------------------- /run.sh: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env bash 2 | 3 | docker stop taiga-front 4 | docker stop taiga-back 5 | docker stop postgres 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | backend/taiga-back 3 | backend/requirements.txt 4 | frontend/taiga-front-dist 5 | postgresql 6 | 7 | -------------------------------------------------------------------------------- /frontend/run.sh: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env bash 2 | 3 | ESCAPED_BASE_URL="${BASE_PROTOCOL}:\/\/${BASE_DOMAIN}" 4 | sed -i "s/BASE_URL/$ESCAPED_BASE_URL/g" /taiga/conf.json 5 | 6 | nginx -g "daemon off;" 7 | -------------------------------------------------------------------------------- /frontend/build.sh: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | 3 | if [[ -d taiga-front-dist ]]; then 4 | rm -rf taiga-front-dist 5 | fi 6 | 7 | git clone https://github.com/taigaio/taiga-front-dist 8 | 9 | # Production ready frontend is in "stable" and not in "master" therefore after clone I need to change to "stable" 10 | git checkout stable 11 | 12 | docker build -t dougg/taiga-front . 13 | 14 | if [[ -d taiga-front-dist ]]; then 15 | rm -rf taiga-front-dist 16 | fi 17 | -------------------------------------------------------------------------------- /k8s/database-setup.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: batch/v1 2 | kind: Job 3 | metadata: 4 | name: database-setup 5 | spec: 6 | template: 7 | metadata: 8 | name: database-setup 9 | spec: 10 | nodeSelector: 11 | cloud.google.com/gke-nodepool: $NODE_SELECTOR 12 | containers: 13 | - name: database-setup 14 | image: $IMAGE_BACK 15 | imagePullPolicy: IfNotPresent 16 | command: ["./regenerate.sh", "-y"] 17 | restartPolicy: OnFailure 18 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | postgres: 2 | image: postgres 3 | environment: 4 | - "POSTGRES_USER=taiga" 5 | - "POSTGRES_DB=taiga" 6 | 7 | taigaback: 8 | image: dougg/taiga-back 9 | links: 10 | - postgres:postgres 11 | ports: 12 | - "8000:8000" 13 | 14 | taigafront: 15 | image: dougg/taiga-front 16 | links: 17 | - taigaback:taiga-back 18 | ports: 19 | - "8080:80" 20 | environment: 21 | - "BASE_URL=http://localhost:8000" 22 | -------------------------------------------------------------------------------- /frontend/Dockerfile: -------------------------------------------------------------------------------- 1 | ############################################################## 2 | ## 3 | ## 4 | ## Taiga-front 5 | ## 6 | ## 7 | ############################################################### 8 | 9 | FROM nginx 10 | 11 | COPY taiga-front-dist/dist /taiga 12 | COPY conf.json /taiga/conf.json 13 | COPY run.sh /taiga/run.sh 14 | COPY nginx.conf /etc/nginx/nginx.conf 15 | COPY taiga.conf /etc/nginx/conf.d/default.conf 16 | 17 | RUN chmod -R 755 /taiga && chmod +x /taiga/run.sh 18 | 19 | CMD ["/taiga/run.sh"] 20 | -------------------------------------------------------------------------------- /frontend/conf.json: -------------------------------------------------------------------------------- 1 | { 2 | "api": "BASE_URL/api/v1/", 3 | "eventsUrl": null, 4 | "eventsMaxMissedHeartbeats": 5, 5 | "eventsHeartbeatIntervalTime": 60000, 6 | "eventsReconnectTryInterval": 10000, 7 | "debug": true, 8 | "debugInfo": false, 9 | "defaultLanguage": "en", 10 | "themes": ["taiga"], 11 | "defaultTheme": "taiga", 12 | "publicRegisterEnabled": true, 13 | "feedbackEnabled": true, 14 | "privacyPolicyUrl": null, 15 | "termsOfServiceUrl": null, 16 | "maxUploadFileSize": null, 17 | "contribPlugins": [], 18 | "tribeHost": null, 19 | "importers": [], 20 | "gravatar": true 21 | } 22 | -------------------------------------------------------------------------------- /backend/build.sh: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env bash 2 | 3 | 4 | if [[ -d taiga-back ]]; then 5 | rm -rf taiga-back 6 | fi 7 | 8 | git clone -b stable --single-branch https://github.com/taigaio/taiga-back.git 9 | #git clone https://github.com/taigaio/taiga-back.git 10 | 11 | if [[ $OSTYPE != darwin* ]]; then 12 | sed -i 's/^enum34/#enum34/' taiga-back/requirements.txt 13 | sed -i -e '/sample_data/s/^/#/' taiga-back/regenerate.sh 14 | else 15 | sed -i '.bak' 's/^enum34/#enum34/' taiga-back/requirements.txt 16 | sed -i '.bak' '/sample_data/s/^/#/' taiga-back/regenerate.sh 17 | fi 18 | 19 | cp taiga-back/requirements.txt . 20 | 21 | docker build -t dougg/taiga-back . 22 | -------------------------------------------------------------------------------- /backend/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:3.4.3-onbuild 2 | MAINTAINER Ivan Pedrazas "ipedrazas@gmail.com" 3 | 4 | ENV DEBIAN_FRONTEND noninteractive 5 | 6 | COPY docker-settings.py /usr/src/app/taiga-back/settings/local.py 7 | COPY locale.gen /etc/locale.gen 8 | COPY default.locale /etc/default/locale 9 | 10 | RUN apt-get update && apt-get autoremove -y && apt-get install locales -y 11 | RUN locale-gen en_US.UTF-8 && dpkg-reconfigure locales 12 | 13 | # RUN (cd /taiga && python manage.py collectstatic --noinput) 14 | 15 | WORKDIR /usr/src/app/taiga-back 16 | 17 | EXPOSE 8000 18 | 19 | # Volume definition in docker-compose.yml instead of here, soon 20 | VOLUME ["/taiga/static","/taiga/media"] 21 | 22 | 23 | RUN locale -a 24 | 25 | CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"] 26 | -------------------------------------------------------------------------------- /frontend/nginx.conf: -------------------------------------------------------------------------------- 1 | user root; 2 | worker_processes auto; 3 | 4 | error_log /var/log/nginx/error.log warn; 5 | pid /var/run/nginx.pid; 6 | 7 | 8 | events { 9 | worker_connections 1024; 10 | } 11 | 12 | 13 | http { 14 | include /etc/nginx/mime.types; 15 | default_type application/octet-stream; 16 | 17 | log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 18 | '$status $body_bytes_sent "$http_referer" ' 19 | '"$http_user_agent" "$http_x_forwarded_for"'; 20 | 21 | access_log /var/log/nginx/access.log main; 22 | 23 | sendfile on; 24 | #tcp_nopush on; 25 | 26 | keepalive_timeout 65; 27 | 28 | #gzip on; 29 | 30 | include /etc/nginx/conf.d/*.conf; 31 | } 32 | -------------------------------------------------------------------------------- /setup.sh: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env bash 2 | 3 | if [[ -z "$API_NAME" ]]; then 4 | API_NAME="localhost"; 5 | fi 6 | 7 | echo API_NAME: $API_NAME 8 | 9 | mkdir -p /data/postgres 10 | 11 | #docker pull ipedrazas/taiga-back 12 | #docker pull ipedrazas/taiga-front 13 | 14 | 15 | docker run -d --name postgres -v /data/postgres:/var/lib/postgresql/data postgres 16 | # postgres needs some time to startup 17 | sleep 5 18 | docker run -d --name taiga-back -p 8000:8000 -e API_NAME=$API_NAME --link postgres:postgres ipedrazas/taiga-back 19 | docker run -d --name taiga-front -p 80:80 -e API_NAME=$API_NAME --link taiga-back:taiga-back --volumes-from taiga-back ipedrazas/taiga-front 20 | 21 | docker run -it --link postgres:postgres --rm postgres sh -c "su postgres --command 'createuser -h "'$POSTGRES_PORT_5432_TCP_ADDR'" -p "'$POSTGRES_PORT_5432_TCP_PORT'" -d -r -s taiga'" 22 | docker run -it --link postgres:postgres --rm postgres sh -c "su postgres --command 'createdb -h "'$POSTGRES_PORT_5432_TCP_ADDR'" -p "'$POSTGRES_PORT_5432_TCP_PORT'" -O taiga taiga'"; 23 | docker run -it --rm --link postgres:postgres ipedrazas/taiga-back bash regenerate.sh 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /setup.bat: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | 3 | set api_name=%API_NAME% 4 | 5 | IF "%api_name%" == "" ( 6 | set API_NAME="localhost" 7 | ) 8 | 9 | set postgres_data=%POSTGRES_DATA% 10 | 11 | IF "%postgres_data%" == "" ( 12 | set POSTGRES_DATA=".\data" 13 | ) 14 | 15 | echo API_NAME: %API_NAME% 16 | echo POSTGRES_DATA: %POSTGRES_DATA% 17 | 18 | :: letting the script create the folder will result in ownership conflict with docker 19 | ::IF NOT EXIST %POSTGRES_DATA% ( 20 | :: mkdir %POSTGRES_DATA% 21 | ::) 22 | 23 | docker run -d --name postgres -v %POSTGRES_DATA%:/var/lib/postgresql/data postgres 24 | :: postgres needs some time to startup 25 | sleep 5 26 | docker run -d --name taiga-back -p 8000:8000 -e API_NAME=%API_NAME% --link postgres:postgres ipedrazas/taiga-back 27 | docker run -d --name taiga-front -p 80:80 -e API_NAME=%API_NAME% --link taiga-back:taiga-back --volumes-from taiga-back ipedrazas/taiga-front 28 | 29 | docker run -it --link postgres:postgres --rm postgres sh -c "su postgres --command 'createuser -h "'$POSTGRES_PORT_5432_TCP_ADDR'" -p "'$POSTGRES_PORT_5432_TCP_PORT'" -d -r -s taiga'" 30 | docker run -it --link postgres:postgres --rm postgres sh -c "su postgres --command 'createdb -h "'$POSTGRES_PORT_5432_TCP_ADDR'" -p "'$POSTGRES_PORT_5432_TCP_PORT'" -O taiga taiga'"; 31 | docker run -it --rm --link postgres:postgres ipedrazas/taiga-back bash regenerate.sh 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /frontend/taiga.conf: -------------------------------------------------------------------------------- 1 | server { 2 | listen 80 default_server; 3 | server_name _; 4 | 5 | large_client_header_buffers 4 32k; 6 | client_max_body_size 50M; 7 | charset utf-8; 8 | 9 | access_log /var/log/taiga.access.log; 10 | error_log /var/log/taiga.error.log; 11 | 12 | # Frontend 13 | location / { 14 | root /taiga/; 15 | try_files $uri $uri/ /index.html; 16 | } 17 | 18 | # Backend 19 | location /api { 20 | proxy_set_header Host $http_host; 21 | proxy_set_header X-Real-IP $remote_addr; 22 | proxy_set_header X-Scheme $scheme; 23 | proxy_set_header X-Forwarded-Proto $scheme; 24 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 25 | proxy_pass http://taiga-back:8000/api; 26 | proxy_redirect off; 27 | } 28 | 29 | # Django admin access (/admin/) 30 | location /admin { 31 | proxy_set_header Host $http_host; 32 | proxy_set_header X-Real-IP $remote_addr; 33 | proxy_set_header X-Scheme $scheme; 34 | proxy_set_header X-Forwarded-Proto $scheme; 35 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 36 | proxy_pass http://taiga-back:8000$request_uri; 37 | proxy_redirect off; 38 | } 39 | 40 | # Static files 41 | location /static { 42 | alias /taiga/static; 43 | } 44 | 45 | # Media files 46 | location /media { 47 | alias /taiga/media; 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | all: namespace deploy 2 | 3 | NAMESPACE?=taiga 4 | NODE_SELECTOR?=pool-jenkins 5 | BASE_DOMAIN?=taiga.example.com 6 | BASE_PROTOCOL?=https 7 | 8 | VERSION?=latest 9 | IMAGE_FRONT?=dougg/taiga-front:${VERSION} 10 | IMAGE_BACK?=dougg/taiga-back:${VERSION} 11 | 12 | EMAIL_HOST?= 13 | EMAIL_PORT?= 14 | EMAIL_HOST_USER?= 15 | EMAIL_HOST_PASSWORD?= 16 | DEFAULT_FROM_EMAIL?= 17 | 18 | destroy: 19 | #@echo "Destroying namespace ${NAMESPACE} and everything under it" 20 | #if kubectl get namespace ${NAMESPACE} >/dev/null 2>&1 ; then \ 21 | # kubectl delete namespace ${NAMESPACE} ; \ 22 | #fi 23 | 24 | namespace: 25 | cat k8s/namespace.yaml | NAMESPACE=${NAMESPACE} envsubst | kubectl apply -f - 26 | 27 | deploy: 28 | cat k8s/postgres.yaml | NODE_SELECTOR=${NODE_SELECTOR} envsubst | kubectl apply --namespace=${NAMESPACE} -f - 29 | cat k8s/database-setup.yaml | IMAGE_BACK=${IMAGE_BACK} NODE_SELECTOR=${NODE_SELECTOR} envsubst | kubectl apply --namespace=${NAMESPACE} -f - 30 | cat k8s/taiga.yaml | \ 31 | EMAIL_HOST=${EMAIL_HOST} \ 32 | DEFAULT_FROM_EMAIL=${DEFAULT_FROM_EMAIL} \ 33 | EMAIL_PORT=${EMAIL_PORT} \ 34 | EMAIL_HOST_USER=${EMAIL_HOST_USER} \ 35 | EMAIL_HOST_PASSWORD=${EMAIL_HOST_PASSWORD} \ 36 | IMAGE_FRONT=${IMAGE_FRONT} \ 37 | IMAGE_BACK=${IMAGE_BACK} \ 38 | BASE_DOMAIN=${BASE_DOMAIN} \ 39 | BASE_PROTOCOL=${BASE_PROTOCOL} \ 40 | NODE_SELECTOR=${NODE_SELECTOR} envsubst | kubectl apply --namespace=${NAMESPACE} -f - 41 | 42 | .PHONY: namespace deploy destroy 43 | -------------------------------------------------------------------------------- /k8s/postgres.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: postgres 5 | labels: 6 | app: taiga 7 | tier: postgres 8 | spec: 9 | ports: 10 | - port: 5432 11 | selector: 12 | app: taiga 13 | tier: postgres 14 | clusterIP: None 15 | --- 16 | apiVersion: v1 17 | kind: PersistentVolumeClaim 18 | metadata: 19 | name: postgres-pv-claim 20 | labels: 21 | app: taiga 22 | spec: 23 | accessModes: 24 | - ReadWriteOnce 25 | resources: 26 | requests: 27 | storage: 2Gi 28 | --- 29 | apiVersion: extensions/v1beta1 30 | kind: Deployment 31 | metadata: 32 | name: postgres 33 | labels: 34 | app: taiga 35 | tier: postgres 36 | spec: 37 | strategy: 38 | type: Recreate 39 | template: 40 | metadata: 41 | labels: 42 | app: taiga 43 | tier: postgres 44 | spec: 45 | nodeSelector: 46 | cloud.google.com/gke-nodepool: $NODE_SELECTOR 47 | containers: 48 | - image: postgres 49 | name: postgres 50 | imagePullPolicy: IfNotPresent 51 | env: 52 | - name: POSTGRES_USER 53 | value: taiga 54 | - name: POSTGRES_DB 55 | value: taiga 56 | - name: PGDATA 57 | value: /var/lib/postgresql/data/pgdata 58 | ports: 59 | - containerPort: 5432 60 | name: postgres 61 | volumeMounts: 62 | - name: postgres-persistent-storage 63 | mountPath: /var/lib/postgresql/data 64 | volumes: 65 | - name: postgres-persistent-storage 66 | persistentVolumeClaim: 67 | claimName: postgres-pv-claim 68 | -------------------------------------------------------------------------------- /k8s/taiga.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: fesvc 5 | spec: 6 | ports: 7 | - protocol: TCP 8 | port: 80 9 | targetPort: front 10 | selector: 11 | app: taiga 12 | tier: web 13 | type: NodePort 14 | --- 15 | apiVersion: v1 16 | kind: PersistentVolumeClaim 17 | metadata: 18 | name: taigastatic-pv-claim 19 | labels: 20 | app: taiga 21 | spec: 22 | accessModes: 23 | - ReadWriteOnce 24 | resources: 25 | requests: 26 | storage: 2Gi 27 | --- 28 | apiVersion: v1 29 | kind: PersistentVolumeClaim 30 | metadata: 31 | name: taigamedia-pv-claim 32 | labels: 33 | app: taiga 34 | spec: 35 | accessModes: 36 | - ReadWriteOnce 37 | resources: 38 | requests: 39 | storage: 2Gi 40 | --- 41 | apiVersion: extensions/v1beta1 42 | kind: Deployment 43 | metadata: 44 | name: taiga-web 45 | spec: 46 | strategy: 47 | type: Recreate 48 | template: 49 | metadata: 50 | labels: 51 | app: taiga 52 | tier: web 53 | spec: 54 | hostAliases: 55 | - ip: "127.0.0.1" 56 | hostnames: 57 | - "taiga-back" 58 | nodeSelector: 59 | cloud.google.com/gke-nodepool: $NODE_SELECTOR 60 | containers: 61 | 62 | - name: front 63 | image: $IMAGE_FRONT 64 | ports: 65 | - containerPort: 80 66 | name: front 67 | env: 68 | - name: BASE_PROTOCOL 69 | value: $BASE_PROTOCOL 70 | - name: BASE_DOMAIN 71 | value: $BASE_DOMAIN 72 | 73 | - name: back 74 | image: $IMAGE_BACK 75 | ports: 76 | - containerPort: 8000 77 | name: back 78 | env: 79 | - name: EMAIL_HOST 80 | value: "$EMAIL_HOST" 81 | - name: EMAIL_PORT 82 | value: "$EMAIL_PORT" 83 | - name: EMAIL_HOST_USER 84 | value: "$EMAIL_HOST_USER" 85 | - name: EMAIL_HOST_PASSWORD 86 | value: "$EMAIL_HOST_PASSWORD" 87 | - name: DEFAULT_FROM_EMAIL 88 | value: "$DEFAULT_FROM_EMAIL" 89 | - name: BASE_PROTOCOL 90 | value: $BASE_PROTOCOL 91 | - name: BASE_DOMAIN 92 | value: $BASE_DOMAIN 93 | 94 | volumeMounts: 95 | - name: taigastatic-persistent-storage 96 | mountPath: /taiga/static 97 | - name: taigamedia-persistent-storage 98 | mountPath: /taiga/media 99 | volumes: 100 | - name: taigastatic-persistent-storage 101 | persistentVolumeClaim: 102 | claimName: taigastatic-pv-claim 103 | - name: taigamedia-persistent-storage 104 | persistentVolumeClaim: 105 | claimName: taigamedia-pv-claim 106 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Stories in Ready](https://badge.waffle.io/ipedrazas/taiga-docker.png?label=ready&title=Ready)](https://waffle.io/ipedrazas/taiga-docker) 2 | # taiga-docker 3 | 4 | Docker scripts to run your own [Taiga](https://Taiga.io/). 5 | 6 | 7 | External Dependencies: 8 | 9 | * [PostgreSQL](https://registry.hub.docker.com/_/postgres/) 10 | 11 | Taiga 12 | 13 | * [taiga-back](https://github.com/taigaio/taiga-back): Django backend 14 | * [taiga-front](https://github.com/taigaio/taiga-front): Angular.js frontend 15 | 16 | 17 | By far the easiest way of setting up Taiga in Docker is by running the `setup.sh` script. So, if you just want to run it and you just don't care about what happens underneath, just run that script. 18 | 19 | There's a catch. The API url has to be specified. Taiga frontend is javascript, so, we have to inject the value of the hostname where taiga-back runs. We can do that by defining an environment variable 20 | 21 | export API_NAME=boot2docker 22 | 23 | For example, it will make the requests to `http://boot2docker:8000/api/v1/...` If you don't define this variable the script will assume it's `localhost` (if you're using `boot2docker` it will not work). 24 | 25 | If you want to run the frontend manually, this is the command: 26 | 27 | docker run -d --name taiga-front -p 80:80 -e API_NAME=$API_NAME --link taiga-back:taiga-back ipedrazas/taiga-front 28 | 29 | 30 | Once you've successfully installed Taiga start a web browser and point it to `http://localhost` or `http://boot2docker`. You should be greeted by a login page. The administrators username is `admin`, and the password is `123123`. 31 | 32 | If you cannot authenticate, probably is that the API_NAME has not been set properly. 33 | 34 | There is another script `run.sh` that you can use to start your taiga containers once the installation has been succesful. You don't have to run it after the setup, just after stopping the containers. 35 | 36 | ### Postgresql 37 | 38 | We run a container based on the original image provided by [PostgreSQL](https://registry.hub.docker.com/_/postgres/) 39 | 40 | docker run -d --name postgres postgres 41 | 42 | **Note about Volumes** 43 | 44 | If you try to mount volumes in OSX using `boot2docker` you will see that it does not work. This is known problem and it only affects OSX. There's a solution though. You might want to extend the postgres docker image and add this line: 45 | 46 | `RUN usermod -u 1000 postgres` 47 | 48 | This change will fix the permission problem when mounting a volume. 49 | 50 | **To initialise the database** 51 | 52 | docker run -it --link postgres:postgres --rm postgres sh -c "su postgres --command 'createuser -h "'$POSTGRES_PORT_5432_TCP_ADDR'" -p "'$POSTGRES_PORT_5432_TCP_PORT'" -d -r -s taiga'" 53 | 54 | docker run -it --link postgres:postgres --rm postgres sh -c "su postgres --command 'createdb -h "'$POSTGRES_PORT_5432_TCP_ADDR'" -p "'$POSTGRES_PORT_5432_TCP_PORT'" -O taiga taiga'"; 55 | 56 | If you want to access the database, run the following container: 57 | 58 | docker run -it --link postgres:postgres --rm postgres sh -c 'exec psql -h "$POSTGRES_PORT_5432_TCP_ADDR" -p "$POSTGRES_PORT_5432_TCP_PORT" -U postgres' 59 | 60 | Once you are in psql you can check that indeed our user & database have been created: 61 | 62 | # To list the users defined in our system use the following command 63 | \du 64 | # To list the databases, the command is 65 | \list 66 | 67 | 68 | ### Taiga-Back 69 | 70 | Before running our backend, we have to populate our database, to do so, Taiga provides a regenerate script that creates all the tables and even some testing data 71 | 72 | # pull the image 73 | docker pull ipedrazas/taiga-back 74 | 75 | # regenerate tables 76 | docker run -it --rm --link postgres:postgres ipedrazas/taiga-back bash regenerate.sh 77 | 78 | Once the database has been populated, we can start our Django application: 79 | 80 | docker run -d -p 8000:8000 --name taiga-back --link postgres:postgres ipedrazas/taiga-back 81 | 82 | 83 | ### Taiga-Front 84 | 85 | 86 | Finally, we run the frontend 87 | 88 | # pull the image 89 | docker pull ipedrazas/taiga-front 90 | 91 | # run the frontend 92 | docker run -d -p 80:80 --link taiga-back:taiga-back --volumes-from taiga-back ipedrazas/taiga-front 93 | 94 | 95 | The frontend needs to know the URL of the backend. Those settings are specified in the `frontend/conf.json` file. You can modify them and re-add them into the image by using a volume 96 | 97 | docker run -d -p 80:80 --link taiga-back:taiga-back -v "$(pwd)"/frontend/conf.json:/taiga/js/conf.json:ro ipedrazas/taiga-front 98 | 99 | 100 | ## What's next? 101 | 102 | The docker compose file needs some love and care but the next is to add RabbitMQ and the Taiga events plugged in. 103 | -------------------------------------------------------------------------------- /backend/docker-settings.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Copyright (C) 2014-2017 Andrey Antukh 3 | # Copyright (C) 2014-2017 Jesús Espino 4 | # Copyright (C) 2014-2017 David Barragán 5 | # Copyright (C) 2014-2017 Alejandro Alonso 6 | # This program is free software: you can redistribute it and/or modify 7 | # it under the terms of the GNU Affero General Public License as 8 | # published by the Free Software Foundation, either version 3 of the 9 | # License, or (at your option) any later version. 10 | # 11 | # This program is distributed in the hope that it will be useful, 12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | # GNU Affero General Public License for more details. 15 | # 16 | # You should have received a copy of the GNU Affero General Public License 17 | # along with this program. If not, see . 18 | 19 | from .development import * 20 | 21 | ######################################### 22 | ## GENERIC 23 | ######################################### 24 | 25 | #DEBUG = False 26 | 27 | #ADMINS = ( 28 | # ("Admin", "example@example.com"), 29 | #) 30 | 31 | DATABASES = { 32 | "default": { 33 | "ENGINE": "django.db.backends.postgresql", 34 | "NAME": "taiga", 35 | "HOST": "postgres", 36 | "USER": "taiga", 37 | "PASSWORD": "thisisthetaigapassword", 38 | } 39 | } 40 | 41 | SITES = { 42 | "api": { 43 | "scheme": "http", 44 | "domain": "localhost:8000", 45 | "name": "api" 46 | }, 47 | "front": { 48 | "scheme": os.getenv("BASE_PROTOCOL"), 49 | "domain": os.getenv("BASE_DOMAIN"), 50 | "name": "front" 51 | }, 52 | } 53 | 54 | #SITE_ID = "api" 55 | 56 | #MEDIA_ROOT = '/home/taiga/media' 57 | #STATIC_ROOT = '/home/taiga/static' 58 | 59 | 60 | ######################################### 61 | ## THROTTLING 62 | ######################################### 63 | 64 | #REST_FRAMEWORK["DEFAULT_THROTTLE_RATES"] = { 65 | # "anon-write": "20/min", 66 | # "user-write": None, 67 | # "anon-read": None, 68 | # "user-read": None, 69 | # "import-mode": None, 70 | # "import-dump-mode": "1/minute", 71 | # "create-memberships": None, 72 | # "login-fail": None, 73 | # "register-success": None, 74 | # "user-detail": None, 75 | # "user-update": None, 76 | #} 77 | 78 | # This list should containt: 79 | # - Tiga users IDs 80 | # - Valid clients IP addresses (X-Forwarded-For header) 81 | #REST_FRAMEWORK["DEFAULT_THROTTLE_WHITELIST"] = [] 82 | 83 | 84 | ######################################### 85 | ## MAIL SYSTEM SETTINGS 86 | ######################################### 87 | 88 | DEFAULT_FROM_EMAIL = os.getenv("DEFAULT_FROM_EMAIL") 89 | #CHANGE_NOTIFICATIONS_MIN_INTERVAL = 300 #seconds 90 | 91 | # EMAIL SETTINGS EXAMPLE 92 | EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' 93 | EMAIL_USE_TLS = True 94 | EMAIL_HOST = os.getenv("EMAIL_HOST") 95 | EMAIL_PORT = os.getenv("EMAIL_PORT") 96 | EMAIL_HOST_USER = os.getenv("EMAIL_HOST_USER") 97 | EMAIL_HOST_PASSWORD = os.getenv("EMAIL_HOST_PASSWORD") 98 | 99 | # GMAIL SETTINGS EXAMPLE 100 | #EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' 101 | #EMAIL_USE_TLS = True 102 | #EMAIL_HOST = 'smtp.gmail.com' 103 | #EMAIL_PORT = 587 104 | #EMAIL_HOST_USER = 'youremail@gmail.com' 105 | #EMAIL_HOST_PASSWORD = 'yourpassword' 106 | 107 | 108 | ######################################### 109 | ## REGISTRATION 110 | ######################################### 111 | 112 | #PUBLIC_REGISTER_ENABLED = True 113 | 114 | # LIMIT ALLOWED DOMAINS FOR REGISTER AND INVITE 115 | # None or [] values in USER_EMAIL_ALLOWED_DOMAINS means allow any domain 116 | #USER_EMAIL_ALLOWED_DOMAINS = None 117 | 118 | # PUCLIC OR PRIVATE NUMBER OF PROJECT PER USER 119 | #MAX_PRIVATE_PROJECTS_PER_USER = None # None == no limit 120 | #MAX_PUBLIC_PROJECTS_PER_USER = None # None == no limit 121 | #MAX_MEMBERSHIPS_PRIVATE_PROJECTS = None # None == no limit 122 | #MAX_MEMBERSHIPS_PUBLIC_PROJECTS = None # None == no limit 123 | 124 | # GITHUB SETTINGS 125 | #GITHUB_URL = "https://github.com/" 126 | #GITHUB_API_URL = "https://api.github.com/" 127 | #GITHUB_API_CLIENT_ID = "yourgithubclientid" 128 | #GITHUB_API_CLIENT_SECRET = "yourgithubclientsecret" 129 | 130 | 131 | ######################################### 132 | ## SITEMAP 133 | ######################################### 134 | 135 | # If is True /front/sitemap.xml show a valid sitemap of taiga-front client 136 | #FRONT_SITEMAP_ENABLED = False 137 | #FRONT_SITEMAP_CACHE_TIMEOUT = 24*60*60 # In second 138 | 139 | 140 | ######################################### 141 | ## FEEDBACK 142 | ######################################### 143 | 144 | # Note: See config in taiga-front too 145 | #FEEDBACK_ENABLED = True 146 | #FEEDBACK_EMAIL = "support@taiga.io" 147 | 148 | 149 | ######################################### 150 | ## STATS 151 | ######################################### 152 | 153 | #STATS_ENABLED = False 154 | #FRONT_SITEMAP_CACHE_TIMEOUT = 60*60 # In second 155 | 156 | 157 | ######################################### 158 | ## CELERY 159 | ######################################### 160 | # Set to True to enable celery and work in async mode or False 161 | # to disable it and work in sync mode. You can find the celery 162 | # settings in settings/celery.py and settings/celery-local.py 163 | #CELERY_ENABLED = True 164 | 165 | 166 | ######################################### 167 | ## IMPORTERS 168 | ######################################### 169 | 170 | # Configuration for the GitHub importer 171 | # Remember to enable it in the front client too. 172 | #IMPORTERS["github"] = { 173 | # "active": True, # Enable or disable the importer 174 | # "client_id": "XXXXXX_get_a_valid_client_id_from_github_XXXXXX", 175 | # "client_secret": "XXXXXX_get_a_valid_client_secret_from_github_XXXXXX" 176 | #} 177 | 178 | # Configuration for the Trello importer 179 | # Remember to enable it in the front client too. 180 | #IMPORTERS["trello"] = { 181 | # "active": True, # Enable or disable the importer 182 | # "api_key": "XXXXXX_get_a_valid_api_key_from_trello_XXXXXX", 183 | # "secret_key": "XXXXXX_get_a_valid_secret_key_from_trello_XXXXXX" 184 | #} 185 | 186 | # Configuration for the Jira importer 187 | # Remember to enable it in the front client too. 188 | #IMPORTERS["jira"] = { 189 | # "active": True, # Enable or disable the importer 190 | # "consumer_key": "XXXXXX_get_a_valid_consumer_key_from_jira_XXXXXX", 191 | # "cert": "XXXXXX_get_a_valid_cert_from_jira_XXXXXX", 192 | # "pub_cert": "XXXXXX_get_a_valid_pub_cert_from_jira_XXXXXX" 193 | #} 194 | 195 | # Configuration for the Asane importer 196 | # Remember to enable it in the front client too. 197 | #IMPORTERS["asana"] = { 198 | # "active": True, # Enable or disable the importer 199 | # "callback_url": "{}://{}/project/new/import/asana".format(SITES["front"]["scheme"], 200 | # SITES["front"]["domain"]), 201 | # "app_id": "XXXXXX_get_a_valid_app_id_from_asana_XXXXXX", 202 | # "app_secret": "XXXXXX_get_a_valid_app_secret_from_asana_XXXXXX" 203 | #} 204 | -------------------------------------------------------------------------------- /backend/locale.gen: -------------------------------------------------------------------------------- 1 | # This file lists locales that you wish to have built. You can find a list 2 | # of valid supported locales at /usr/share/i18n/SUPPORTED, and you can add 3 | # user defined locales to /usr/local/share/i18n/SUPPORTED. If you change 4 | # this file, you need to rerun locale-gen. 5 | 6 | 7 | # aa_DJ ISO-8859-1 8 | # aa_DJ.UTF-8 UTF-8 9 | # aa_ER UTF-8 10 | # aa_ER@saaho UTF-8 11 | # aa_ET UTF-8 12 | # af_ZA ISO-8859-1 13 | # af_ZA.UTF-8 UTF-8 14 | # ak_GH UTF-8 15 | # am_ET UTF-8 16 | # an_ES ISO-8859-15 17 | # an_ES.UTF-8 UTF-8 18 | # anp_IN UTF-8 19 | # ar_AE ISO-8859-6 20 | # ar_AE.UTF-8 UTF-8 21 | # ar_BH ISO-8859-6 22 | # ar_BH.UTF-8 UTF-8 23 | # ar_DZ ISO-8859-6 24 | # ar_DZ.UTF-8 UTF-8 25 | # ar_EG ISO-8859-6 26 | # ar_EG.UTF-8 UTF-8 27 | # ar_IN UTF-8 28 | # ar_IQ ISO-8859-6 29 | # ar_IQ.UTF-8 UTF-8 30 | # ar_JO ISO-8859-6 31 | # ar_JO.UTF-8 UTF-8 32 | # ar_KW ISO-8859-6 33 | # ar_KW.UTF-8 UTF-8 34 | # ar_LB ISO-8859-6 35 | # ar_LB.UTF-8 UTF-8 36 | # ar_LY ISO-8859-6 37 | # ar_LY.UTF-8 UTF-8 38 | # ar_MA ISO-8859-6 39 | # ar_MA.UTF-8 UTF-8 40 | # ar_OM ISO-8859-6 41 | # ar_OM.UTF-8 UTF-8 42 | # ar_QA ISO-8859-6 43 | # ar_QA.UTF-8 UTF-8 44 | # ar_SA ISO-8859-6 45 | # ar_SA.UTF-8 UTF-8 46 | # ar_SD ISO-8859-6 47 | # ar_SD.UTF-8 UTF-8 48 | # ar_SS UTF-8 49 | # ar_SY ISO-8859-6 50 | # ar_SY.UTF-8 UTF-8 51 | # ar_TN ISO-8859-6 52 | # ar_TN.UTF-8 UTF-8 53 | # ar_YE ISO-8859-6 54 | # ar_YE.UTF-8 UTF-8 55 | # as_IN UTF-8 56 | # ast_ES ISO-8859-15 57 | # ast_ES.UTF-8 UTF-8 58 | # ayc_PE UTF-8 59 | # az_AZ UTF-8 60 | # be_BY CP1251 61 | # be_BY.UTF-8 UTF-8 62 | # be_BY@latin UTF-8 63 | # bem_ZM UTF-8 64 | # ber_DZ UTF-8 65 | # ber_MA UTF-8 66 | # bg_BG CP1251 67 | # bg_BG.UTF-8 UTF-8 68 | # bho_IN UTF-8 69 | # bn_BD UTF-8 70 | # bn_IN UTF-8 71 | # bo_CN UTF-8 72 | # bo_IN UTF-8 73 | # br_FR ISO-8859-1 74 | # br_FR.UTF-8 UTF-8 75 | # br_FR@euro ISO-8859-15 76 | # brx_IN UTF-8 77 | # bs_BA ISO-8859-2 78 | # bs_BA.UTF-8 UTF-8 79 | # byn_ER UTF-8 80 | # ca_AD ISO-8859-15 81 | # ca_AD.UTF-8 UTF-8 82 | # ca_ES ISO-8859-1 83 | # ca_ES.UTF-8 UTF-8 84 | # ca_ES.UTF-8@valencia UTF-8 85 | # ca_ES@euro ISO-8859-15 86 | # ca_ES@valencia ISO-8859-15 87 | # ca_FR ISO-8859-15 88 | # ca_FR.UTF-8 UTF-8 89 | # ca_IT ISO-8859-15 90 | # ca_IT.UTF-8 UTF-8 91 | # cmn_TW UTF-8 92 | # crh_UA UTF-8 93 | # cs_CZ ISO-8859-2 94 | # cs_CZ.UTF-8 UTF-8 95 | # csb_PL UTF-8 96 | # cv_RU UTF-8 97 | # cy_GB ISO-8859-14 98 | # cy_GB.UTF-8 UTF-8 99 | # da_DK ISO-8859-1 100 | # da_DK.UTF-8 UTF-8 101 | # de_AT ISO-8859-1 102 | # de_AT.UTF-8 UTF-8 103 | # de_AT@euro ISO-8859-15 104 | # de_BE ISO-8859-1 105 | # de_BE.UTF-8 UTF-8 106 | # de_BE@euro ISO-8859-15 107 | # de_CH ISO-8859-1 108 | # de_CH.UTF-8 UTF-8 109 | # de_DE ISO-8859-1 110 | # de_DE.UTF-8 UTF-8 111 | # de_DE@euro ISO-8859-15 112 | # de_LI.UTF-8 UTF-8 113 | # de_LU ISO-8859-1 114 | # de_LU.UTF-8 UTF-8 115 | # de_LU@euro ISO-8859-15 116 | # doi_IN UTF-8 117 | # dv_MV UTF-8 118 | # dz_BT UTF-8 119 | # el_CY ISO-8859-7 120 | # el_CY.UTF-8 UTF-8 121 | # el_GR ISO-8859-7 122 | # el_GR.UTF-8 UTF-8 123 | # en_AG UTF-8 124 | # en_AU ISO-8859-1 125 | # en_AU.UTF-8 UTF-8 126 | # en_BW ISO-8859-1 127 | # en_BW.UTF-8 UTF-8 128 | # en_CA ISO-8859-1 129 | # en_CA.UTF-8 UTF-8 130 | # en_DK ISO-8859-1 131 | # en_DK.ISO-8859-15 ISO-8859-15 132 | # en_DK.UTF-8 UTF-8 133 | # en_GB ISO-8859-1 134 | # en_GB.ISO-8859-15 ISO-8859-15 135 | # en_GB.UTF-8 UTF-8 136 | # en_HK ISO-8859-1 137 | # en_HK.UTF-8 UTF-8 138 | # en_IE ISO-8859-1 139 | # en_IE.UTF-8 UTF-8 140 | # en_IE@euro ISO-8859-15 141 | # en_IN UTF-8 142 | # en_NG UTF-8 143 | # en_NZ ISO-8859-1 144 | # en_NZ.UTF-8 UTF-8 145 | # en_PH ISO-8859-1 146 | # en_PH.UTF-8 UTF-8 147 | # en_SG ISO-8859-1 148 | # en_SG.UTF-8 UTF-8 149 | # en_US ISO-8859-1 150 | # en_US.ISO-8859-15 ISO-8859-15 151 | en_US.UTF-8 UTF-8 152 | # en_ZA ISO-8859-1 153 | # en_ZA.UTF-8 UTF-8 154 | # en_ZM UTF-8 155 | # en_ZW ISO-8859-1 156 | # en_ZW.UTF-8 UTF-8 157 | # eo ISO-8859-3 158 | # eo.UTF-8 UTF-8 159 | # es_AR ISO-8859-1 160 | # es_AR.UTF-8 UTF-8 161 | # es_BO ISO-8859-1 162 | # es_BO.UTF-8 UTF-8 163 | # es_CL ISO-8859-1 164 | # es_CL.UTF-8 UTF-8 165 | # es_CO ISO-8859-1 166 | # es_CO.UTF-8 UTF-8 167 | # es_CR ISO-8859-1 168 | # es_CR.UTF-8 UTF-8 169 | # es_CU UTF-8 170 | # es_DO ISO-8859-1 171 | # es_DO.UTF-8 UTF-8 172 | # es_EC ISO-8859-1 173 | # es_EC.UTF-8 UTF-8 174 | # es_ES ISO-8859-1 175 | # es_ES.UTF-8 UTF-8 176 | # es_ES@euro ISO-8859-15 177 | # es_GT ISO-8859-1 178 | # es_GT.UTF-8 UTF-8 179 | # es_HN ISO-8859-1 180 | # es_HN.UTF-8 UTF-8 181 | # es_MX ISO-8859-1 182 | # es_MX.UTF-8 UTF-8 183 | # es_NI ISO-8859-1 184 | # es_NI.UTF-8 UTF-8 185 | # es_PA ISO-8859-1 186 | # es_PA.UTF-8 UTF-8 187 | # es_PE ISO-8859-1 188 | # es_PE.UTF-8 UTF-8 189 | # es_PR ISO-8859-1 190 | # es_PR.UTF-8 UTF-8 191 | # es_PY ISO-8859-1 192 | # es_PY.UTF-8 UTF-8 193 | # es_SV ISO-8859-1 194 | # es_SV.UTF-8 UTF-8 195 | # es_US ISO-8859-1 196 | # es_US.UTF-8 UTF-8 197 | # es_UY ISO-8859-1 198 | # es_UY.UTF-8 UTF-8 199 | # es_VE ISO-8859-1 200 | # es_VE.UTF-8 UTF-8 201 | # et_EE ISO-8859-1 202 | # et_EE.ISO-8859-15 ISO-8859-15 203 | # et_EE.UTF-8 UTF-8 204 | # eu_ES ISO-8859-1 205 | # eu_ES.UTF-8 UTF-8 206 | # eu_ES@euro ISO-8859-15 207 | # eu_FR ISO-8859-1 208 | # eu_FR.UTF-8 UTF-8 209 | # eu_FR@euro ISO-8859-15 210 | # fa_IR UTF-8 211 | # ff_SN UTF-8 212 | # fi_FI ISO-8859-1 213 | # fi_FI.UTF-8 UTF-8 214 | # fi_FI@euro ISO-8859-15 215 | # fil_PH UTF-8 216 | # fo_FO ISO-8859-1 217 | # fo_FO.UTF-8 UTF-8 218 | # fr_BE ISO-8859-1 219 | # fr_BE.UTF-8 UTF-8 220 | # fr_BE@euro ISO-8859-15 221 | # fr_CA ISO-8859-1 222 | # fr_CA.UTF-8 UTF-8 223 | # fr_CH ISO-8859-1 224 | # fr_CH.UTF-8 UTF-8 225 | # fr_FR ISO-8859-1 226 | # fr_FR.UTF-8 UTF-8 227 | # fr_FR@euro ISO-8859-15 228 | # fr_LU ISO-8859-1 229 | # fr_LU.UTF-8 UTF-8 230 | # fr_LU@euro ISO-8859-15 231 | # fur_IT UTF-8 232 | # fy_DE UTF-8 233 | # fy_NL UTF-8 234 | # ga_IE ISO-8859-1 235 | # ga_IE.UTF-8 UTF-8 236 | # ga_IE@euro ISO-8859-15 237 | # gd_GB ISO-8859-15 238 | # gd_GB.UTF-8 UTF-8 239 | # gez_ER UTF-8 240 | # gez_ER@abegede UTF-8 241 | # gez_ET UTF-8 242 | # gez_ET@abegede UTF-8 243 | # gl_ES ISO-8859-1 244 | # gl_ES.UTF-8 UTF-8 245 | # gl_ES@euro ISO-8859-15 246 | # gu_IN UTF-8 247 | # gv_GB ISO-8859-1 248 | # gv_GB.UTF-8 UTF-8 249 | # ha_NG UTF-8 250 | # hak_TW UTF-8 251 | # he_IL ISO-8859-8 252 | # he_IL.UTF-8 UTF-8 253 | # hi_IN UTF-8 254 | # hne_IN UTF-8 255 | # hr_HR ISO-8859-2 256 | # hr_HR.UTF-8 UTF-8 257 | # hsb_DE ISO-8859-2 258 | # hsb_DE.UTF-8 UTF-8 259 | # ht_HT UTF-8 260 | # hu_HU ISO-8859-2 261 | # hu_HU.UTF-8 UTF-8 262 | # hy_AM UTF-8 263 | # hy_AM.ARMSCII-8 ARMSCII-8 264 | # ia_FR UTF-8 265 | # id_ID ISO-8859-1 266 | # id_ID.UTF-8 UTF-8 267 | # ig_NG UTF-8 268 | # ik_CA UTF-8 269 | # is_IS ISO-8859-1 270 | # is_IS.UTF-8 UTF-8 271 | # it_CH ISO-8859-1 272 | # it_CH.UTF-8 UTF-8 273 | # it_IT ISO-8859-1 274 | # it_IT.UTF-8 UTF-8 275 | # it_IT@euro ISO-8859-15 276 | # iu_CA UTF-8 277 | # iw_IL ISO-8859-8 278 | # iw_IL.UTF-8 UTF-8 279 | # ja_JP.EUC-JP EUC-JP 280 | # ja_JP.UTF-8 UTF-8 281 | # ka_GE GEORGIAN-PS 282 | # ka_GE.UTF-8 UTF-8 283 | # kk_KZ PT154 284 | # kk_KZ RK1048 285 | # kk_KZ.UTF-8 UTF-8 286 | # kl_GL ISO-8859-1 287 | # kl_GL.UTF-8 UTF-8 288 | # km_KH UTF-8 289 | # kn_IN UTF-8 290 | # ko_KR.EUC-KR EUC-KR 291 | # ko_KR.UTF-8 UTF-8 292 | # kok_IN UTF-8 293 | # ks_IN UTF-8 294 | # ks_IN@devanagari UTF-8 295 | # ku_TR ISO-8859-9 296 | # ku_TR.UTF-8 UTF-8 297 | # kw_GB ISO-8859-1 298 | # kw_GB.UTF-8 UTF-8 299 | # ky_KG UTF-8 300 | # lb_LU UTF-8 301 | # lg_UG ISO-8859-10 302 | # lg_UG.UTF-8 UTF-8 303 | # li_BE UTF-8 304 | # li_NL UTF-8 305 | # lij_IT UTF-8 306 | # lo_LA UTF-8 307 | # lt_LT ISO-8859-13 308 | # lt_LT.UTF-8 UTF-8 309 | # lv_LV ISO-8859-13 310 | # lv_LV.UTF-8 UTF-8 311 | # lzh_TW UTF-8 312 | # mag_IN UTF-8 313 | # mai_IN UTF-8 314 | # mg_MG ISO-8859-15 315 | # mg_MG.UTF-8 UTF-8 316 | # mhr_RU UTF-8 317 | # mi_NZ ISO-8859-13 318 | # mi_NZ.UTF-8 UTF-8 319 | # mk_MK ISO-8859-5 320 | # mk_MK.UTF-8 UTF-8 321 | # ml_IN UTF-8 322 | # mn_MN UTF-8 323 | # mni_IN UTF-8 324 | # mr_IN UTF-8 325 | # ms_MY ISO-8859-1 326 | # ms_MY.UTF-8 UTF-8 327 | # mt_MT ISO-8859-3 328 | # mt_MT.UTF-8 UTF-8 329 | # my_MM UTF-8 330 | # nan_TW UTF-8 331 | # nan_TW@latin UTF-8 332 | # nb_NO ISO-8859-1 333 | # nb_NO.UTF-8 UTF-8 334 | # nds_DE UTF-8 335 | # nds_NL UTF-8 336 | # ne_NP UTF-8 337 | # nhn_MX UTF-8 338 | # niu_NU UTF-8 339 | # niu_NZ UTF-8 340 | # nl_AW UTF-8 341 | # nl_BE ISO-8859-1 342 | # nl_BE.UTF-8 UTF-8 343 | # nl_BE@euro ISO-8859-15 344 | # nl_NL ISO-8859-1 345 | # nl_NL.UTF-8 UTF-8 346 | # nl_NL@euro ISO-8859-15 347 | # nn_NO ISO-8859-1 348 | # nn_NO.UTF-8 UTF-8 349 | # nr_ZA UTF-8 350 | # nso_ZA UTF-8 351 | # oc_FR ISO-8859-1 352 | # oc_FR.UTF-8 UTF-8 353 | # om_ET UTF-8 354 | # om_KE ISO-8859-1 355 | # om_KE.UTF-8 UTF-8 356 | # or_IN UTF-8 357 | # os_RU UTF-8 358 | # pa_IN UTF-8 359 | # pa_PK UTF-8 360 | # pap_AN UTF-8 361 | # pap_AW UTF-8 362 | # pap_CW UTF-8 363 | # pl_PL ISO-8859-2 364 | # pl_PL.UTF-8 UTF-8 365 | # ps_AF UTF-8 366 | # pt_BR ISO-8859-1 367 | # pt_BR.UTF-8 UTF-8 368 | # pt_PT ISO-8859-1 369 | # pt_PT.UTF-8 UTF-8 370 | # pt_PT@euro ISO-8859-15 371 | # quz_PE UTF-8 372 | # ro_RO ISO-8859-2 373 | # ro_RO.UTF-8 UTF-8 374 | # ru_RU ISO-8859-5 375 | # ru_RU.CP1251 CP1251 376 | # ru_RU.KOI8-R KOI8-R 377 | # ru_RU.UTF-8 UTF-8 378 | # ru_UA KOI8-U 379 | # ru_UA.UTF-8 UTF-8 380 | # rw_RW UTF-8 381 | # sa_IN UTF-8 382 | # sat_IN UTF-8 383 | # sc_IT UTF-8 384 | # sd_IN UTF-8 385 | # sd_IN@devanagari UTF-8 386 | # se_NO UTF-8 387 | # shs_CA UTF-8 388 | # si_LK UTF-8 389 | # sid_ET UTF-8 390 | # sk_SK ISO-8859-2 391 | # sk_SK.UTF-8 UTF-8 392 | # sl_SI ISO-8859-2 393 | # sl_SI.UTF-8 UTF-8 394 | # so_DJ ISO-8859-1 395 | # so_DJ.UTF-8 UTF-8 396 | # so_ET UTF-8 397 | # so_KE ISO-8859-1 398 | # so_KE.UTF-8 UTF-8 399 | # so_SO ISO-8859-1 400 | # so_SO.UTF-8 UTF-8 401 | # sq_AL ISO-8859-1 402 | # sq_AL.UTF-8 UTF-8 403 | # sq_MK UTF-8 404 | # sr_ME UTF-8 405 | # sr_RS UTF-8 406 | # sr_RS@latin UTF-8 407 | # ss_ZA UTF-8 408 | # st_ZA ISO-8859-1 409 | # st_ZA.UTF-8 UTF-8 410 | # sv_FI ISO-8859-1 411 | # sv_FI.UTF-8 UTF-8 412 | # sv_FI@euro ISO-8859-15 413 | # sv_SE ISO-8859-1 414 | # sv_SE.ISO-8859-15 ISO-8859-15 415 | # sv_SE.UTF-8 UTF-8 416 | # sw_KE UTF-8 417 | # sw_TZ UTF-8 418 | # szl_PL UTF-8 419 | # ta_IN UTF-8 420 | # ta_LK UTF-8 421 | # te_IN UTF-8 422 | # tg_TJ KOI8-T 423 | # tg_TJ.UTF-8 UTF-8 424 | # th_TH TIS-620 425 | # th_TH.UTF-8 UTF-8 426 | # the_NP UTF-8 427 | # ti_ER UTF-8 428 | # ti_ET UTF-8 429 | # tig_ER UTF-8 430 | # tk_TM UTF-8 431 | # tl_PH ISO-8859-1 432 | # tl_PH.UTF-8 UTF-8 433 | # tn_ZA UTF-8 434 | # tr_CY ISO-8859-9 435 | # tr_CY.UTF-8 UTF-8 436 | # tr_TR ISO-8859-9 437 | # tr_TR.UTF-8 UTF-8 438 | # ts_ZA UTF-8 439 | # tt_RU UTF-8 440 | # tt_RU@iqtelif UTF-8 441 | # ug_CN UTF-8 442 | # uk_UA KOI8-U 443 | # uk_UA.UTF-8 UTF-8 444 | # unm_US UTF-8 445 | # ur_IN UTF-8 446 | # ur_PK UTF-8 447 | # uz_UZ ISO-8859-1 448 | # uz_UZ.UTF-8 UTF-8 449 | # uz_UZ@cyrillic UTF-8 450 | # ve_ZA UTF-8 451 | # vi_VN UTF-8 452 | # wa_BE ISO-8859-1 453 | # wa_BE.UTF-8 UTF-8 454 | # wa_BE@euro ISO-8859-15 455 | # wae_CH UTF-8 456 | # wal_ET UTF-8 457 | # wo_SN UTF-8 458 | # xh_ZA ISO-8859-1 459 | # xh_ZA.UTF-8 UTF-8 460 | # yi_US CP1255 461 | # yi_US.UTF-8 UTF-8 462 | # yo_NG UTF-8 463 | # yue_HK UTF-8 464 | # zh_CN GB2312 465 | # zh_CN.GB18030 GB18030 466 | # zh_CN.GBK GBK 467 | # zh_CN.UTF-8 UTF-8 468 | # zh_HK BIG5-HKSCS 469 | # zh_HK.UTF-8 UTF-8 470 | # zh_SG GB2312 471 | # zh_SG.GBK GBK 472 | # zh_SG.UTF-8 UTF-8 473 | # zh_TW BIG5 474 | # zh_TW.EUC-TW EUC-TW 475 | # zh_TW.UTF-8 UTF-8 476 | # zu_ZA ISO-8859-1 477 | # zu_ZA.UTF-8 UTF-8 478 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "{}" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright {yyyy} {name of copyright owner} 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | 203 | --------------------------------------------------------------------------------