scofield 5 éve
szülő
commit
20c53456ce
7 módosított fájl, 680 hozzáadás és 0 törlés
  1. 62 0
      .drone.yml
  2. 36 0
      Dockerfile
  3. 9 0
      configmap.json
  4. 89 0
      deploy-tmp.yaml
  5. 12 0
      entrypoint.sh
  6. 196 0
      ppctl.py
  7. 276 0
      resin.conf

+ 62 - 0
.drone.yml

@@ -0,0 +1,62 @@
+---
+kind: pipeline
+name: book-touchrs
+
+steps:
+ - name: build
+   image: hub.evbj.easou.com/dev/drone-agent-custom:v1.0.0
+  #  pull: always
+   privileged: true
+   environment:
+     JNLP_ENV: qa
+     JNLP_REPO: hub.evbj.easou.com
+     JNLP_TAG: v1.0.0
+     JNLP_CONTAINER_PORT: 8080
+    #  JNLP_WAR: ums.war
+     JNLP_INGRESS: nginx
+     JNLP_SVC_MODE: http
+     JNLP_STORAGE_CLASS: ceph
+     JNLP_DOMAIN: appeasou.com
+     JNLP_CONTROL: StatefulSet
+     JNLP_REPLICAS: 2
+     JNLP_STORAGE_CAPACITY: 200Gi
+     JNLP_MOUNT_PATH: /data
+     JNLP_LIVENESS_INIT: 60
+     JNLP_LIVENESS_PER: 10
+     JNLP_READINESS_INIT: 60
+     JNLP_READINESS_PER: 10
+   commands:
+     - wrapper.sh  /bin/sh
+     - docker --config /etc/docker build -t "$JNLP_REPO/$JNLP_ENV/$DRONE_REPO_NAME:$JNLP_TAG" . -f Dockerfile
+     - docker --config /etc/docker push "$JNLP_REPO/$JNLP_ENV/$DRONE_REPO_NAME:$JNLP_TAG"
+     - python ppctl.py -b
+     - python ppctl.py -a
+     - python ppctl.py -c
+
+ - name: success
+   image: clem109/drone-wechat
+   settings:
+     corpid: ww419ee4063735e1c0
+     corp_secret: zpiRBLETH9eLwIMQ4eJ_r_dcm3BPSGeLHvTcft8Ot-M
+     agent_id: 1000004
+     title: "Pipeline ${DRONE_REPO_NAME} Success"
+     description: "${DRONE_BUILD_LINK} 部署完成"
+     msg_url: ${DRONE_BUILD_LINK}
+     btn_txt: "否"
+   when:
+     status:
+     - success
+
+ - name: failure
+   image: clem109/drone-wechat
+   settings:
+     corpid: ww419ee4063735e1c0
+     corp_secret: zpiRBLETH9eLwIMQ4eJ_r_dcm3BPSGeLHvTcft8Ot-M
+     agent_id: 1000004
+     title: "Pipeline ${DRONE_REPO_NAME} Failure"
+     description: "${DRONE_BUILD_LINK} 部署失败,请检查配置!"
+     msg_url: ${DRONE_BUILD_LINK}
+     btn_txt: "否"
+   when:
+     status:
+     - failure

+ 36 - 0
Dockerfile

@@ -0,0 +1,36 @@
+#centos68-resin:3.1.6-jdk6
+FROM hub.evbj.easou.com/dev/centos:6.8
+
+LABEL author="scofield[scofield_shi@staff.easou.com]"
+
+ENV LANG C.UTF-8
+ENV TZ=Asia/Shanghai
+ENV JAVA_HOME /usr/java/jdk1.6.0_21
+ENV RESIN_HOME /app/soft/resin-pro-3.1.6
+ENV WAR="http://10.26.22.185:9000/psop/conf/dockerConfig/book-touchrs/ROOT.war"
+
+ADD http://10.26.22.185:9000/psop/conf/dockerConfig/resin-api/gosu /usr/local/bin/gosu
+ADD http://10.26.22.185:9000/psop/soft/resin-pro-3.1.6.tar.gz /app/soft/resin-pro-3.1.6.tar.gz
+ADD http://10.26.22.185:9000/psop/soft/skywalking-agent.tgz /app/soft/skywalking-agent.tgz
+
+#install jdk
+RUN rpm -Uvh http://10.26.22.185:9000/psop/soft/jdk-6u21-linux-amd64.rpm \
+    && useradd book \
+    && ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone \
+    && chmod +x /usr/local/bin/gosu \
+    && gosu nobody true
+
+#install resin-3.1.6
+RUN tar -zxf /app/soft/resin-pro-3.1.6.tar.gz -C /app/soft  \
+    && rm -f /app/soft/resin-pro-3.1.6.tar.gz \
+    && rm -rf /app/soft/resin-pro-3.1.6/webapps/* \
+    && rm -f /app/soft/resin-pro-3.1.6/conf/resin.conf
+
+ADD $WAR  /app/soft/resin-pro-3.1.6/webapps/
+ADD entrypoint.sh /usr/bin/entrypoint.sh
+ADD resin.conf /app/soft/resin-pro-3.1.6/conf/resin.conf
+RUN chown book:book -R /app/soft  && chmod +x /usr/bin/entrypoint.sh
+
+#start resin
+ENTRYPOINT ["entrypoint.sh"]
+CMD ["gosu", "book", "/app/soft/resin-pro-3.1.6/bin/httpd.sh"]

+ 9 - 0
configmap.json

@@ -0,0 +1,9 @@
+{
+    "apiVersion": "v1",
+    "data": CMDATA,
+    "kind": "ConfigMap",
+    "metadata": {
+    "name": "tcp-services",
+    "namespace": "ingress-nginx"
+    }
+}

+ 89 - 0
deploy-tmp.yaml

@@ -0,0 +1,89 @@
+---
+apiVersion: apps/v1
+kind: $JNLP_CONTROL
+metadata:
+  name: $DRONE_REPO_NAME
+  namespace: $JNLP_ENV
+  labels:
+    app: $DRONE_REPO_NAME
+spec:
+  serviceName: $DRONE_REPO_NAME
+  replicas: $JNLP_REPLICAS
+  selector:
+    matchLabels:
+      app: $DRONE_REPO_NAME
+  template:
+    metadata:
+      labels:
+        app: $DRONE_REPO_NAME
+    spec:
+      terminationGracePeriodSeconds: 180
+      initContainers:
+        - name: init
+          image: $JNLP_REPO/dev/busybox
+          command: ["chmod","777","-R","$JNLP_MOUNT_PATH"]
+          imagePullPolicy: Always
+          volumeMounts:
+          - name: volume
+            mountPath: $JNLP_MOUNT_PATH
+      containers:
+      - name: $DRONE_REPO_NAME
+        image: $JNLP_REPO/$JNLP_ENV/$DRONE_REPO_NAME:$JNLP_TAG
+        imagePullPolicy: Always
+        ports:
+        - containerPort: $JNLP_CONTAINER_PORT
+          name: port
+        volumeMounts:
+        - name: volume
+          mountPath: $JNLP_MOUNT_PATH
+        livenessProbe:
+          tcpSocket:
+            port: $JNLP_CONTAINER_PORT
+          initialDelaySeconds: $JNLP_LIVENESS_INIT
+          periodSeconds: $JNLP_LIVENESS_PER
+        readinessProbe:
+          tcpSocket: 
+            port: $JNLP_CONTAINER_PORT
+          initialDelaySeconds: $JNLP_READINESS_INIT
+          periodSeconds: $JNLP_READINESS_PER
+  volumeClaimTemplates:
+  - metadata:
+      name: volume
+    spec:
+      accessModes: ["ReadWriteOnce"]
+      storageClassName: ceph
+      resources:
+        requests:
+          storage: $JNLP_STORAGE_CAPACITY
+---
+apiVersion: v1
+kind: Service
+metadata:
+  name: $DRONE_REPO_NAME-svc
+  namespace: $JNLP_ENV
+  labels:
+    app: $DRONE_REPO_NAME-svc
+spec:
+  type: NodePort
+  ports:
+  - port: $JNLP_CONTAINER_PORT
+    targetPort: $JNLP_CONTAINER_PORT
+  selector:
+    app: $DRONE_REPO_NAME
+---
+apiVersion: extensions/v1beta1
+kind: Ingress
+metadata:
+  name: $DRONE_REPO_NAME-ingress
+  namespace: $JNLP_ENV
+  annotations:
+    kubernetes.io/ingress.class: $JNLP_INGRESS
+spec:
+  rules:
+  - host: $JNLP_ENV-$DRONE_REPO_NAME$JNLP_DOMAIN
+    http:
+      paths:
+      - path: /
+        backend:
+          serviceName: $DRONE_REPO_NAME-svc
+          servicePort: $JNLP_CONTAINER_PORT

+ 12 - 0
entrypoint.sh

@@ -0,0 +1,12 @@
+#!/bin/bash
+
+set -e
+set -o pipefail
+
+
+mkdir -p /data/log/devlog/ /data/log/other/  /data/project/  /data/log/novelweb/
+mv /app/soft/resin-pro-3.1.6/webapps/ROOT.war  /data/project/ROOT.war
+chown book:book -R  /data  /app
+
+
+exec "$@"

+ 196 - 0
ppctl.py

@@ -0,0 +1,196 @@
+#!/usr/bin/python
+# -*- coding: UTF-8 -*-
+from __future__ import print_function
+import os
+import commands
+import httplib, urllib
+import json
+import time
+from kubernetes.client.rest import ApiException
+from pprint import pprint
+from kubernetes import client, config
+import sys, getopt, random
+
+
+JNLP_ENV = os.getenv('JNLP_ENV')
+JNLP_TAG = os.getenv('JNLP_TAG')
+JNLP_CONTAINER_PORT = os.getenv('JNLP_CONTAINER_PORT')
+# JNLP_WAR = os.getenv('JNLP_WAR')
+JNLP_INGRESS = os.getenv('JNLP_INGRESS')
+JNLP_IMAGE = os.getenv('JNLP_IMAGE')
+JNLP_CONTROL_NAME = os.getenv('DRONE_REPO_NAME')
+JNLP_STORAGE_CLASS = os.getenv('JNLP_STORAGE_CLASS')
+JNLP_DOMAIN = os.getenv('JNLP_DOMAIN')
+JNLP_CONTROL = os.getenv('JNLP_CONTROL')
+JNLP_REPLICAS = os.getenv('JNLP_REPLICAS')
+JNLP_STORAGE_CAPACITY = os.getenv('JNLP_STORAGE_CAPACITY')
+JNLP_MOUNT_PATH = os.getenv('JNLP_MOUNT_PATH')
+JNLP_SVC_MODE = os.getenv('JNLP_SVC_MODE')
+NGINX_SVC = str(JNLP_ENV) + '/' + str(JNLP_CONTROL_NAME) + '-svc:' + str(JNLP_CONTAINER_PORT)
+NGINX_PORT = os.getenv('JNLP_CONTAINER_PORT')
+RECORD_NAME = os.getenv('JNLP_ENV') + "-" + os.getenv('DRONE_REPO_NAME')
+INGRESS_LIST = ["10.26.30.12", "10.26.29.54", "10.26.30.102", "10.26.30.13"]
+NGINX_RECORD_IP = random.sample(INGRESS_LIST, 1)[0]
+
+
+# 生成deploy.yaml文件
+def deployYamlCreate():
+    tmpctl = '''
+    config=`env|grep JNLP`
+    template=`cat ./deploy-tmp.yaml`
+    printf "$config\ncat << EOF\n$template\nEOF" | bash > ./deploy.yaml
+    '''
+    f1 = open("tempshell.sh","w")
+    f1.writelines(tmpctl)
+    f1.close()
+    status,output = commands.getstatusoutput("sh tempshell.sh && rm -f tempshell.sh")
+    print("code:" + str(status) + str(output) + "; create deploy.yaml success !!!") 
+    return status,output
+
+
+# 生成Dockerfile文件
+def DockerfileCreate():
+    tmp = '''
+    onfig=`env|grep JNLP`
+    template=`cat ./Dockerfile`
+    printf "$config\ncat << EOF\n$template\nEOF" | bash > ./Dockerfile
+    '''
+    f2 = open("tmp.sh","w")
+    f2.writelines(tmp)
+    f2.close()
+    status,output = commands.getstatusoutput("sh tmp.sh && rm -f tmp.sh")
+    print("code:" + str(status) + str(output) + "; create Dockerfile success !!!") 
+    return
+
+
+# 更新haproxy configmap.json配置文件,生成TCP服务转发记录
+def updateConfigMap(file):
+    if JNLP_SVC_MODE == "tcp":
+        data = {}
+        data[NGINX_PORT] = NGINX_SVC
+        status, output = commands.getstatusoutput("kubectl  get cm  tcp-services -n  ingress-nginx -o=json")
+        tempdict = eval(output)
+        tempdict['data'][NGINX_PORT] = NGINX_SVC
+        newdata = tempdict['data']
+        print(newdata,status) 
+        old_str = "CMDATA"
+        new_str = str(newdata).replace("'",'"')
+        with open(file, "r") as f1,open("%s.bak" % file, "w" ) as f2:
+            for line in f1:
+                if old_str in line:
+                    line = line.replace(old_str, new_str)
+                f2.write(line)
+        os.remove(file)
+        os.rename("%s.bak" % file, file)
+        cmStatus = "1"
+    else:
+        print("****** Nginx Tcp Services Configmap.json Do Not Update ******")
+        cmStatus = "0"
+    return cmStatus
+
+# 部署应用到kubernetes平台
+def deployToKube():
+    cmStatus = updateConfigMap("configmap.json")
+    appStatus = commands.getoutput("kubectl  get sts $JNLP_CONTROL_NAME -n $JNLP_NAMESPACE|grep $JNLP_CONTROL_NAME|wc -l")
+    if appStatus == "1" and cmStatus == "1":
+        print("Warning:" + JNLP_CONTROL_NAME + " is already, i will update it and update nginx tcp proxy !!!")
+        apply_out = commands.getoutput("kubectl apply -f ./deploy.yaml && kubectl apply -f ./configmap.json")
+        print("===>>> kubectl apply output <<<===")
+        print(apply_out)
+    elif appStatus == "1" and cmStatus == "0":
+        print("Warning:" + JNLP_CONTROL_NAME + " is already, i will update it !!!")
+        apply_out = commands.getoutput("kubectl apply -f ./deploy.yaml")
+        print("===>>> kubectl apply output <<<===")
+        print(apply_out)
+    elif appStatus != "1" and cmStatus == "1":
+        apply_out = commands.getoutput("kubectl apply -f ./deploy.yaml && kubectl apply -f ./configmap.json")
+        print("===>>> kubectl apply output <<<===")
+        print(apply_out)
+        print("===>>> apply is successfull <<<===")
+    else:
+        apply_out = commands.getoutput("kubectl apply -f ./deploy.yaml")
+        print("===>>> kubectl apply output <<<===")
+        print(apply_out)
+        print("===>>> apply app successfull <<<===")
+    return
+
+
+# 部署应用状态获取
+def deployStatus():
+    kubeconfig = config.kube_config.load_kube_config(config_file="/root/.kube/config")
+    appsv1_api_instance = client.AppsV1Api(kubeconfig)
+    namespace = JNLP_ENV
+    stsname = JNLP_CONTROL_NAME
+    pretty = "true"
+    for x in range(20):
+        try: 
+            sts_response = appsv1_api_instance.read_namespaced_stateful_set_status(stsname, namespace, pretty=pretty)
+            if sts_response.status.replicas == sts_response.status.ready_replicas :
+                print("===>>> " +stsname + " is RUNNING <<<===")
+                chk_status = 1
+                break
+            else:
+                if x < 20:
+                    time.sleep(15)
+                else:
+                    chk_status = 0
+                    print(stsname + " status check fail !!! , Please contact kubernetes systen administrator")
+        except ApiException as e:
+            print("Exception when calling CoreV1Api->list_namespaced_pod: %s\n" % e)
+    return chk_status
+
+
+# DNS解析
+# 域名由jenkins项目名+命名空间+dns域组合而成
+# 如果域名已存在,不会再更新
+def dnsAllocation():
+    if JNLP_INGRESS == "nginx":
+        httpClient = httplib.HTTPConnection("opsadmin.evbj.easou.com", 80, timeout=30)
+        headers = {"Content-type": "application/x-www-form-urlencoded","Accept": "text/plain"}
+        params = urllib.urlencode({'method': 'add', 'type': 'record', 'domain_id': 24, 'record_type': 'A', 'record_name': RECORD_NAME ,'record_ip': NGINX_RECORD_IP , 'record_ttl': 180})
+        httpClient.request("POST", "/dns/dnsapi/?token=c2d1856be235a3207cd03b6f4d3c4094", params, headers)
+        response = httpClient.getresponse().read()
+        jstr = json.loads(response)
+        nsStatus = jstr['status']
+        print(NGINX_RECORD_IP)
+        if nsStatus == "-501":
+            print(JNLP_ENV + "-" + JNLP_CONTROL_NAME + JNLP_DOMAIN + " is already exist")
+        elif nsStatus == "0":
+            httpClient = httplib.HTTPConnection("opsadmin.evbj.easou.com", 80, timeout=30)
+            httpClient.request("POST", "/dns/mkconfig/?token=c2d1856be235a3207cd03b6f4d3c4094")
+            response = httpClient.getresponse().read()
+            jstr = json.loads(response)
+            upStatus = jstr['status']
+            print(JNLP_ENV + "-" + JNLP_CONTROL_NAME + JNLP_DOMAIN + " " +upStatus + " add successfull !!!")
+        else:
+            print("*****Please contact DNS systen administrator*****")
+    else :
+        print(">>> Ingress error, Only nginx !!! <<<")
+    return
+
+
+def main(argv=None):
+    if argv is None:
+        args = sys.argv[1:]
+        for opt_name in args :
+            if opt_name in ('-a','--apply'):
+                print("===>>> deploy app to kubernetes <<<===")
+                deployToKube()
+                time.sleep(10)
+                sys.exit()
+            if opt_name in ('-b','--build'):
+                print("===>>> create deploy.yaml <<<===")
+                deployYamlCreate()
+                sys.exit()
+            if opt_name in ('-c','--check'):
+                print("===>>> app status check <<<===")
+                deployStatus()
+                sys.exit()
+            if opt_name in ('-d','--dns'):
+                print("===>>> update dns resolve <<<===")
+                dnsAllocation()
+                sys.exit()
+    return
+
+if __name__ == "__main__":
+    main()

+ 276 - 0
resin.conf

@@ -0,0 +1,276 @@
+<!--
+   - Resin 3.1 configuration file.
+  -->
+<resin xmlns="http://caucho.com/ns/resin"
+       xmlns:resin="http://caucho.com/ns/resin/core">
+
+  <!-- adds all .jar files under the resin/lib directory -->
+  <class-loader>
+    <tree-loader path="${resin.home}/ext-lib"/>
+    <tree-loader path="${resin.root}/ext-lib"/>
+
+    <tree-loader path="${resin.home}/lib"/>
+    <tree-loader path="${resin.root}/lib"/>
+  </class-loader>
+
+  <!--
+     - Management configuration
+     -
+     - Remote management requires at least one enabled admin user.
+    -->
+  <management path="${resin.root}/admin">
+    <user name="admin" password="password" disable="true"/>
+
+    <resin:if test="${resin.professional}">
+      <deploy-service/>
+      <jmx-service/>
+      <log-service/>
+      <xa-log-service/>
+    </resin:if>
+  </management>
+
+
+  <log name="" level="info" path="stdout:"
+       timestamp="[%Y-%m-%d %H:%M:%S.%s] {%{thread}} "/>
+ <log name='' level='fine' path='stderr:' timestamp="[%Y-%m-%d %H:%M:%S.%s] {%{thread}} "/>
+
+  <logger name="com.caucho" level="info"/>
+  <logger name="com.caucho.java" level="config"/>
+  <logger name="com.caucho.loader" level="config"/>
+
+
+  <dependency-check-interval>2s</dependency-check-interval>
+
+  <javac compiler="internal" args="-source 1.6"/>
+
+
+  <cluster id="app-tier">
+    <!-- sets the content root for the cluster, relative to server.root -->
+    <root-directory>.</root-directory>
+
+    <server-default>
+      <!-- The http port -->
+      <http address="*" port="8080"/>
+
+   
+      <jvm-arg>-server</jvm-arg>
+      <jvm-arg>-Xmx4096m</jvm-arg>
+      <jvm-arg>-Xms4096m</jvm-arg>
+      <jvm-arg>-Xmn1024m</jvm-arg>
+      <jvm-arg>-Xss1m</jvm-arg>
+      <jvm-arg>-XX:PermSize=128m</jvm-arg>
+      <jvm-arg>-XX:MaxPermSize=256m</jvm-arg>
+<!--
+      <jvm-arg>-Xincgc</jvm-arg>
+-->
+      <jvm-arg>-Xdebug</jvm-arg>
+      <jvm-arg>-Dcom.sun.management.jmxremote</jvm-arg>
+      <jvm-arg>-Djava.util.prefs.userRoot=/home/book/preps</jvm-arg>
+
+      <!--
+         - Uncomment to enable admin heap dumps
+         - <jvm-arg>-agentlib:resin</jvm-arg>
+        -->
+
+      <!--
+         - arguments for the watchdog process
+        -->
+      <watchdog-jvm-arg>-Dcom.sun.management.jmxremote</watchdog-jvm-arg>
+      <watchdog-port>9600</watchdog-port>
+
+      <!--
+         - Configures the minimum free memory allowed before Resin
+         - will force a restart.
+        -->
+      <memory-free-min>1M</memory-free-min>
+
+      <!-- Maximum number of threads. -->
+      <thread-max>2300</thread-max>
+
+      <!-- Configures the socket timeout -->
+      <socket-timeout>15s</socket-timeout>
+
+      <!-- Configures the keepalive -->
+      <keepalive-max>128</keepalive-max>
+      <keepalive-timeout>15s</keepalive-timeout>
+
+    
+    </server-default>
+
+    <!-- define the servers in the cluster -->
+    <server id="" address="127.0.0.1" port="6800" load-balance-socket-timeout="600s"/>
+
+    <resin:if test="${resin.professional}">
+      <persistent-store type="cluster">
+        <init path="session"/>
+      </persistent-store>
+    </resin:if>
+
+
+    <!--
+       - Enables the cache (available in Resin Professional) 
+      -->
+    <resin:if test="${resin.professional}">
+      <cache path="cache" memory-size="64M">
+        <!-- Vary header rewriting for IE -->
+        <rewrite-vary-as-private/>
+      </cache>
+    </resin:if>
+
+    <!--
+       - Enables periodic checking of the server status and
+       - check for deadlocks..
+       -
+       - All servers can add <url>s to be checked.
+      -->
+    <resin:if test="${resin.professional}">
+      <ping>
+        <!-- <url>http://localhost:8080/test-ping.jsp</url> -->
+      </ping>
+    </resin:if>
+
+    <!--
+       - Defaults applied to each web-app.
+      -->
+    <web-app-default>
+      <prologue>
+        <!--
+           - Extension library for common jar files.  The ext is safe
+           - even for non-classloader aware jars.  The loaded classes
+           - will be loaded separately for each web-app, i.e. the class
+           - itself will be distinct.
+          -->
+        <class-loader>
+          <tree-loader path="${resin.root}/ext-webapp-lib"/>
+        </class-loader>
+
+        <!--
+           - Enable EL expressions in Servlet and Filter init-param
+          -->
+        <allow-servlet-el/>
+      </prologue>
+      
+      <!--
+         - Sets timeout values for cacheable pages, e.g. static pages.
+        -->
+      <cache-mapping url-pattern="/" expires="60m"/>
+      <cache-mapping url-pattern="/*.m" expires="60m"/>
+
+
+      <!--
+         - for security, disable session URLs by default.
+        -->
+      <session-config>
+        <enable-url-rewriting>false</enable-url-rewriting>
+        <session-timeout>40</session-timeout>
+        <session-max>12000</session-max>
+      </session-config>
+
+      <!--
+         - For security, set the HttpOnly flag in cookies.
+         - <cookie-http-only/>
+        -->
+
+      <!--
+         - Some JSP packages have incorrect .tld files.  Its possible to
+         - set validate-taglib-schema to false to work around these packages.
+        -->
+        <jsp>
+          <validate-taglib-schema>true</validate-taglib-schema>
+          <fast-jstl>true</fast-jstl>
+          <fast-jsf>false</fast-jsf>
+        </jsp>
+    </web-app-default>
+
+    <!-- includes the app-default for default web-app behavior -->
+    <resin:import path="${resin.home}/conf/app-default.xml"/>
+
+    <!--
+       - Sample database pool configuration
+       -
+       - The JDBC name is java:comp/env/jdbc/test
+        <database>
+       <jndi-name>jdbc/noveladmin</jndi-name>
+       <driver type="com.mysql.jdbc.Driver">
+         <url>jdbc:mysql://10.13.24.176:3306/ESBOOKCONFIG</url>
+         <user>wap.esbconf</user>
+         <password>qazwsx@186</password>
+        </driver>
+        <prepared-statement-cache-size>20</prepared-statement-cache-size>
+        <max-connections>60</max-connections>
+        <max-idle-time>30s</max-idle-time>
+        <max-active-time>12h</max-active-time>
+        <max-pool-time>12h</max-pool-time>
+        </database>
+         -->
+
+        <database>
+            <jndi-name>jdbc/noveladmin</jndi-name>
+            <driver type="com.mysql.jdbc.Driver">
+            <url>jdbc:mysql://10.26.30.112:3306/noveladmin</url>
+            <user>wap.news</user>
+            <password>qazwsx</password>
+            </driver>
+            <prepared-statement-cache-size>20</prepared-statement-cache-size>
+            <max-connections>60</max-connections>
+            <max-idle-time>30s</max-idle-time>
+            <max-active-time>12h</max-active-time>
+            <max-pool-time>12h</max-pool-time>
+        </database>
+    <!--
+       - Default host configuration applied to all virtual hosts.
+      -->
+    <host-default>
+      <!--
+         - With another web server, like Apache, this can be commented out
+         - because the web server will log this information. -->
+
+       <access-log path-format="/data/log/other/access_log.%Y-%m-%d_%H.log" 
+                format='%D %{xxx}c %h %t "%r" %s %b "%{Referer}i" "%{User-Agent}i"' 
+            rollover-period="1h"/>
+        <!--   <access-log path="logs/access.log" 
+            format='%h %l %u %t "%r" %s %b "%{Referer}i" "%{User-Agent}i"'
+            rollover-period="1W"/>-->
+
+      <!-- creates the webapps directory for .war expansion -->
+      <web-app-deploy path="webapps"/>
+
+      <!-- creates the deploy directory for .ear expansion -->
+      <ear-deploy path="deploy">
+        <ear-default>
+          <ejb-server>
+            <config-directory>WEB-INF</config-directory>
+          </ejb-server>
+        </ear-default>
+      </ear-deploy>
+
+      <!-- creates the deploy directory for .rar expansion -->
+      <resource-deploy path="deploy"/>
+    </host-default>
+
+    <!-- configures a deployment directory for virtual hosts -->
+    <host-deploy path="hosts">
+      <host-default>
+        <resin:import path="host.xml" optional="true"/>
+      </host-default>
+    </host-deploy>
+
+    <!-- configures the default host, matching any host name -->
+    <host id="" root-directory=".">
+        <web-app id="/" character-encoding='UTF-8' document-directory="/data/project/ROOT" archive-path="/data/project/ROOT.war">
+        <stdout-log path="/data/log/devlog/stdout.log" rollover-period="1W"/>
+        <stderr-log path="/data/log/devlog/stderr.log" rollover-period='1W'/>
+        <!--<access-log path="/data/log/novelweb/access.log"
+            format='%h"%{%Y-%m-%d %H:%M:%S}t"%r"%s"%b"%{esid}o"%{cid}o"%{X-Forwarded-For}i"%{mobile}o"%{ua}o"%{mid}o"%{did}o'
+            rollover-period="1D"/> -->
+       <jsp>
+        <dependency-check-interval>300s</dependency-check-interval>
+       </jsp>
+       </web-app>
+    </host>
+  </cluster>
+
+  <!--
+     - Configuration for the web-tier/load-balancer
+    -->
+</resin>