diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..a838c97 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,6 @@ +FROM tomcat:latest + +COPY ./tomcat /usr/local/tomcat/webapps +COPY ./target /usr/local/tomcat/webapps + +EXPOSE 8080 diff --git a/Dockerfile.db b/Dockerfile.db new file mode 100644 index 0000000..b7c34c1 --- /dev/null +++ b/Dockerfile.db @@ -0,0 +1,14 @@ +FROM mysql:latest + +ENV MYSQL_ROOT_PASSWORD: admin \ + MYSQL_DATABASE: giit \ + MYSQL_USER: example_db_user \ + MYSQL_PASSWORD: example_db_pass \ + +VOLUME ["/docker-entrypoint-initdb.d"] + +COPY ./sql /docker-entrypoint-initdb.d + +EXPOSE 3306 + +CMD ["/usr/bin/mysqld_safe"] diff --git a/Dockerfile.ng b/Dockerfile.ng new file mode 100644 index 0000000..836a82d --- /dev/null +++ b/Dockerfile.ng @@ -0,0 +1,6 @@ +FROM nginx:1.13 + +COPY ./nginx /etc/nginx/conf.d + +EXPOSE 80 +CMD ["nginx"] diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 0000000..fae312a --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,75 @@ + +def CONTAINER_NAME="javaee-tutorial" +def CONTAINER_TAG="latest" +def DOCKER_HUB_USER="yuvarajmindtree" +def HTTP_PORT="8090" + +node { + + stage('Initialize'){ + def dockerHome = tool 'myDocker' + def mavenHome = tool 'myMaven' + env.PATH = "${dockerHome}/bin:${mavenHome}/bin:${env.PATH}" + } + + stage('Checkout') { + checkout scm + } + + stage('Build'){ + sh "mvn clean package" + } + + stage('Sonar'){ + try { + sh "mvn sonar:sonar" + } catch(error){ + echo "The sonar server could not be reached ${error}" + } + } +} +// stage("Image Prune"){ + // imagePrune(CONTAINER_NAME) +// } + +// stage('Image Build'){ +// imageBuild(CONTAINER_NAME, CONTAINER_TAG) +// } + +// stage('Push to Docker Registry'){ +// withCredentials([usernamePassword(credentialsId: 'dockerHubAccount', usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD')]) { +// pushToImage(CONTAINER_NAME, CONTAINER_TAG, USERNAME, PASSWORD) +// } +// } + +// stage('Run App'){ +// runApp(CONTAINER_NAME, CONTAINER_TAG, DOCKER_HUB_USER, HTTP_PORT) +// } + +//} + +//def imagePrune(containerName){ + // try { + // sh "docker image prune -f" + // sh "docker stop $containerName" + // } catch(error){} +//} + +//def imageBuild(containerName, tag){ +// sh "docker build -t $containerName:$tag -t $containerName --pull --no-cache ." +// echo "Image build complete" +//} + +//def pushToImage(containerName, tag, dockerUser, dockerPassword){ +// sh "docker login -u $dockerUser -p $dockerPassword" +// sh "docker tag $containerName:$tag $dockerUser/$containerName:$tag" +// sh "docker push $dockerUser/$containerName:$tag" +// echo "Image push complete" +//} + +//def runApp(containerName, tag, dockerHubUser, httpPort){ +// sh "docker pull $dockerHubUser/$containerName" + //sh "docker run -d --rm -p $httpPort:$httpPort --name $containerName $dockerHubUser/$containerName:$tag" +// sh "docker-compose up --name $containerName $dockerHubUser/$containerName:$tag" +// echo "Application started on port: ${httpPort} (http)" +//} diff --git a/Kubernetes/Doc/db-claim0-persistentvolumeclaim.yaml b/Kubernetes/Doc/db-claim0-persistentvolumeclaim.yaml new file mode 100644 index 0000000..b929a0f --- /dev/null +++ b/Kubernetes/Doc/db-claim0-persistentvolumeclaim.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: PersistentVolume +metadata: + creationTimestamp: null +# labels: +# io.kompose.service: task-pv-volume +# name: task-pv-volume +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 100Mi +status: {} diff --git a/Kubernetes/Doc/docker-compose.yml b/Kubernetes/Doc/docker-compose.yml new file mode 100644 index 0000000..d5b2df0 --- /dev/null +++ b/Kubernetes/Doc/docker-compose.yml @@ -0,0 +1,45 @@ +# MySQL database shared with tomcat containers. +db: + image: mysql:latest + environment: + MYSQL_ROOT_PASSWORD: admin + MYSQL_DATABASE: giit + MYSQL_USER: example_db_user + MYSQL_PASSWORD: example_db_pass + volumes: + - ./sql:/docker-entrypoint-initdb.d + ports: + - "3306:3306" + +# First node of the first Tomcat virtual host. +tomcat: + image: tomcat:latest + # Environment variables do not appear to be getting loaded the first time Tomcat starts! + environment: + # VIRTUAL_HOST: tomcat_1.mulligan.ie + # VIRTUAL_PORT: 8080 + JDBC_URL: jdbc:mysql://db:3306/giit?connectTimeout=0&socketTimeout=0&autoReconnect=true + MYSQL_USER: example_db_user + MYSQL_PASSWORD: example_db_pass +# volumes: +# - ./warfiel:/usr/local/tomcat/webapps + # ports: + # - "8080:8080" + links: + - db + +# nginx container that automatically creates a load balancer / reverse proxy across the 3 tomcat containers / 2 virtual hosts. +nginx: +#image: jwilder/nginx-proxy:latest + image: nginx:1.13 + restart: always + volumes: + - ./nginx:/etc/nginx/conf.d + ports: + - "8081:80" + # - "443:443" + # volumes: + # - /var/run/docker.sock:/tmp/docker.sock:ro + + links: + - tomcat diff --git a/Kubernetes/Doc/nginx-claim0-persistentvolumeclaim.yaml b/Kubernetes/Doc/nginx-claim0-persistentvolumeclaim.yaml new file mode 100644 index 0000000..a03484d --- /dev/null +++ b/Kubernetes/Doc/nginx-claim0-persistentvolumeclaim.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: PersistentVolume +metadata: + creationTimestamp: null +# labels: +# io.kompose.service: nginx-pv-volume +# name: nginx-pv-volume +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 100Mi +status: {} diff --git a/Kubernetes/Doc/nginx-volume.yaml b/Kubernetes/Doc/nginx-volume.yaml new file mode 100644 index 0000000..1ed32d4 --- /dev/null +++ b/Kubernetes/Doc/nginx-volume.yaml @@ -0,0 +1,14 @@ +kind: StorageClass +apiVersion: storage.k8s.io/v1 +metadata: + name: nginx-pv-volume + labels: + type: local +spec: + storageClassName: manual + capacity: + storage: 100Mi + accessModes: + - ReadWriteOnce + hostPath: + path: "/mnt/nginx" diff --git a/Kubernetes/Doc/pv-volume.yaml b/Kubernetes/Doc/pv-volume.yaml new file mode 100644 index 0000000..311a494 --- /dev/null +++ b/Kubernetes/Doc/pv-volume.yaml @@ -0,0 +1,14 @@ +kind: StorageClass +apiVersion: storage.k8s.io/v1 +metadata: + name: task-pv-volume + labels: + type: local +spec: + storageClassName: manual + capacity: + storage: 100Mi + accessModes: + - ReadWriteOnce + hostPath: + path: "/mnt/data" diff --git a/Kubernetes/db-deployment.yaml b/Kubernetes/db-deployment.yaml new file mode 100644 index 0000000..161ea4f --- /dev/null +++ b/Kubernetes/db-deployment.yaml @@ -0,0 +1,40 @@ +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: db + creationTimestamp: null + labels: + app: db +spec: + selector: + matchLabels: + app: db + replicas: 1 + strategy: + type: Recreate + template: + metadata: + creationTimestamp: null + labels: + app: db + spec: + containers: + - image: mysql:latest + name: db + env: + + - name: MYSQL_DATABASE + value: giit + - name: MYSQL_PASSWORD + value: example_db_pass + - name: MYSQL_USER + value: example_db_user +# - name: MYSQL_ROOT_PASSWORD +# valueFrom: +# secretKeyRef: +# name: mysql-pass +# key: password + ports: + - containerPort: 3306 + name: db +status: {} diff --git a/Kubernetes/db-service.yaml b/Kubernetes/db-service.yaml new file mode 100644 index 0000000..dece6a6 --- /dev/null +++ b/Kubernetes/db-service.yaml @@ -0,0 +1,20 @@ +apiVersion: v1 +kind: Service +metadata: + annotations: +# kompose.cmd: kompose --file Doc/docker-compose.yml convert +# kompose.version: 1.17.0 (a74acad) + creationTimestamp: null + labels: +# io.kompose.service: db + name: db +spec: + ports: + - name: "3306" + port: 3306 + targetPort: 3306 + selector: +# io.kompose.service: db + name: db +status: + loadBalancer: {} diff --git a/Kubernetes/nginx-deployment.yaml b/Kubernetes/nginx-deployment.yaml new file mode 100644 index 0000000..b4f9f6b --- /dev/null +++ b/Kubernetes/nginx-deployment.yaml @@ -0,0 +1,31 @@ +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: +# annotations: +# kompose.cmd: kompose --file Doc/docker-compose.yml convert +# kompose.version: 1.17.0 (a74acad) + creationTimestamp: null + labels: + name: nginx + name: nginx +spec: + replicas: 1 + strategy: + type: Recreate + template: + metadata: + creationTimestamp: null + labels: + name: nginx + spec: + containers: + - image: nginx:latest + name: nginx + ports: + - containerPort: 80 +# resources: {} +# volumeMounts: +# - mountPath: /etc/nginx/conf.d +# name: nginx-pv-volume + restartPolicy: Always +status: {} diff --git a/Kubernetes/nginx-service.yaml b/Kubernetes/nginx-service.yaml new file mode 100644 index 0000000..d2dba48 --- /dev/null +++ b/Kubernetes/nginx-service.yaml @@ -0,0 +1,20 @@ +apiVersion: v1 +kind: Service +metadata: + annotations: +# kompose.cmd: kompose --file Doc/docker-compose.yml convert +# kompose.version: 1.17.0 (a74acad) + creationTimestamp: null + labels: +# io.kompose.service: nginx + name: nginx +spec: + ports: + - name: "8081" + port: 8081 + targetPort: 80 + selector: +# io.kompose.service: nginx + name: nginx +status: + loadBalancer: {} diff --git a/Kubernetes/nginx/nginx.conf b/Kubernetes/nginx/nginx.conf new file mode 100644 index 0000000..4f9c8b6 --- /dev/null +++ b/Kubernetes/nginx/nginx.conf @@ -0,0 +1,15 @@ + + upstream backend { + server tomcat:8080; +# server tomcat_1_node_2:8080; + # server 192.0.0.1 backup; +# server tomcat_1.mulligan.ie:8080; +# server tomcat_2.mulligan.ie:8080 + } +server { + listen 80; + location / { + proxy_pass http://backend; + } +} + diff --git a/Kubernetes/sql/create.sql b/Kubernetes/sql/create.sql new file mode 100644 index 0000000..b346b94 --- /dev/null +++ b/Kubernetes/sql/create.sql @@ -0,0 +1,182 @@ +######################## +# Drop all table +######################## + +DROP TABLE IF EXISTS book, class, course, department, order_book, resource, role, section, speciality, staff, student, takes, timetable, user; + +CREATE TABLE book +( + book_title VARCHAR(30), + isbn VARCHAR(20), + date_of_printing VARCHAR(20), + author VARCHAR(15), + press VARCHAR(15), + category CHAR, + unit_price FLOAT, + PRIMARY KEY (book_title, isbn) +) + DEFAULT CHARSET = utf8, + ENGINE = InnoDB; + +CREATE TABLE class +( + class_id VARCHAR(30), + class_name VARCHAR(10), + year VARCHAR(20), + spec_name VARCHAR(15), + PRIMARY KEY (class_id) +) + DEFAULT CHARSET = utf8, + ENGINE = InnoDB; + +CREATE TABLE course +( + course_title VARCHAR(30), + type VARCHAR(10), + credits FLOAT, + speciality VARCHAR(15), + PRIMARY KEY (course_title) +) + DEFAULT CHARSET = utf8, + ENGINE = InnoDB; + +CREATE TABLE department +( + dept_id INT AUTO_INCREMENT, + dept_name VARCHAR(15), + PRIMARY KEY (dept_id) +) + DEFAULT CHARSET = utf8, + ENGINE = InnoDB; + +CREATE TABLE order_book +( + staff_id VARCHAR(30), + sec_id INT, + book_title VARCHAR(30), + isbn VARCHAR(20), + remark VARCHAR(30), + approval TINYINT(1), + PRIMARY KEY (staff_id, sec_id, book_title, isbn) +) + DEFAULT CHARSET = utf8, + ENGINE = InnoDB; + +CREATE TABLE resource ( + id BIGINT AUTO_INCREMENT, + name VARCHAR(100), + type VARCHAR(50), + url VARCHAR(200), + parent_id BIGINT, + parent_ids VARCHAR(100), + permission VARCHAR(100), + available BOOL DEFAULT FALSE, + PRIMARY KEY (id) +) + CHARSET = utf8 + ENGINE = InnoDB; +CREATE INDEX idx_resource_parent_id ON resource (parent_id); +CREATE INDEX idx_resource_parent_ids ON resource (parent_ids); + +CREATE TABLE role ( + id BIGINT AUTO_INCREMENT, + role VARCHAR(100), + description VARCHAR(100), + resource_ids VARCHAR(100), + available BOOL DEFAULT FALSE, + PRIMARY KEY (id) +) + CHARSET = utf8 + ENGINE = InnoDB; +CREATE INDEX idx_sys_role_resource_ids ON role (resource_ids); + +CREATE TABLE section +( + sec_id INT AUTO_INCREMENT, + course_title VARCHAR(15), + year VARCHAR(5), + limitCount INT, + staff_id VARCHAR(20), + PRIMARY KEY (sec_id) +) + DEFAULT CHARSET = utf8, + ENGINE = InnoDB; + +CREATE TABLE speciality +( + spec_id INT AUTO_INCREMENT, + dept_name VARCHAR(10), + spec_name VARCHAR(15), + year VARCHAR(5), + PRIMARY KEY (spec_id) +) + DEFAULT CHARSET = utf8, + ENGINE = InnoDB; + +CREATE TABLE staff +( + staff_id VARCHAR(30), + staff_name VARCHAR(20), + PRIMARY KEY (staff_id) +) + DEFAULT CHARSET = utf8, + ENGINE = InnoDB; + +CREATE TABLE student +( + student_id VARCHAR(30), + student_name VARCHAR(20), + id_card VARCHAR(20), + year VARCHAR(5), + class_id VARCHAR(10), + telephone_number VARCHAR(20), + student_origin_base VARCHAR(10), + gender VARCHAR(4), + pic_path VARCHAR(45), + leave_of_absence BOOL, + leave_school BOOL, + PRIMARY KEY (student_id) +) + DEFAULT CHARSET = utf8, + ENGINE = InnoDB; + +CREATE TABLE takes +( + student_id VARCHAR(30), + sec_id VARCHAR(30), + score FLOAT, + PRIMARY KEY (student_id, sec_id) +) + DEFAULT CHARSET = utf8, + ENGINE = InnoDB; + +CREATE TABLE timetable +( + sec_id INT, + time VARCHAR(20), + weeks VARCHAR(20), + week VARCHAR(20), + classroom VARCHAR(10) +) + DEFAULT CHARSET = utf8, + ENGINE = InnoDB; + +CREATE TABLE user +( + user_id VARCHAR(30), + password VARCHAR(50), + salt VARCHAR(100), + role_ids VARCHAR(100), + locked BOOL DEFAULT FALSE, + PRIMARY KEY (user_id) +) + DEFAULT CHARSET = utf8, + ENGINE = InnoDB; +CREATE UNIQUE INDEX idx_user_username ON user (user_id); + +#ALTER TABLE staff ADD CONSTRAINT fk_user_staff FOREIGN KEY (staff_id) REFERENCES orders (user_id); +#ALTER TABLE order_book ADD CONSTRAINT fk_courses_user_books_classe FOREIGN KEY (staffs_id) REFERENCES staffs (staff_id), +#FOREIGN KEY (book_title,isbn) REFERENCES book (book_title,isbn), +#FOREIGN KEY (grade,professional,department) REFERENCES class (grade,professional,department), +#FOREIGN KEY (course_id) REFERENCES course (courses_id); + diff --git a/Kubernetes/sql/populate.sql b/Kubernetes/sql/populate.sql new file mode 100644 index 0000000..835d8ec --- /dev/null +++ b/Kubernetes/sql/populate.sql @@ -0,0 +1,50 @@ + +INSERT INTO user (user_id, password, salt, role_ids, locked) +VALUES ('admin', '3ab82b226b3b60f4eab8cd0a88887ba0', 'cd0faf6f821809044e35e35fd23cf44a', '1', 0); + +INSERT INTO user (user_id, password, salt, role_ids, locked) +VALUES ('student', '5476883b25e9c7bb0528b6fdfa0f5de7', '20d98880380112ff6404bdcaa4ba9c10', '2', 0); + +INSERT INTO user (user_id, password, salt, role_ids, locked) +VALUES ('student2', '5476883b25e9c7bb0528b6fdfa0f5de7', '20d98880380112ff6404bdcaa4ba9c10', '2', 0); + + +INSERT INTO user (user_id, password, salt, role_ids, locked) +VALUES ('teacher', 'f7e7844cad9aadb0c7f1722f2c9be050', 'a7bbf832a7472759146b0967a78e6ce5', '3', 0); + +INSERT INTO user (user_id, password, salt, role_ids, locked) +VALUES ('supplier', '19a885f6627571598621fe5f5e9cbbc5', '9c64193184d34fa04a205d06b93ca3d6', '4', 0); + +INSERT INTO role (role, description, resource_ids, available) VALUES ('admin', '管理员', '', 1); +INSERT INTO role (role, description, resource_ids, available) VALUES ('student', '学生', '', 1); +INSERT INTO role (role, description, resource_ids, available) VALUES ('teacher', '老师', '', 1); +INSERT INTO role (role, description, resource_ids, available) VALUES ('supplier', '供应商', '', 1); + +INSERT INTO staff (staff_id, staff_name) VALUES ('teacher', 'teacher'); + + +INSERT INTO book (book_title, isbn, date_of_printing, author, press, category, unit_price) +VALUES ('Effective JAVA', '1561315135213', '2008', 'Joshua Bloch', '工业出版社', 'A', 88); + +INSERT INTO department (dept_name) VALUES ('管理系'); +INSERT INTO department (dept_name) VALUES ('信息工程系'); +INSERT INTO department (dept_name) VALUES ('机电系'); + +INSERT INTO speciality (dept_name, spec_name) VALUES ('信息工程系', '网络工程'); + +INSERT INTO section (course_title, year, limitCount, staff_id) VALUES ('网络技术', 20161, 8, 'teacher'); + +INSERT INTO order_book (staff_id, sec_id, book_title, isbn, remark, approval) +VALUES ('teacher', 1, 'Effective JAVA', '1561315135213', '不要二手', 1); + +INSERT INTO course (course_title, type, credits, speciality) +VALUES ('网络技术', '必修课/公共课', 4, '网络工程'); + +INSERT INTO class (class_id, year, spec_name) +VALUES ('161111', 20161, '网络工程'); + +INSERT INTO takes (student_id, sec_id, score) +VALUES ('student', 1, 5); + +INSERT INTO takes (student_id, sec_id, score) +VALUES ('student2', 1, 5); \ No newline at end of file diff --git a/Kubernetes/tomcat-deployment.yaml b/Kubernetes/tomcat-deployment.yaml new file mode 100644 index 0000000..015f842 --- /dev/null +++ b/Kubernetes/tomcat-deployment.yaml @@ -0,0 +1,41 @@ +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + annotations: + labels: + app: tomcat + +# kompose.cmd: kompose --file docker-compose.yml convert +# kompose.version: 1.17.0 (a74acad) + creationTimestamp: null +# labels: +# io.kompose.service: tomcat-1-node-1 + name: tomcat +spec: + selector: + matchLabels: + app: tomcat + replicas: 1 +# strategy: +# type: Recreate + template: + metadata: + creationTimestamp: null + labels: + app: tomcat +# io.kompose.service: tomcat-1-node-1 + spec: + containers: + - env: + - name: JDBC_URL + value: "jdbc:mysql://db:3306/giit?connectTimeout=0&socketTimeout=0&autoReconnect=true" + - name: MYSQL_PASSWORD + value: example_db_pass + - name: MYSQL_USER + value: example_db_user + image: yuvarajmindtree/tomcat:latest + name: tomcat +# resources: {} +# restartPolicy: Always +status: {} + diff --git a/README.md b/README.md index 3a6caaf..bd4b648 100644 --- a/README.md +++ b/README.md @@ -1,80 +1,75 @@ -# 简介 -这是个简单的教务系统网站,并且结合了图书订购功能,希望这个小DEMO能对大家学习有帮助 +Introduction +This is a simple educational system website, and combined with the book ordering function, I hope this small DEMO can help everyone learn. -# 使用技术 +Use technology +IoC container: spring -IoC容器:spring +Web framework: springmvc -web框架:springmvc +Orm framework: mybatis -orm框架:mybatis +Security framework: shiro -安全框架:shiro +Data source: dbcp2 -数据源:dbcp2 - -日志: sl4j +Log: sl4j Json: Gson -前端框架:Bootstrap - -# 起步: - -1.初始化项目 - -1)下载Mysql,创建一个数据库名字为giit,导入create.sql与populate.sql,直接运行其中sql即可 +Front End Framework: Bootstrap -2)下载Tomcat +Start: +1. Initialize the project -3)使用Intellij Idea导入项目,之后配置项目启动方式,使用刚才下载好的Tomcat - -4)运行 +1) Download Mysql, create a database name for giit, import create.sql and populate.sql, run sql directly - +2) Download Tomcat -# 使用简介: +3) Import the project using Intellij Idea, then configure the project startup mode, use the Tomcat just downloaded -1.权限介绍: +4) running -根据导入的populate.sql,运行网站初始时会存在四个权限角色: +image -1).管理员,账号为admin +Introduction to use: +1. Introduction to permissions: -2).学生,账号为student +According to the imported populate.sql, there are four permission roles when running the website initially: -3).教师,账号为teache +1). Administrator, account is admin -4).供应商,账号为supplier +2). Student, account number is student -*密码均为123456* +3). Teacher, account number is teache -# 功能介绍: -## 1.基本信息功能: -其中可以设置一些基本的学校信息,也就是数据库中的实体-关系,之后就可以基于这些基本的关系信息进行更加复杂的功能,例如选课后可以记录多少学生选择了这门课程,只会教师提交图书后计算图书总数可以通过其中的关系得到 +4). Supplier, account number is supplier -1)系部信息 +The password is 123456 -2)专业信息 +Features: +1. Basic information function: +Some basic school information, that is, entity-relationships in the database, can be set up, and then more complex functions can be performed based on these basic relationship information. For example, after class selection, how many students can select this course, only the teacher submits The total number of books counted after the book can be obtained through the relationship -3)班级信息 +1) Department information -4)课程信息 +2) Professional information -5)学生管理 +3) Class information - +4) Course Information +5) Student Management -## 2.图书管理功能: -1)教师上传图书 +image -2)秘书审批图书 +2. Book management function: +1) Teacher uploads books -3)查看已审核图书 +2) Secretary approves books - +3) View reviewed books -# 数据库表结构: - +image +Database table structure: +image diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..eee87cc --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,63 @@ +# MySQL database shared with tomcat containers. +db: + image: mysql:latest + environment: + MYSQL_ROOT_PASSWORD: admin + MYSQL_DATABASE: giit + MYSQL_USER: example_db_user + MYSQL_PASSWORD: example_db_pass + volumes: + - ./sql:/docker-entrypoint-initdb.d + # expose: + # - "3306" + +# First node of the first Tomcat virtual host. +tomcat_1_node_1: + image: tomcat:latest + # Environment variables do not appear to be getting loaded the first time Tomcat starts! + environment: + # VIRTUAL_HOST: tomcat_1.mulligan.ie + # VIRTUAL_PORT: 8080 + JDBC_URL: jdbc:mysql://db:3306/giit?connectTimeout=0&socketTimeout=0&autoReconnect=true + MYSQL_USER: example_db_user + MYSQL_PASSWORD: example_db_pass + volumes: + - ./tomcat:/usr/local/tomcat/webapps + # expose: + # - "8080" + links: + - db + +# Second node of the first Tomcat virtual host. +tomcat_1_node_2: + image: tomcat:latest + # Environment variables do not appear to be getting loaded the first time Tomcat starts! + environment: + # VIRTUAL_HOST: tomcat_1.mulligan.ie + # VIRTUAL_PORT: 8080 + JDBC_URL: jdbc:mysql://db:3306/giit?connectTimeout=0&socketTimeout=0&autoReconnect=true + MYSQL_USER: example_db_user + MYSQL_PASSWORD: example_db_pass + volumes: + - ./tomcat:/usr/local/tomcat/webapps + # expose: + # - "8080" + links: + - db + +# nginx container that automatically creates a load balancer / reverse proxy across the 3 tomcat containers / 2 virtual hosts. +nginx: +#image: jwilder/nginx-proxy:latest + image: nginx:1.13 + restart: always + volumes: + - ./nginx:/etc/nginx/conf.d + ports: + - "8081:80" + # - "443:443" + # volumes: + # - /var/run/docker.sock:/tmp/docker.sock:ro + + links: + - tomcat_1_node_1 + - tomcat_1_node_2 diff --git a/nginx/nginx.conf b/nginx/nginx.conf new file mode 100644 index 0000000..8b73876 --- /dev/null +++ b/nginx/nginx.conf @@ -0,0 +1,15 @@ + + upstream backend { + server tomcat_1_node_1:8080; + server tomcat_1_node_2:8080; + # server 192.0.0.1 backup; +# server tomcat_1.mulligan.ie:8080; +# server tomcat_2.mulligan.ie:8080 + } +server { + listen 80; + location / { + proxy_pass http://backend; + } +} + diff --git a/src/main/webapp/WEB-INF/view/admin/college/clazz.jsp b/src/main/webapp/WEB-INF/view/admin/college/clazz.jsp index b75aa5c..a272818 100644 --- a/src/main/webapp/WEB-INF/view/admin/college/clazz.jsp +++ b/src/main/webapp/WEB-INF/view/admin/college/clazz.jsp @@ -7,14 +7,14 @@