diff --git a/README.md b/README.md index 903b9b0..78bea1b 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,30 @@ # interro_robot -审讯机器人 \ No newline at end of file +审讯机器人 + + +## 部署说明 + +#### web端docker构建 +> 把docker文件夹放到服务器目录下,进入目录 +```shell +- 进入web目录 +# 执行构建命令 +docker build -t interro_web:1.0.0 . + +# 把web/interro_robot-0.0.1-SNAPSHOT文件复制到/data/intro-robot/目录下 +# 启动容器 +docker run --name interro-robot-web -p 9800:9800 -v /data/intro-robot/:/data/intro-robot/ -d interro-robot-web:1.0.0 --spring.profiles.active=dev + +``` + +### nginx docker构建 + +```shell +# 进入nginx目录 +# 构建nginx镜像 +docker build -t interro_nginx:1.0.0 . +# 把nginx/dist文件复制到/data/intro-robot/目录下 +# 启动nginx容器 +docker run --name interro-robot-nginx -p 543:443 -v /data/intro-robot/dist:/usr/share/nginx/html/dist -d -e UPSTREAM_WEB_SERVERS=192.168.10.137:9800 interro-robot-nginx:1.0.0 +``` \ No newline at end of file diff --git a/docker/nginx/Dockerfile b/docker/nginx/Dockerfile new file mode 100644 index 0000000..98fc719 --- /dev/null +++ b/docker/nginx/Dockerfile @@ -0,0 +1,23 @@ +# 设置基础镜像 +FROM nginx:1.25 + +# 覆盖原镜像的启动脚本 +COPY docs/docker-entrypoint.sh /docker-entrypoint.sh +RUN chmod 777 /docker-entrypoint.sh + +# 删除默认的配置文件 +RUN rm /etc/nginx/conf.d/default.conf + +# 复制配置文件信息 +COPY docs/conf.d/http.conf ./docs/conf.d/https.conf /etc/nginx/conf.d/ +COPY docs/conf.d/nginx.conf /etc/nginx/nginx.conf +COPY docs/conf.d/servers.conf.template /data/vp/nginx/conf/servers.conf.template + +# 复制ssl证书信息 +COPY docs/ssl /data/vp/nginx/ssl + +# 暴漏服务端口 +EXPOSE 80 443 + +# 设置启动命令 +CMD ["nginx","-g","daemon off;"] \ No newline at end of file diff --git a/docker/nginx/README.md b/docker/nginx/README.md new file mode 100644 index 0000000..e2753ab --- /dev/null +++ b/docker/nginx/README.md @@ -0,0 +1,26 @@ +# 构建步骤 +- 把前端文件放html目录下 +- 运行Dockerfile文件构建镜像 docker build -t vp/nginx:1.25 . + +# 启动说明 +- docker run -itd --name nginx-test3 -p8819:80 -p443:443 \ + - e UPSTREAM_WEB_SERVERS=192.168.10.138:8899 \ + -e UPSTREAM_MANAGE_SERVERS=192.168.10.138:8891 vp/nginx:1.25 + - itd : -itd : 无交互模式启动 + - -p8819:80 -p443:443 : 端口映射 **必填** + - UPSTREAM_WEB_SERVERS : 后端服务器地址,只允许有单个。 **必填** + - UPSTREAM_MANAGE_SERVERS : 管理服务器地址,只允许有单个。**非必填,不填默认与UPSTREAM_WEB_SERVERS相等** + - vp/nginx:1.25 构建的镜像名称 + +# 注意事项 +- 如果需要对后端服务进行负载均衡把 /data/vp/nginx/conf/ 目录挂载出来,然后创建配置文件servers.conf\ + 编辑配置文件: + ```shell + upstream web_servers { + server $UPSTREAM_WEB_SERVERS; + } + + upstream manage_servers { + server $UPSTREAM_MANAGE_SERVERS; + } + ``` diff --git a/docker/nginx/docs/conf.d/http.conf b/docker/nginx/docs/conf.d/http.conf new file mode 100644 index 0000000..f4a550c --- /dev/null +++ b/docker/nginx/docs/conf.d/http.conf @@ -0,0 +1,27 @@ +server { + listen 80; + listen [::]:80; + server_name localhost; + + #access_log /var/log/nginx/host.access.log main; + client_max_body_size 20M; # 设置客户端请求的最大上传大小为 20MB,可以根据实际情况修改 + + location / { + root /usr/share/nginx/html/dist; + index index.html index.htm; + } + + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /usr/share/nginx/html/dist; + } + + # 前台后端服务 + location /intro-robot/ { + proxy_pass http://web_servers/intro-robot/; + proxy_set_header Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } +} \ No newline at end of file diff --git a/docker/nginx/docs/conf.d/https.conf b/docker/nginx/docs/conf.d/https.conf new file mode 100644 index 0000000..4db3c4c --- /dev/null +++ b/docker/nginx/docs/conf.d/https.conf @@ -0,0 +1,44 @@ +server { + listen 443 ssl; + server_name example.com; + + ssl_certificate /data/vp/nginx/ssl/cert.pem; + ssl_certificate_key /data/vp/nginx/ssl/key.pem; + + # 配置SSL参数 + ssl_protocols TLSv1.2 TLSv1.3; + ssl_prefer_server_ciphers on; + ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384; + + # 配置SSL会话缓存 + ssl_session_cache shared:SSL:10m; + ssl_session_timeout 30m; + + # 配置SSL安全性选项 + ssl_stapling on; + ssl_stapling_verify on; + resolver 8.8.8.8 8.8.4.4 valid=300s; + resolver_timeout 5s; + + client_max_body_size 20M; # 设置客户端请求的最大上传大小为 20MB,可以根据实际情况修改 + + location / { + root /usr/share/nginx/html/dist; + index index.html index.htm; + # add_header Cache-Control no-store; + } + + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /usr/share/nginx/html/dist; + } + + # 前台后端服务 + location /intro-robot/ { + proxy_pass http://web_servers/intro-robot/; + proxy_set_header Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } +} \ No newline at end of file diff --git a/docker/nginx/docs/conf.d/nginx.conf b/docker/nginx/docs/conf.d/nginx.conf new file mode 100644 index 0000000..012057b --- /dev/null +++ b/docker/nginx/docs/conf.d/nginx.conf @@ -0,0 +1,33 @@ +user nginx; +worker_processes auto; + +error_log /var/log/nginx/error.log notice; +pid /var/run/nginx.pid; + + +events { + worker_connections 1024; +} + + +http { + include /etc/nginx/mime.types; + default_type application/octet-stream; + + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"'; + + access_log /var/log/nginx/access.log main; + + sendfile on; + #tcp_nopush on; + + keepalive_timeout 65; + + #gzip on; + + include /data/vp/nginx/conf/*.conf; + include /etc/nginx/conf.d/*.conf; + +} \ No newline at end of file diff --git a/docker/nginx/docs/conf.d/servers.conf.template b/docker/nginx/docs/conf.d/servers.conf.template new file mode 100644 index 0000000..1eb6b03 --- /dev/null +++ b/docker/nginx/docs/conf.d/servers.conf.template @@ -0,0 +1,6 @@ +# 前台服务后端地址,多个地址可用与负载均衡 +# 解析以逗号分隔的多个 upstream 值 + + upstream web_servers { + server $UPSTREAM_WEB_SERVERS; + } diff --git a/docker/nginx/docs/docker-entrypoint.sh b/docker/nginx/docs/docker-entrypoint.sh new file mode 100644 index 0000000..7ba19f3 --- /dev/null +++ b/docker/nginx/docs/docker-entrypoint.sh @@ -0,0 +1,57 @@ +#!/bin/sh +# vim:sw=4:ts=4:et + +set -e +# /etc/nginx/conf.d/servers.conf 文件不存在,就通过环境变量 UPSTREAM_WEB_SERVERS,UPSTREAM_MANAGE_SERVERS生成/data/vp/nginx/conf/servers.conf +if [ ! -f "/data/vp/nginx/conf/servers.conf" ]; then + echo "BEGIN REPLACE SERVERS.CONF ...." + # 替换文件中的变量 + envsubst '$UPSTREAM_WEB_SERVERS' < /data/vp/nginx/conf/servers.conf.template > /data/vp/nginx/conf/servers.conf + echo "REPLACEMENT COMPLETE" +else + echo "SERVERS.CONF ALREADY EXISTS" +fi + + +entrypoint_log() { + if [ -z "${NGINX_ENTRYPOINT_QUIET_LOGS:-}" ]; then + echo "$@" + fi +} + +if [ "$1" = "nginx" ] || [ "$1" = "nginx-debug" ]; then + if /usr/bin/find "/docker-entrypoint.d/" -mindepth 1 -maxdepth 1 -type f -print -quit 2>/dev/null | read v; then + entrypoint_log "$0: /docker-entrypoint.d/ is not empty, will attempt to perform configuration" + + entrypoint_log "$0: Looking for shell scripts in /docker-entrypoint.d/" + find "/docker-entrypoint.d/" -follow -type f -print | sort -V | while read -r f; do + case "$f" in + *.envsh) + if [ -x "$f" ]; then + entrypoint_log "$0: Sourcing $f"; + . "$f" + else + # warn on shell scripts without exec bit + entrypoint_log "$0: Ignoring $f, not executable"; + fi + ;; + *.sh) + if [ -x "$f" ]; then + entrypoint_log "$0: Launching $f"; + "$f" + else + # warn on shell scripts without exec bit + entrypoint_log "$0: Ignoring $f, not executable"; + fi + ;; + *) entrypoint_log "$0: Ignoring $f";; + esac + done + + entrypoint_log "$0: Configuration complete; ready for start up" + else + entrypoint_log "$0: No files found in /docker-entrypoint.d/, skipping configuration" + fi +fi + +exec "$@" \ No newline at end of file diff --git a/docker/nginx/docs/ssl/cert.pem b/docker/nginx/docs/ssl/cert.pem new file mode 100644 index 0000000..1764975 --- /dev/null +++ b/docker/nginx/docs/ssl/cert.pem @@ -0,0 +1,21 @@ +-----BEGIN CERTIFICATE----- +MIIDdzCCAl8CFC5Pwm//gTURwneg5cjhbkyueufNMA0GCSqGSIb3DQEBCwUAMHgx +CzAJBgNVBAYTAkNIMQswCQYDVQQIDAJOSjEOMAwGA1UEBwwFbmogeWgxDDAKBgNV +BAoMA3NzdDEMMAoGA1UECwwDc3N0MQ8wDQYDVQQDDAZzc3RvcmcxHzAdBgkqhkiG +9w0BCQEWEDEyMzQ1NkBlbWFpbC5jb20wHhcNMjMxMTEwMDEyMzIzWhcNMjMxMjEw +MDEyMzIzWjB4MQswCQYDVQQGEwJDSDELMAkGA1UECAwCTkoxDjAMBgNVBAcMBW5q +IHloMQwwCgYDVQQKDANzc3QxDDAKBgNVBAsMA3NzdDEPMA0GA1UEAwwGc3N0b3Jn +MR8wHQYJKoZIhvcNAQkBFhAxMjM0NTZAZW1haWwuY29tMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA0/VotZw72C+GVQnKsVfwtxeXEPPfiUfE0/H6mp8A +jhxHnFofNK5mvjYs3++U9UEfP1jq84flaD5qgrEGzhauJg6NdrLdcd9RCguu8Pkm +YHIMVl9UzLQexKg15wh0Fc8S6vc3xGBPfosS29YJulXcUZB2CeVJ9CXCTx2Z1dRG +Ug9eMTiPwgB8GnQ56h2GjTyCnVWeVoXBFVef6sY0czkPoJVPk7TZI3K5BmaLBNX1 +0L4OzaJtOa6ZWll3rGxVrk/7oB+Z3t3l8NXF9SrmC039K3sZerNLjlVUdkGD52jz +xCc4Eixcus2pduKfIP3dUhdn05TNUln1/nIFRErcXUWdswIDAQABMA0GCSqGSIb3 +DQEBCwUAA4IBAQCLmsogw3J6KOyHnzaWQaKvhRzqPAupIBY4HYTk+hyOahgMMkkd ++3QIiWU/pp0Nu5iyYytzGRCQIz1Jh+xpk3UQVpayDB8C4XIB7oyzpuatTuyeCvq/ +lnDlk8jk64EewLLWE2pOce6yAKZ/xhcQiDI9YcjgGOkUOjv7Hgqhzwlafrt5FXGB +znFmVi5A52RqkkteplkRsl08OE5VmfxwFYJWZ7QXMlp5ec13oCE21PU+cmLLF/Vb +xl7JJKeMOgDICiSczcYzwP56SiYFktKQ8KmDotFWgBM9mtxkEcOqPb2Xe9vzOclk +AK+5bHhgF2yZGhjbNuzp/FwGSAIozuR5IXxJ +-----END CERTIFICATE----- diff --git a/docker/nginx/docs/ssl/csr.pem b/docker/nginx/docs/ssl/csr.pem new file mode 100644 index 0000000..ba2dff7 --- /dev/null +++ b/docker/nginx/docs/ssl/csr.pem @@ -0,0 +1,17 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIICvTCCAaUCAQAweDELMAkGA1UEBhMCQ0gxCzAJBgNVBAgMAk5KMQ4wDAYDVQQH +DAVuaiB5aDEMMAoGA1UECgwDc3N0MQwwCgYDVQQLDANzc3QxDzANBgNVBAMMBnNz +dG9yZzEfMB0GCSqGSIb3DQEJARYQMTIzNDU2QGVtYWlsLmNvbTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBANP1aLWcO9gvhlUJyrFX8LcXlxDz34lHxNPx ++pqfAI4cR5xaHzSuZr42LN/vlPVBHz9Y6vOH5Wg+aoKxBs4WriYOjXay3XHfUQoL +rvD5JmByDFZfVMy0HsSoNecIdBXPEur3N8RgT36LEtvWCbpV3FGQdgnlSfQlwk8d +mdXURlIPXjE4j8IAfBp0Oeodho08gp1VnlaFwRVXn+rGNHM5D6CVT5O02SNyuQZm +iwTV9dC+Ds2ibTmumVpZd6xsVa5P+6Afmd7d5fDVxfUq5gtN/St7GXqzS45VVHZB +g+do88QnOBIsXLrNqXbinyD93VIXZ9OUzVJZ9f5yBURK3F1FnbMCAwEAAaAAMA0G +CSqGSIb3DQEBCwUAA4IBAQCFdN/RMNZtduCGs21f5Le4uGePh2nHzqB2tPzPsWYV +LLPO/pInHB0lQ3vJLFtIeaTLIDwB+AFcdM7rNhMGz9rj/Qrk9LCvgm+CQGUOy1h4 +r1tJ27z+8xfwHls/fgghHnSLoaUvma2FfIQzZc/rGTDLkdERBZ1skxOVqIw56qlA +aPyKUt9s/fg6P5xMSv5SDIR89n0i3TChSa8nNdHV1Ld44mLZ7Aw29ChXI5DaQ05t +B6rdNz3AofmxlkzHIlFl46kPMy4H5jgHWlOBT+eLHv/fecPWCNpgnr9vi7O2Ih9o +i8KHDeK1T9Bl5U+sGof6E0Sey/xBOEGnYzuiQUl4kxfL +-----END CERTIFICATE REQUEST----- diff --git a/docker/nginx/docs/ssl/key.pem b/docker/nginx/docs/ssl/key.pem new file mode 100644 index 0000000..adb651d --- /dev/null +++ b/docker/nginx/docs/ssl/key.pem @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDT9Wi1nDvYL4ZV +CcqxV/C3F5cQ89+JR8TT8fqanwCOHEecWh80rma+Nizf75T1QR8/WOrzh+VoPmqC +sQbOFq4mDo12st1x31EKC67w+SZgcgxWX1TMtB7EqDXnCHQVzxLq9zfEYE9+ixLb +1gm6VdxRkHYJ5Un0JcJPHZnV1EZSD14xOI/CAHwadDnqHYaNPIKdVZ5WhcEVV5/q +xjRzOQ+glU+TtNkjcrkGZosE1fXQvg7Nom05rplaWXesbFWuT/ugH5ne3eXw1cX1 +KuYLTf0rexl6s0uOVVR2QYPnaPPEJzgSLFy6zal24p8g/d1SF2fTlM1SWfX+cgVE +StxdRZ2zAgMBAAECggEAAPoKh3u20uI1LkMjSfnrxAw5x/w3tXw9LfTZgMjmycDb +m57Wsflzw8CgKFAEUbUBHdudCY5AwmA3QW7rZxu3pbk/caKVXqb2yqMPJVEgmiUs +ZWF/FIpn8eQMi4oAbvFLVwXYnfELrLubVKQB23f10fJmeNkzpApggNjUEqYtxMcH +MjfUmXzrZhvFKdRjdmyITa4gI9djuRvOIfWz0bZTePUtcfgCfpkM3lbxWRIst7Dg +FqCcgX68XOHHDCzzWTE7LasFBZx3mAcOyRMC+MKw96becC4r1c2KFFKh8tFp57y2 +hQ1ybjxeF2MaWf3I/ioi2uTUza+L8m2RsKwABcRwIQKBgQDUrnn/WtKdryDU0rBj +cwsKTrMCycblwYCJj58cGSiETTVJOlhh1N2QtE/kwQI69tUVOc7C5p5FZzk+iff7 +KwvwDqurtW5kKHE5IamUnKqv32bbHuRtg9CB0ktmmbxOrwP5s+QGhh5fKGvFKs3D +xVytLVw76f+BLK4NaBbzCdEN6wKBgQD/IT0F9f9XnTIa1a/bNVLCuRRZdWjDK40i +bD8EgO9T/FxK4yXSV3IB2C6mQNdMxDcmFBTS7EoXPZpZYuFCqBKQvV1OQ0yUAy2b ++PmmZMBakbpQHkIjkq2cgXNXaVdDeKPfoG4SqPz/6x7p/Np/UG9Ey8juNuQXmIiH +wwjwTfqVWQKBgQDNd6ogykuDTvd24/zIdxIJaTKD1Q+0U5asTvY2HRAJkNWT4ywT +h6Rt8eTlaJmRAXmmQezAWjA5eJnTE1NhcZrc1i9/eY4mcPPBcAX2rswvkLI7qsKg +EqJTaSiy/H7xvR8oE2SN8PBSmihTmSCkq3z3SUU8FLpkvxd/mDnjnm469QKBgQCg +rRQ7ftPTH+MAV3erPIfkrp8MQA88a181QKrncTRI1nRhjXCyafQZCUdH2So+5Iw+ +5QLAW6PFwzxD8yweyK74jOoIcgX2aZH92u2PR4CFCaYm8weAU84W9MfpUyRsD7xV +CDqKcfb0TeVoQ6Bv8f5Be34N2HAKFDxYFBK7FMEt8QKBgDNBG3n8/912dDWV1Dve +o4v+TAnlAMHgEXZH+VCCzeIyj1UkUh4sxdIGGaGCPrWGrqxIYIKPKX8gPIWQ7QJj +QJZyL5nqGXWwZUvBuHzE3tB24XJpuHGfg+oBdDfg0aiEMTQKnRORdgHHVdB9W3SN +2TrXQbtwB1X+wioA4615n6ih +-----END PRIVATE KEY----- diff --git a/docker/web/Dockerfile b/docker/web/Dockerfile new file mode 100644 index 0000000..d816637 --- /dev/null +++ b/docker/web/Dockerfile @@ -0,0 +1,16 @@ +# 设置基础镜像 +FROM registry.cn-beijing.aliyuncs.com/longbei/jdk:latest + +WORKDIR /data/intro-robot/ +# 复制java jar 到容器中 +COPY interro_robot-0.0.1-SNAPSHOT.jar /data/intro-robot/interro_robot-0.0.1-SNAPSHOT.jar + +COPY docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh +RUN chmod 777 /usr/local/bin/docker-entrypoint.sh + + +# 暴漏服务端口 +EXPOSE 8891 + +# 设置启动命令 +ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"] \ No newline at end of file diff --git a/docker/web/docker-entrypoint.sh b/docker/web/docker-entrypoint.sh new file mode 100644 index 0000000..d986c7b --- /dev/null +++ b/docker/web/docker-entrypoint.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +# 启动jar包 +java -jar -Duser.timezone=Asia/Shanghai -Dfile.encoding=UTF-8 /data/intro-robot/interro_robot-0.0.1-SNAPSHOT.jar "$@" \ No newline at end of file diff --git a/src/test/java/com/supervision/AskApplicationTests.java b/src/test/java/com/supervision/AskApplicationTests.java index 6d3bce2..0cd3923 100644 --- a/src/test/java/com/supervision/AskApplicationTests.java +++ b/src/test/java/com/supervision/AskApplicationTests.java @@ -18,22 +18,14 @@ import freemarker.template.Template; import freemarker.template.TemplateException; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.apache.tika.metadata.Metadata; -import org.apache.tika.parser.AutoDetectParser; -import org.apache.tika.parser.ParseContext; -import org.apache.tika.parser.Parser; -import org.apache.tika.sax.BodyContentHandler; import org.junit.jupiter.api.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.mock.web.MockMultipartFile; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; -import javax.sound.sampled.AudioInputStream; -import javax.sound.sampled.AudioSystem; import javax.sound.sampled.UnsupportedAudioFileException; import java.io.*; import java.util.HashMap;