init
This commit is contained in:
commit
37f3ae7a26
|
@ -0,0 +1,13 @@
|
|||
*.iml
|
||||
.idea/
|
||||
output/
|
||||
dockerfiles/
|
||||
log
|
||||
.DS_Store
|
||||
web/node_modules
|
||||
doc
|
||||
cmd/test
|
||||
go.sum
|
||||
pkg
|
||||
test.go
|
||||
enterprise
|
|
@ -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"]
|
|
@ -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)
|
||||
}
|
||||
}
|
|
@ -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))
|
||||
}
|
|
@ -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
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
package global
|
||||
|
||||
func InitGlobal() {
|
||||
if err := initDB(); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
if err := initLog(); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
|
@ -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
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
package model
|
|
@ -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=""
|
|
@ -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
|
||||
)
|
|
@ -0,0 +1,6 @@
|
|||
package server
|
||||
|
||||
func Start() error {
|
||||
select {}
|
||||
return nil
|
||||
}
|
|
@ -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
|
||||
|
||||
|
|
@ -0,0 +1 @@
|
|||
package worker
|
|
@ -0,0 +1,5 @@
|
|||
package worker
|
||||
|
||||
func Init() error {
|
||||
return nil
|
||||
}
|
Loading…
Reference in New Issue