From 37f3ae7a26add7e8be6830e8f0bf55d749e68dbe Mon Sep 17 00:00:00 2001 From: jiangyong27 Date: Fri, 4 Aug 2023 11:13:41 +0800 Subject: [PATCH] init --- .gitignore | 13 ++++++ Dockerfile | 21 ++++++++++ cmd/enterprise.go | 20 ++++++++++ common/config/config.go | 88 +++++++++++++++++++++++++++++++++++++++++ common/global/db.go | 83 ++++++++++++++++++++++++++++++++++++++ common/global/global.go | 11 ++++++ common/global/log.go | 43 ++++++++++++++++++++ common/model/model.go | 1 + conf/server.conf.dev | 0 conf/server.conf.prod | 16 ++++++++ go.mod | 49 +++++++++++++++++++++++ server/server.go | 6 +++ start.sh | 16 ++++++++ worker/checkin.go | 1 + worker/worker.go | 5 +++ 15 files changed, 373 insertions(+) create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 cmd/enterprise.go create mode 100644 common/config/config.go create mode 100644 common/global/db.go create mode 100644 common/global/global.go create mode 100644 common/global/log.go create mode 100644 common/model/model.go create mode 100644 conf/server.conf.dev create mode 100644 conf/server.conf.prod create mode 100644 go.mod create mode 100644 server/server.go create mode 100644 start.sh create mode 100644 worker/checkin.go create mode 100644 worker/worker.go diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..05a3c9b --- /dev/null +++ b/.gitignore @@ -0,0 +1,13 @@ +*.iml +.idea/ +output/ +dockerfiles/ +log +.DS_Store +web/node_modules +doc +cmd/test +go.sum +pkg +test.go +enterprise diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..43451aa --- /dev/null +++ b/Dockerfile @@ -0,0 +1,21 @@ +FROM registry.cn-shanghai.aliyuncs.com/devcon/godev:v1.0.14 +ADD . /app/src +WORKDIR /app/src + +RUN mkdir -p /app/bin /app/log + +RUN export GOROOT=/usr/local/go1.18.2 && \ + export GOPROXY=https://goproxy.cn && \ + export PATH=$PATH:$GOROOT/bin && \ + go mod tidy && \ + go build cmd/enterprise.go && \ + mv enterprise /app/bin && \ + mv doc /app && \ + cp -r conf /app && \ + cp start.sh /app && \ + chmod +x /app/start.sh + +WORKDIR /app +EXPOSE 9281 + +CMD ["/app/start.sh"] diff --git a/cmd/enterprise.go b/cmd/enterprise.go new file mode 100644 index 0000000..b5619b9 --- /dev/null +++ b/cmd/enterprise.go @@ -0,0 +1,20 @@ +package main + +import ( + "enterprise/common/config" + "enterprise/common/global" + "enterprise/server" + "enterprise/worker" +) + +func main() { + config.LoadServerConfig() + global.InitGlobal() + + if err := worker.Init(); err != nil { + panic(err) + } + if err := server.Start(); err != nil { + panic(err) + } +} diff --git a/common/config/config.go b/common/config/config.go new file mode 100644 index 0000000..d5097d9 --- /dev/null +++ b/common/config/config.go @@ -0,0 +1,88 @@ +package config + +import ( + "github.com/mitchellh/mapstructure" + log "github.com/sirupsen/logrus" + "github.com/smbrave/goutil" + "github.com/spf13/viper" + "os" + "strings" +) + +var ( + config *Config + configEnv string + BuildTime string + CommitId string +) + +type Mysql struct { + Host string `toml:"host"` + Port int `toml:"port"` + User string `toml:"user"` + Pass string `toml:"pass"` + Db string `toml:"db"` +} + +type Server struct { + Address string `toml:"address"` + LogLevel int `toml:"log_level"` +} + +type Redis struct { + Addr string `toml:"addr"` + Db int `toml:"db"` + Password string `toml:"password"` +} + +type Config struct { + Server *Server `toml:"server"` + Mysql *Mysql `toml:"mysql"` + Redis *Redis `toml:"redis"` +} + +func GetEnv() string { + return configEnv +} + +func IsProdEnv() bool { + return configEnv == "prod" +} + +func IsDevEnv() bool { + return configEnv == "dev" +} + +func IsTestEnv() bool { + return configEnv == "test" +} + +func GetConfig() *Config { + return config +} + +func LoadServerConfig() { + configEnv = os.Getenv("CONFIG_ENV") + if configEnv == "" { + configEnv = "prod" + } + + var envConfig Config + + viper.SetConfigFile("conf/server.conf." + configEnv) + viper.SetConfigType("toml") + viper.AutomaticEnv() + viper.SetEnvKeyReplacer(strings.NewReplacer(".", "_")) + viper.SetEnvPrefix("conf") + if err := viper.ReadInConfig(); err != nil { + panic(err) + } + if err := viper.Unmarshal(&envConfig, func(decoderConfig *mapstructure.DecoderConfig) { + decoderConfig.TagName = "toml" + }); err != nil { + panic(err) + } + + config = &envConfig + log.Infof("load real config[%s] ", goutil.EncodeJSONIndent(config)) +} diff --git a/common/global/db.go b/common/global/db.go new file mode 100644 index 0000000..e96322f --- /dev/null +++ b/common/global/db.go @@ -0,0 +1,83 @@ +package global + +import ( + "context" + "enterprise/common/config" + "fmt" + log "github.com/sirupsen/logrus" + "gorm.io/driver/mysql" + "gorm.io/gorm" + "gorm.io/gorm/logger" + "time" +) + +var ( + db *gorm.DB = nil +) + +func GetDB() *gorm.DB { + return db +} + +type DBLogger struct { + level logger.LogLevel + threshold int64 +} + +func (d *DBLogger) LogMode(level logger.LogLevel) logger.Interface { + d.level = level + return d +} + +func (d *DBLogger) Info(context.Context, string, ...interface{}) { + +} + +func (d *DBLogger) Warn(context.Context, string, ...interface{}) { + +} + +func (d *DBLogger) Error(context.Context, string, ...interface{}) { + +} + +func (d *DBLogger) Trace(ctx context.Context, begin time.Time, fc func() (sql string, rowsAffected int64), err error) { + sql, affects := fc() + + if err != nil && err != gorm.ErrRecordNotFound { + log.Errorf("[SQL]sql=%s affect=%d cost=%dms error=%v", sql, affects, time.Since(begin).Milliseconds(), err) + } else { + if time.Since(begin).Milliseconds() > d.threshold { + log.Errorf("[SQL]sql=%s affect=%d cost=%dms", sql, affects, time.Since(begin).Milliseconds()) + } else { + log.Debugf("[SQL]sql=%s affect=%d cost=%dms", sql, affects, time.Since(begin).Milliseconds()) + } + } +} + +func initDB() error { + cfg := config.GetConfig() + dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s", cfg.Mysql.User, + cfg.Mysql.Pass, cfg.Mysql.Host, cfg.Mysql.Port, cfg.Mysql.Db) + + var err error + db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{}) + if err != nil { + log.Errorf("open dsn[%s] error[%s]", dsn, err) + return err + } + db.Logger = &DBLogger{threshold: int64(2000)} + return nil +} + +func DBPing() error { + d, err := db.DB() + if err != nil { + return err + } + + if err := d.Ping(); err != nil { + return err + } + return nil +} diff --git a/common/global/global.go b/common/global/global.go new file mode 100644 index 0000000..11e9b52 --- /dev/null +++ b/common/global/global.go @@ -0,0 +1,11 @@ +package global + +func InitGlobal() { + if err := initDB(); err != nil { + panic(err) + } + + if err := initLog(); err != nil { + panic(err) + } +} diff --git a/common/global/log.go b/common/global/log.go new file mode 100644 index 0000000..e62d577 --- /dev/null +++ b/common/global/log.go @@ -0,0 +1,43 @@ +package global + +import ( + "enterprise/common/config" + rotatelogs "github.com/lestrrat-go/file-rotatelogs" + "github.com/rifflock/lfshook" + log "github.com/sirupsen/logrus" + "github.com/smbrave/goutil" + "os" + "time" +) + +func initLog() error { + cfg := config.GetConfig() + logfile := "log/server.log" + writer, err := rotatelogs.New( + logfile+".%Y%m%d", + rotatelogs.WithLinkName(logfile), + rotatelogs.WithMaxAge(time.Duration(86400*7)*time.Second), + rotatelogs.WithRotationTime(time.Duration(86400)*time.Second), + ) + if err != nil { + return err + } + + pathMap := lfshook.WriterMap{ + log.TraceLevel: writer, + log.DebugLevel: writer, + log.InfoLevel: writer, + log.WarnLevel: writer, + log.ErrorLevel: writer, + log.FatalLevel: writer, + log.PanicLevel: writer, + } + + log.AddHook(lfshook.NewHook(pathMap, new(goutil.LogFile))) + + log.SetOutput(os.Stdout) + log.SetReportCaller(true) + log.SetFormatter(new(goutil.LogFile)) + log.SetLevel(log.Level(cfg.Server.LogLevel)) + return nil +} diff --git a/common/model/model.go b/common/model/model.go new file mode 100644 index 0000000..8b53790 --- /dev/null +++ b/common/model/model.go @@ -0,0 +1 @@ +package model diff --git a/conf/server.conf.dev b/conf/server.conf.dev new file mode 100644 index 0000000..e69de29 diff --git a/conf/server.conf.prod b/conf/server.conf.prod new file mode 100644 index 0000000..d0e5624 --- /dev/null +++ b/conf/server.conf.prod @@ -0,0 +1,16 @@ +[server] +address = "0.0.0.0:9283" +#0:PAINC 1:FATAL 2:ERROR 3:WARNING 4:INFO 5:DEBUG 6:TRACE +log_level = 6 + +[mysql] +host = "127.0.0.1" +port = 3306 +user = "unify2" +pass = "MDE2LCJIYXNoSWQiOjY" +db = "unify2" + +[redis] +addr="127.0.0.1:6379" +db=0 +password="" diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..5f56f53 --- /dev/null +++ b/go.mod @@ -0,0 +1,49 @@ +module enterprise + +go 1.18 + +require ( + github.com/ArtisanCloud/PowerWeChat/v3 v3.0.55 + github.com/gogap/errors v0.0.0-20210818113853-edfbba0ddea9 + github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible + github.com/mitchellh/mapstructure v1.5.0 + github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5 + github.com/sirupsen/logrus v1.9.3 + github.com/smbrave/goutil v0.0.0-20230602040814-2643c72c2849 + github.com/spf13/cast v1.5.1 + github.com/spf13/viper v1.16.0 + gorm.io/driver/mysql v1.5.1 + gorm.io/gorm v1.25.2 +) + +require ( + github.com/ArtisanCloud/PowerLibs/v3 v3.0.12 // indirect + github.com/ArtisanCloud/PowerSocialite/v3 v3.0.6 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect + github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 // indirect + github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/go-sql-driver/mysql v1.7.0 // indirect + github.com/gogap/stack v0.0.0-20150131034635-fef68dddd4f8 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.5 // indirect + github.com/jonboulle/clockwork v0.4.0 // indirect + github.com/lestrrat-go/strftime v1.0.6 // indirect + github.com/magiconair/properties v1.8.7 // indirect + github.com/patrickmn/go-cache v2.1.0+incompatible // indirect + github.com/pelletier/go-toml/v2 v2.0.8 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/redis/go-redis/v9 v9.0.3 // indirect + github.com/spf13/afero v1.9.5 // indirect + github.com/spf13/jwalterweatherman v1.1.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/subosito/gotenv v1.4.2 // indirect + go.uber.org/atomic v1.9.0 // indirect + go.uber.org/multierr v1.8.0 // indirect + go.uber.org/zap v1.21.0 // indirect + golang.org/x/sys v0.8.0 // indirect + golang.org/x/text v0.9.0 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/server/server.go b/server/server.go new file mode 100644 index 0000000..e2beb28 --- /dev/null +++ b/server/server.go @@ -0,0 +1,6 @@ +package server + +func Start() error { + select {} + return nil +} diff --git a/start.sh b/start.sh new file mode 100644 index 0000000..f02e71f --- /dev/null +++ b/start.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -x +ROOT=$(cd `dirname $0`; pwd) +cd $ROOT + +if [ "$BINARY" = "" ];then + BINARY="enterprise" +fi + +while [ true ];do + $ROOT/bin/$BINARY $@ >> log/run.log 2>&1 + /usr/local/bin/sendproxy weixin jiangyong "$CONFIG_ENV $BINARY 服务崩溃[`date +"%Y-%m-%d %H:%M:%S"`]" + sleep 60 +done + + diff --git a/worker/checkin.go b/worker/checkin.go new file mode 100644 index 0000000..4df0094 --- /dev/null +++ b/worker/checkin.go @@ -0,0 +1 @@ +package worker diff --git a/worker/worker.go b/worker/worker.go new file mode 100644 index 0000000..13bfdbc --- /dev/null +++ b/worker/worker.go @@ -0,0 +1,5 @@ +package worker + +func Init() error { + return nil +}