From 669ced90731785374b3ae9003a261d282752c561 Mon Sep 17 00:00:00 2001 From: rikugun Date: Sun, 12 Apr 2020 21:58:20 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0docker=20=E6=94=AF?= =?UTF-8?q?=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .dockerignore | 119 ++++++++++++++++++++++++++++++++ Dockerfile | 41 +++++++++++ docker/docker-start.sh | 4 ++ docker/etc/nginx/nginx.conf.tpl | 56 +++++++++++++++ server/config.yaml | 4 +- server/{db => }/db.db | Bin 368640 -> 372736 bytes server/initialize/sqlite.go | 2 +- server/service/sys_menu.go | 7 +- 8 files changed, 227 insertions(+), 6 deletions(-) create mode 100644 .dockerignore create mode 100644 Dockerfile create mode 100755 docker/docker-start.sh create mode 100644 docker/etc/nginx/nginx.conf.tpl rename server/{db => }/db.db (90%) diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..4e352a51 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,119 @@ +# Created by .ignore support plugin (hsz.mobi) +### Node template +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.test + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 + +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.pnp.* + +**/node_modules diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..5a055230 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,41 @@ +FROM golang:alpine as builder +RUN apk add --update --no-cache yarn make g++ +RUN yarn global add cross-env node-sass + +ENV GOPROXY=https://goproxy.cn,https://goproxy.io,direct \ + GO111MODULE=on \ + CGO_ENABLED=1 +WORKDIR /go/src/gin-vue-admin +RUN go env -w GOPROXY=https://goproxy.cn,https://goproxy.io,direct +COPY server/ ./ +RUN go env && go list && go build -v -a -ldflags "-extldflags \"-static\" " -o gvadmin . + +WORKDIR /web +COPY web/ ./ +RUN yarn install && yarn run build + + +FROM nginx:alpine +LABEL MAINTAINER="rikugun" + +RUN apk add --no-cache gettext tzdata && \ + cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ + echo "Asia/Shanghai" > /etc/timezone && \ + date && \ + apk del tzdata + +COPY docker/etc/nginx/nginx.conf.tpl /etc/nginx/nginx.conf.tpl +WORKDIR /app +#copy web +COPY --from=builder /web/dist/ /var/www/ +#copy go app +COPY --from=builder /go/src/gin-vue-admin/gvadmin ./ +COPY --from=builder /go/src/gin-vue-admin/db.db ./ +COPY --from=builder /go/src/gin-vue-admin/config.yaml ./ +COPY --from=builder /go/src/gin-vue-admin/resource ./resource +COPY docker/docker-start.sh ./ + +ENV API_SERVER="http://localhost:8888/" +EXPOSE 80 + +ENTRYPOINT ["./docker-start.sh"] diff --git a/docker/docker-start.sh b/docker/docker-start.sh new file mode 100755 index 00000000..df7e2e76 --- /dev/null +++ b/docker/docker-start.sh @@ -0,0 +1,4 @@ +#!/bin/sh +envsubst '$API_SERVER' < /etc/nginx/nginx.conf.tpl > /etc/nginx/nginx.conf +env nginx +./gvadmin diff --git a/docker/etc/nginx/nginx.conf.tpl b/docker/etc/nginx/nginx.conf.tpl new file mode 100644 index 00000000..c96973cb --- /dev/null +++ b/docker/etc/nginx/nginx.conf.tpl @@ -0,0 +1,56 @@ +daemon on; +worker_processes 50; +#error_log /dev/stdout warn; +error_log /var/log/nginx/error.log error; + + +events { + worker_connections 1024; +} + + +http { + include mime.types; + default_type application/octet-stream; + # See http://licson.net/post/optimizing-nginx-for-large-file-delivery/ for more detail + # This optimizes the server for HLS fragment delivery + sendfile off; + #tcp_nopush on; + keepalive_timeout 65; + 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 /dev/stdout combined; + +# ssl_ciphers HIGH:!aNULL:!MD5; +# ssl_protocols TLSv1 TLSv1.1 TLSv1.2; +# ssl_session_cache shared:SSL:10m; +# ssl_session_timeout 10m; + +server { + listen 80; + + # Uncomment these lines to enable SSL. + # Update the ssl paths with your own certificate and private key. + # listen 443 ssl; + # ssl_certificate /opt/certs/example.com.crt; + # ssl_certificate_key /opt/certs/example.com.key; + location / { + root /var/www; + try_files $uri $uri/ /index.html; + index index.html; + } + + location /v1/ { + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Port $server_port; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header Host $host; + proxy_pass ${API_SERVER} ; + } + +} + +} diff --git a/server/config.yaml b/server/config.yaml index 0f10318a..30af1073 100644 --- a/server/config.yaml +++ b/server/config.yaml @@ -20,7 +20,7 @@ mysql: log-mode: true #sqlite 配置 sqlite: - path: db/db.db + path: db.db log-mode: true config: 'loc=Asia/Shanghai' # oss configuration @@ -39,7 +39,7 @@ system: use-multipoint: false env: 'public' # Change to "develop" to skip authentication for development mode addr: 8888 - db-type: "mysql" + db-type: "sqlite" # support mysql/sqlite # captcha configuration captcha: diff --git a/server/db/db.db b/server/db.db similarity index 90% rename from server/db/db.db rename to server/db.db index 73a5833b85ed0d68bbdeb1772c4bb40d01614b55..edf5416cbbba4718c299306c7f7e8c7a848eadcb 100644 GIT binary patch delta 6986 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 b1-eR}GF_%Tm-fbxD`Th;)}If=(3O7$CWD|6 delta 4241 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 O#~)n>%NsY??*9VHmAT3Q diff --git a/server/initialize/sqlite.go b/server/initialize/sqlite.go index 68315ffe..235fa9d4 100644 --- a/server/initialize/sqlite.go +++ b/server/initialize/sqlite.go @@ -11,7 +11,7 @@ import ( func Sqlite() { admin := global.GVA_CONFIG.Sqlite if db, err := gorm.Open("sqlite3", fmt.Sprintf("%s?%s", admin.Path,admin.Config)); err != nil { - global.GVA_LOG.Error("DEFAULTDB数据库启动异常", err) + global.GVA_LOG.Error("DEFAULT DB数据库启动异常", err) } else { global.GVA_DB = db global.GVA_DB.LogMode(admin.LogMode) diff --git a/server/service/sys_menu.go b/server/service/sys_menu.go index ffa04dc3..086386fb 100644 --- a/server/service/sys_menu.go +++ b/server/service/sys_menu.go @@ -14,8 +14,8 @@ import ( // @return err error // @return menus []model.SysMenu func GetMenuTree(authorityId string) (err error, menus []model.SysMenu) { - sql := "SELECT authority_menu.created_at,authority_menu.updated_at,authority_menu.deleted_at,authority_menu.menu_level,authority_menu.parent_id,authority_menu.path,authority_menu.`name`,authority_menu.hidden,authority_menu.component,authority_menu.title,authority_menu.icon,authority_menu.sort,authority_menu.menu_id,authority_menu.authority_id FROM sys_menus authority_menu WHERE authority_menu.authority_id = ? AND authority_menu.parent_id = ?" - + //sql := "SELECT authority_menu.created_at,authority_menu.updated_at,authority_menu.deleted_at,authority_menu.menu_level,authority_menu.parent_id,authority_menu.path,authority_menu.`name`,authority_menu.hidden,authority_menu.component,authority_menu.title,authority_menu.icon,authority_menu.sort,authority_menu.menu_id,authority_menu.authority_id FROM sys_menus authority_menu WHERE authority_menu.authority_id = ? AND authority_menu.parent_id = ?" + sql := "SELECT authority_menu.created_at,authority_menu.updated_at,authority_menu.deleted_at,authority_menu.menu_level,authority_menu.parent_id,authority_menu.path,authority_menu.`name`,authority_menu.hidden,authority_menu.component,authority_menu.title,authority_menu.icon,authority_menu.sort,authority_menu.id menu_id,am.sys_authority_authority_id authority_id FROM sys_base_menus authority_menu left join sys_authority_menus am on authority_menu.id = am.sys_base_menu_id WHERE am.sys_authority_authority_id = ? AND authority_menu.parent_id = ? " err = global.GVA_DB.Raw(sql, authorityId, 0).Scan(&menus).Error for i := 0; i < len(menus); i++ { err = getChildrenList(&menus[i], sql) @@ -119,7 +119,8 @@ func AddMenuAuthority(menus []model.SysBaseMenu, authorityId string) (err error) // @return err error // @return menus []SysBaseMenu func GetMenuAuthority(authorityId string) (err error, menus []model.SysMenu) { - sql := "SELECT authority_menu.created_at,authority_menu.updated_at,authority_menu.deleted_at,authority_menu.menu_level,authority_menu.parent_id,authority_menu.path,authority_menu.`name`,authority_menu.hidden,authority_menu.component,authority_menu.title,authority_menu.icon,authority_menu.sort,authority_menu.menu_id,authority_menu.authority_id FROM sys_menus authority_menu WHERE authority_menu.authority_id = ?" + //sql := "SELECT authority_menu.created_at,authority_menu.updated_at,authority_menu.deleted_at,authority_menu.menu_level,authority_menu.parent_id,authority_menu.path,authority_menu.`name`,authority_menu.hidden,authority_menu.component,authority_menu.title,authority_menu.icon,authority_menu.sort,authority_menu.menu_id,authority_menu.authority_id FROM sys_menus authority_menu WHERE authority_menu.authority_id = ?" + sql := "SELECT authority_menu.created_at,authority_menu.updated_at,authority_menu.deleted_at,authority_menu.menu_level,authority_menu.parent_id,authority_menu.path,authority_menu.`name`,authority_menu.hidden,authority_menu.component,authority_menu.title,authority_menu.icon,authority_menu.sort,authority_menu.id menu_id,am.sys_authority_authority_id authority_id FROM sys_base_menus authority_menu left join sys_authority_menus am on authority_menu.id = am.sys_base_menu_id WHERE am.sys_authority_authority_id = ? " err = global.GVA_DB.Raw(sql, authorityId).Scan(&menus).Error return err, menus }