From 0705ac49263fd0f8972d4dfc3043b38068a755c9 Mon Sep 17 00:00:00 2001 From: Igor Kulikov Date: Thu, 27 Feb 2020 19:09:32 +0200 Subject: [PATCH] Add hybrid mode for docker-compose. Update postgreSQL version to 11. --- docker/.env | 6 +++--- docker/compose-utils.sh | 12 ++++++------ ...cassandra.yml => docker-compose.hybrid.yml} | 18 +++++++++++++++--- docker/tb-node.cassandra.env | 5 ----- docker/tb-node.hybrid.env | 9 +++++++++ docker/tb-node.postgres.env | 1 - msa/tb/README.md | 2 +- msa/tb/docker-cassandra/Dockerfile | 18 ++++++++++++++++-- msa/tb/docker-cassandra/start-db.sh | 18 +++++++++++++++++- msa/tb/docker-cassandra/stop-db.sh | 3 +++ msa/tb/docker-postgres/Dockerfile | 7 +++++-- msa/tb/docker-postgres/start-db.sh | 6 ++++-- msa/tb/docker-postgres/stop-db.sh | 4 +++- msa/tb/docker-tb/Dockerfile | 1 - 14 files changed, 82 insertions(+), 28 deletions(-) rename docker/{docker-compose.cassandra.yml => docker-compose.hybrid.yml} (73%) delete mode 100644 docker/tb-node.cassandra.env create mode 100644 docker/tb-node.hybrid.env diff --git a/docker/.env b/docker/.env index ef0bf40316..3b527f8c4e 100644 --- a/docker/.env +++ b/docker/.env @@ -10,9 +10,9 @@ COAP_TRANSPORT_DOCKER_NAME=tb-coap-transport TB_VERSION=latest -# Database used by ThingsBoard, can be either postgres (PostgreSQL) or cassandra (Cassandra). -# According to the database type corresponding docker service will be deployed (see docker-compose.postgres.yml, docker-compose.cassandra.yml for details). +# Database used by ThingsBoard, can be either postgres (PostgreSQL) or hybrid (PostgreSQL for entities database and Cassandra for timeseries database). +# According to the database type corresponding docker service will be deployed (see docker-compose.postgres.yml, docker-compose.hybrid.yml for details). -DATABASE=postgres +DATABASE=hybrid LOAD_BALANCER_NAME=haproxy-certbot diff --git a/docker/compose-utils.sh b/docker/compose-utils.sh index a5aafc5c9e..9ef71cf590 100755 --- a/docker/compose-utils.sh +++ b/docker/compose-utils.sh @@ -22,11 +22,11 @@ function additionalComposeArgs() { postgres) ADDITIONAL_COMPOSE_ARGS="-f docker-compose.postgres.yml" ;; - cassandra) - ADDITIONAL_COMPOSE_ARGS="-f docker-compose.cassandra.yml" + hybrid) + ADDITIONAL_COMPOSE_ARGS="-f docker-compose.hybrid.yml" ;; *) - echo "Unknown DATABASE value specified: '${DATABASE}'. Should be either postgres or cassandra." >&2 + echo "Unknown DATABASE value specified: '${DATABASE}'. Should be either postgres or hybrid." >&2 exit 1 esac echo $ADDITIONAL_COMPOSE_ARGS @@ -39,11 +39,11 @@ function additionalStartupServices() { postgres) ADDITIONAL_STARTUP_SERVICES=postgres ;; - cassandra) - ADDITIONAL_STARTUP_SERVICES=cassandra + hybrid) + ADDITIONAL_STARTUP_SERVICES="postgres cassandra" ;; *) - echo "Unknown DATABASE value specified: '${DATABASE}'. Should be either postgres or cassandra." >&2 + echo "Unknown DATABASE value specified: '${DATABASE}'. Should be either postgres or hybrid." >&2 exit 1 esac echo $ADDITIONAL_STARTUP_SERVICES diff --git a/docker/docker-compose.cassandra.yml b/docker/docker-compose.hybrid.yml similarity index 73% rename from docker/docker-compose.cassandra.yml rename to docker/docker-compose.hybrid.yml index 49de5f396c..b22be5fab0 100644 --- a/docker/docker-compose.cassandra.yml +++ b/docker/docker-compose.hybrid.yml @@ -17,24 +17,36 @@ version: '2.2' services: + postgres: + restart: always + image: "postgres:11.6" + ports: + - "5432" + environment: + POSTGRES_DB: thingsboard + POSTGRES_PASSWORD: postgres + volumes: + - ./tb-node/postgres:/var/lib/postgresql/data cassandra: restart: always image: "cassandra:3.11.3" ports: - - "9042" + - "9042" volumes: - ./tb-node/cassandra:/var/lib/cassandra tb1: env_file: - - tb-node.cassandra.env + - tb-node.hybrid.env depends_on: - kafka - redis + - postgres - cassandra tb2: env_file: - - tb-node.cassandra.env + - tb-node.hybrid.env depends_on: - kafka - redis + - postgres - cassandra diff --git a/docker/tb-node.cassandra.env b/docker/tb-node.cassandra.env deleted file mode 100644 index 8d813b9059..0000000000 --- a/docker/tb-node.cassandra.env +++ /dev/null @@ -1,5 +0,0 @@ -# ThingsBoard server configuration for Cassandra database - -DATABASE_TS_TYPE=cassandra -DATABASE_ENTITIES_TYPE=cassandra -CASSANDRA_URL=cassandra:9042 diff --git a/docker/tb-node.hybrid.env b/docker/tb-node.hybrid.env new file mode 100644 index 0000000000..2f5dcee2e3 --- /dev/null +++ b/docker/tb-node.hybrid.env @@ -0,0 +1,9 @@ +# ThingsBoard server configuration for Cassandra database + +DATABASE_TS_TYPE=cassandra +CASSANDRA_URL=cassandra:9042 +SPRING_JPA_DATABASE_PLATFORM=org.hibernate.dialect.PostgreSQLDialect +SPRING_DRIVER_CLASS_NAME=org.postgresql.Driver +SPRING_DATASOURCE_URL=jdbc:postgresql://postgres:5432/thingsboard +SPRING_DATASOURCE_USERNAME=postgres +SPRING_DATASOURCE_PASSWORD=postgres diff --git a/docker/tb-node.postgres.env b/docker/tb-node.postgres.env index 9fa79e369c..63e8d11889 100644 --- a/docker/tb-node.postgres.env +++ b/docker/tb-node.postgres.env @@ -1,7 +1,6 @@ # ThingsBoard server configuration for PostgreSQL database DATABASE_TS_TYPE=sql -DATABASE_ENTITIES_TYPE=sql SPRING_JPA_DATABASE_PLATFORM=org.hibernate.dialect.PostgreSQLDialect SPRING_DRIVER_CLASS_NAME=org.postgresql.Driver SPRING_DATASOURCE_URL=jdbc:postgresql://postgres:5432/thingsboard diff --git a/msa/tb/README.md b/msa/tb/README.md index e4b7400b50..14b93fcd28 100644 --- a/msa/tb/README.md +++ b/msa/tb/README.md @@ -4,7 +4,7 @@ This project provides the build for the ThingsBoard single docker images. * `thingsboard/tb` - single instance of ThingsBoard with embedded HSQLDB database. * `thingsboard/tb-postgres` - single instance of ThingsBoard with PostgreSQL database. -* `thingsboard/tb-cassandra` - single instance of ThingsBoard with Cassandra database. +* `thingsboard/tb-cassandra` - single instance of ThingsBoard with Hybrid PostgreSQL (entities) and Cassandra (timeseries) database. ## Running diff --git a/msa/tb/docker-cassandra/Dockerfile b/msa/tb/docker-cassandra/Dockerfile index 3a761398fd..c92817349c 100644 --- a/msa/tb/docker-cassandra/Dockerfile +++ b/msa/tb/docker-cassandra/Dockerfile @@ -18,13 +18,19 @@ FROM thingsboard/openjdk8 RUN apt-get update RUN apt-get install -y curl nmap procps +RUN echo 'deb http://apt.postgresql.org/pub/repos/apt/ stretch-pgdg main' | tee --append /etc/apt/sources.list.d/pgdg.list > /dev/null +RUN curl -L https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - RUN echo 'deb http://www.apache.org/dist/cassandra/debian 311x main' | tee --append /etc/apt/sources.list.d/cassandra.list > /dev/null RUN curl -L https://www.apache.org/dist/cassandra/KEYS | apt-key add - RUN apt-get update -RUN apt-get install -y cassandra cassandra-tools +RUN apt-get install -y cassandra cassandra-tools postgresql-11 RUN update-rc.d cassandra disable +RUN update-rc.d postgresql disable RUN sed -i.old '/ulimit/d' /etc/init.d/cassandra +RUN mkdir -p /var/log/postgres +RUN chown -R postgres:postgres /var/log/postgres + COPY logback.xml ${pkg.name}.conf start-db.sh stop-db.sh start-tb.sh upgrade-tb.sh install-tb.sh ${pkg.name}.deb /tmp/ RUN chmod a+x /tmp/*.sh \ @@ -45,7 +51,15 @@ ENV DATA_FOLDER=/data ENV HTTP_BIND_PORT=9090 ENV DATABASE_TS_TYPE=cassandra -ENV DATABASE_ENTITIES_TYPE=cassandra + +ENV PGDATA=/data/db +ENV CASSANDRA_DATA=/data/cassandra + +ENV SPRING_JPA_DATABASE_PLATFORM=org.hibernate.dialect.PostgreSQLDialect +ENV SPRING_DRIVER_CLASS_NAME=org.postgresql.Driver +ENV SPRING_DATASOURCE_URL=jdbc:postgresql://localhost:5432/thingsboard +ENV SPRING_DATASOURCE_USERNAME=postgres +ENV SPRING_DATASOURCE_PASSWORD=postgres ENV CASSANDRA_HOST=localhost ENV CASSANDRA_PORT=9042 diff --git a/msa/tb/docker-cassandra/start-db.sh b/msa/tb/docker-cassandra/start-db.sh index d65edf71b1..a8ae314b71 100644 --- a/msa/tb/docker-cassandra/start-db.sh +++ b/msa/tb/docker-cassandra/start-db.sh @@ -15,7 +15,23 @@ # limitations under the License. # -cassandra_data_dir=${DATA_FOLDER}/db +firstlaunch=${DATA_FOLDER}/.firstlaunch + +export PG_CTL=$(find /usr/lib/postgresql/ -name pg_ctl) + +if [ ! -d ${PGDATA} ]; then + mkdir -p ${PGDATA} + chown -R postgres:postgres ${PGDATA} + su postgres -c '${PG_CTL} initdb -U postgres' +fi + +su postgres -c '${PG_CTL} -l /var/log/postgres/postgres.log -w start' + +if [ ! -f ${firstlaunch} ]; then + su postgres -c 'psql -U postgres -d postgres -c "CREATE DATABASE thingsboard"' +fi + +cassandra_data_dir=${CASSANDRA_DATA} cassandra_data_link=/var/lib/cassandra if [ ! -L ${cassandra_data_link} ]; then diff --git a/msa/tb/docker-cassandra/stop-db.sh b/msa/tb/docker-cassandra/stop-db.sh index 24cf570999..90af7584ca 100644 --- a/msa/tb/docker-cassandra/stop-db.sh +++ b/msa/tb/docker-cassandra/stop-db.sh @@ -15,4 +15,7 @@ # limitations under the License. # +export PG_CTL=$(find /usr/lib/postgresql/ -name pg_ctl) + service cassandra stop +su postgres -c '${PG_CTL} stop' diff --git a/msa/tb/docker-postgres/Dockerfile b/msa/tb/docker-postgres/Dockerfile index 297bad0753..4006aaef1e 100644 --- a/msa/tb/docker-postgres/Dockerfile +++ b/msa/tb/docker-postgres/Dockerfile @@ -17,7 +17,11 @@ FROM thingsboard/openjdk8 RUN apt-get update -RUN apt-get install -y postgresql postgresql-contrib +RUN apt-get install -y curl +RUN echo 'deb http://apt.postgresql.org/pub/repos/apt/ stretch-pgdg main' | tee --append /etc/apt/sources.list.d/pgdg.list > /dev/null +RUN curl -L https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - +RUN apt-get update +RUN apt-get install -y postgresql-11 RUN update-rc.d postgresql disable RUN mkdir -p /var/log/postgres @@ -43,7 +47,6 @@ ENV DATA_FOLDER=/data ENV HTTP_BIND_PORT=9090 ENV DATABASE_TS_TYPE=sql -ENV DATABASE_ENTITIES_TYPE=sql ENV PGDATA=/data/db diff --git a/msa/tb/docker-postgres/start-db.sh b/msa/tb/docker-postgres/start-db.sh index e7b873fe83..dfbfc1dd68 100644 --- a/msa/tb/docker-postgres/start-db.sh +++ b/msa/tb/docker-postgres/start-db.sh @@ -17,13 +17,15 @@ firstlaunch=${DATA_FOLDER}/.firstlaunch +export PG_CTL=$(find /usr/lib/postgresql/ -name pg_ctl) + if [ ! -d ${PGDATA} ]; then mkdir -p ${PGDATA} chown -R postgres:postgres ${PGDATA} - su postgres -c '/usr/lib/postgresql/10/bin/pg_ctl initdb -U postgres' + su postgres -c '${PG_CTL} initdb -U postgres' fi -su postgres -c '/usr/lib/postgresql/10/bin/pg_ctl -l /var/log/postgres/postgres.log -w start' +su postgres -c '${PG_CTL} -l /var/log/postgres/postgres.log -w start' if [ ! -f ${firstlaunch} ]; then su postgres -c 'psql -U postgres -d postgres -c "CREATE DATABASE thingsboard"' diff --git a/msa/tb/docker-postgres/stop-db.sh b/msa/tb/docker-postgres/stop-db.sh index fc5cb1784c..66596d13c8 100644 --- a/msa/tb/docker-postgres/stop-db.sh +++ b/msa/tb/docker-postgres/stop-db.sh @@ -15,4 +15,6 @@ # limitations under the License. # -su postgres -c '/usr/lib/postgresql/10/bin/pg_ctl stop' +export PG_CTL=$(find /usr/lib/postgresql/ -name pg_ctl) + +su postgres -c '${PG_CTL} stop' diff --git a/msa/tb/docker-tb/Dockerfile b/msa/tb/docker-tb/Dockerfile index 3f9b26bec4..baedf2e318 100644 --- a/msa/tb/docker-tb/Dockerfile +++ b/msa/tb/docker-tb/Dockerfile @@ -36,7 +36,6 @@ ENV DATA_FOLDER=/data ENV HTTP_BIND_PORT=9090 ENV DATABASE_TS_TYPE=sql -ENV DATABASE_ENTITIES_TYPE=sql ENV SPRING_JPA_DATABASE_PLATFORM=org.hibernate.dialect.HSQLDialect ENV SPRING_DRIVER_CLASS_NAME=org.hsqldb.jdbc.JDBCDriver