diff --git a/compose/bin/flush.sh b/compose/bin/flush.sh
new file mode 100644
index 00000000..42771a96
--- /dev/null
+++ b/compose/bin/flush.sh
@@ -0,0 +1,35 @@
+#! /bin/bash
+###########################################
+#
+###########################################
+
+# constants
+baseDir=$(cd `dirname "$0"`;pwd)
+cwdDir=$PWD
+export PYTHONUNBUFFERED=1
+export PATH=/opt/miniconda3/envs/venv-py3/bin:$PATH
+export TS=$(date +%Y%m%d%H%M%S)
+export DATE=`date "+%Y%m%d"`
+export DATE_WITH_TIME=`date "+%Y%m%d-%H%M%S"` #add %3N as we want millisecond too
+
+# functions
+
+# main
+[ -z "${BASH_SOURCE[0]}" -o "${BASH_SOURCE[0]}" = "$0" ] || return
+cd $baseDir/..
+echo "Remove docker containers and drop data in 5 seconds ..."
+sleep 5
+
+docker-compose down
+
+echo "Clean up db ..."
+rm -rf databases/redis/data
+rm -rf databases/mysql/data
+rm -rf databases/mongodb/data
+
+
+echo "Pull docker images ..."
+docker-compose pull
+
+echo "Start services ..."
+docker-compose up -d
diff --git a/compose/server/plugins/.gitignore b/compose/contact-center/plugins/.gitignore
similarity index 100%
rename from compose/server/plugins/.gitignore
rename to compose/contact-center/plugins/.gitignore
diff --git a/compose/databases/mongodb/.gitignore b/compose/databases/mongodb/.gitignore
new file mode 100644
index 00000000..d6b7ef32
--- /dev/null
+++ b/compose/databases/mongodb/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
diff --git a/compose/databases/mysql/.gitignore b/compose/databases/mysql/.gitignore
new file mode 100644
index 00000000..d6b7ef32
--- /dev/null
+++ b/compose/databases/mysql/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
diff --git a/compose/databases/rabbitmq/.gitignore b/compose/databases/rabbitmq/.gitignore
new file mode 100644
index 00000000..d6b7ef32
--- /dev/null
+++ b/compose/databases/rabbitmq/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
diff --git a/compose/databases/redis/.gitignore b/compose/databases/redis/.gitignore
new file mode 100644
index 00000000..d6b7ef32
--- /dev/null
+++ b/compose/databases/redis/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
diff --git a/compose/docker-compose.yml b/compose/docker-compose.yml
new file mode 100644
index 00000000..a7cf1d36
--- /dev/null
+++ b/compose/docker-compose.yml
@@ -0,0 +1,49 @@
+version: "3"
+services:
+ contact-center:
+ image: ${CC_IMAGE:-cskefu/contact-center:v8}
+ restart: always
+ ports:
+ - "${SERVING_API_PORT:-6500}:6500"
+ volumes:
+ - ./contact-center/plugins:/opt/cskefu/plugins
+ environment:
+ - "JAVA_OPTS=-Xmx${CC_JAVA_XMX:-4096m} -Xms${CC_JAVA_XMS:-2048m} -XX:PermSize=256m -XX:MaxPermSize=1024m -Djava.net.preferIPv4Stack=true"
+ depends_on:
+ - mongodb
+ - redis
+ - mysql
+
+ mongodb:
+ image: "tutum/mongodb:3.2"
+ restart: always
+ volumes:
+ - ./databases/mongodb/data:/data/db
+ ports:
+ - "${MONGODB_PORT:-6303}:27017"
+ - "${MONGODB_PORT2:-6305}:27018"
+ environment:
+ - AUTH=no
+
+ redis:
+ image: cskefu/redis:5.0.5
+ environment:
+ - REDIS_PASSWORD=${DB_PASSWD:-123456}
+ restart: always
+ volumes:
+ - ./databases/redis/data:/data
+ ports:
+ - "${REDIS_PORT:-6301}:6379"
+
+ mysql:
+ image: cskefu/mysql:5.7
+ restart: always
+ environment:
+ - MYSQL_ROOT_PASSWORD=${DB_PASSWD:-123456}
+ - MYSQL_USER=admin
+ - MYSQL_PASSWORD=${DB_PASSWD:-123456}
+ ports:
+ - "${MYSQL_PORT:-6300}:3306"
+ volumes:
+ - ./databases/mysql/data:/var/lib/mysql
+ command: --max_allowed_packet=32505856
\ No newline at end of file
diff --git a/compose/sample.env b/compose/sample.env
index ab37c3f1..6c539081 100644
--- a/compose/sample.env
+++ b/compose/sample.env
@@ -5,3 +5,6 @@
# is ignored with .gitignore
COMPOSE_FILE=docker-compose.yml
COMPOSE_PROJECT_NAME=cskefu_v8
+
+SERVING_API_PORT=6500
+DB_PASSWD=123456
\ No newline at end of file
diff --git a/plugins/bin/buildAll.sh b/plugins/bin/buildAll.sh
new file mode 100644
index 00000000..d7860f20
--- /dev/null
+++ b/plugins/bin/buildAll.sh
@@ -0,0 +1,29 @@
+#! /bin/bash
+###########################################
+# Install All public plugins
+# Copyright (2019-2023) 北京华夏春松科技有限公司
+###########################################
+
+# constants
+baseDir=$(cd `dirname "$0"`;pwd)
+
+# functions
+
+# main
+[ -z "${BASH_SOURCE[0]}" -o "${BASH_SOURCE[0]}" = "$0" ] || return
+
+echo "Remove old plugins ..."
+set -x
+rm -rf $baseDir/../../compose/contact-center/plugins/*.jar
+set +x
+
+cd $baseDir/..
+echo "Inspect plugins -->" `pwd`
+for x in `ls .`; do
+ cd $baseDir/..
+ if [ -d ./$x ] && [ $x != "bin" ] && [ -f $x/pom.xml ]; then
+ cd $x
+ echo "Install Plugin" `pwd`
+ mvn -DskipTests clean package
+ fi
+done
diff --git a/plugins/sample/pom.xml b/plugins/sample/pom.xml
index 536b0cd8..09169f23 100644
--- a/plugins/sample/pom.xml
+++ b/plugins/sample/pom.xml
@@ -92,7 +92,7 @@
com.cskefu.plugins.sample.Sample
true
- ../../compose/server/plugins
+ ../../compose/contact-center/plugins
diff --git a/server/serving-api/Dockerfile b/server/serving-api/Dockerfile
index 8b99a508..0200dc07 100644
--- a/server/serving-api/Dockerfile
+++ b/server/serving-api/Dockerfile
@@ -15,7 +15,10 @@ ENV SPRING_PROFILES_ACTIVE=docker
LABEL org.label-schema.vcs-ref=$VCS_REF \
org.label-schema.vcs-url="https://github.com/cskefu/cskefu"
-RUN rm -rf /opt/cskefu && mkdir /opt/cskefu && mkdir /opt/cskefu/felix-cache
+RUN rm -rf /opt/cskefu && mkdir /opt/cskefu && \
+ mkdir /opt/cskefu/felix-cache && \
+ mkdir /opt/cskefu/plugins
+
COPY ./target/serving-api.jar /opt/cskefu/serving-api.jar
COPY ./target/internal-bundles /opt/cskefu/internal-bundles
COPY ./assets/*.sh /opt/cskefu
diff --git a/server/serving-api/bin/build.sh b/server/serving-api/bin/build.sh
index d9f96e6c..295ea726 100755
--- a/server/serving-api/bin/build.sh
+++ b/server/serving-api/bin/build.sh
@@ -30,12 +30,11 @@ if [ ! $? -eq 0 ]; then
exit 1
fi
-$baseDir/package.sh
-
-if [ ! $? -eq 0 ]; then
- echo "Error happens on package."
- exit 1
-fi
+# $baseDir/package.sh # package happens with deploy.sh
+# if [ ! $? -eq 0 ]; then
+# echo "Error happens on package."
+# exit 1
+# fi
set -x
docker build --build-arg VCS_REF=$PACKAGE_VERSION \