diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..b294edf --- /dev/null +++ b/Dockerfile @@ -0,0 +1,40 @@ +# stage for development, which contains tools for code generation and debugging. +FROM golang:1.22.2-bullseye as builder + +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + wget \ + make \ + unzip \ + git \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +# install protoc +RUN wget https://github.com/protocolbuffers/protobuf/releases/download/v3.20.1/protoc-3.20.1-linux-x86_64.zip \ + && unzip -d /usr/local protoc-3.20.1-linux-x86_64.zip \ + && rm protoc-3.20.1-linux-x86_64.zip + +# install protoc plugins +RUN go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.28 +RUN go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.2 +RUN go install github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-grpc-gateway@v2.10.3 +RUN go install github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2@v2.10.3 + +WORKDIR /work + +COPY go.mod go.sum ./ +RUN go mod download && go mod verify + +COPY . ./ + +RUN go build -o /openve ./go/cmd + + + +# runner stage for server +FROM debian:bullseye-slim as runner + +COPY --from=builder /openve /openve + +CMD ["/openve"] diff --git a/README.md b/README.md index 37a5ff3..f974530 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ Centralized and Consistent Data Validation Engine This project is still under development and not ready for production use. -We only support limited CEL expression and gRPC API. +We only support limited CEL expression. ## Setup @@ -16,11 +16,6 @@ If you want to specify the configuration below, you can create a `config.yaml` f If you don't specify the configuration, the default values will be used. ```yaml -server: - grpc: - port: 9000 - rest: - port: 8080 redis: addr: "localhost:6379" password: "" @@ -28,18 +23,12 @@ redis: poolSize: 10 ``` -### Redis +### Run ```bash docker compose up -d ``` -### Server - -```bash -go run cmd/main.go -``` - ## Example ### Register Validation Rules diff --git a/docker-compose.yml b/docker-compose.yml index 67b3939..fc66dc2 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -7,8 +7,19 @@ services: volumes: - redis-data:/data networks: - - redis-net + - default restart: unless-stopped + server: + build: + context: . + container_name: server + ports: + - "8080:8080" + - "8081:8081" + networks: + - default + depends_on: + - redis apidocs: image: swaggerapi/swagger-ui container_name: apidocs @@ -19,11 +30,11 @@ services: - ./openapi:/openapi restart: unless-stopped ports: - - "8081:8080" + - "9000:8080" volumes: redis-data: networks: - redis-net: + default: driver: bridge diff --git a/go/cmd/gateway/main.go b/go/cmd/gateway/main.go deleted file mode 100644 index 0eb4f65..0000000 --- a/go/cmd/gateway/main.go +++ /dev/null @@ -1,17 +0,0 @@ -package main - -import ( - "context" - - "github.com/shibukazu/open-ve/go/pkg/config" - "github.com/shibukazu/open-ve/go/pkg/server" -) - -func main() { - var ctx = context.Background() - - cfg := config.NewConfig() - - srv := server.NewGateway(&cfg.Server) - srv.Run(ctx) -} diff --git a/go/cmd/grpc/main.go b/go/cmd/main.go similarity index 63% rename from go/cmd/grpc/main.go rename to go/cmd/main.go index 0f75ece..0479874 100644 --- a/go/cmd/grpc/main.go +++ b/go/cmd/main.go @@ -2,6 +2,7 @@ package main import ( "context" + "log/slog" "github.com/go-redis/redis" "github.com/shibukazu/open-ve/go/pkg/config" @@ -11,7 +12,8 @@ import ( ) func main() { - var ctx = context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() cfg := config.NewConfig() @@ -21,10 +23,19 @@ func main() { DB: cfg.Redis.DB, PoolSize: cfg.Redis.PoolSize, }) - dslReader := dsl.NewDSLReader(redis) validator := validator.NewValidator(redis) + gw := server.NewGateway() + go func () { + slog.Info("🚀gateway is running") + gw.Run(ctx) + }() + + grpc := server.NewGrpc(validator, dslReader) + go func () { + slog.Info("🚀grpc is running") + grpc.Run(ctx) + }() - srv := server.NewGrpc(validator, dslReader, &cfg.Server) - srv.Run(ctx) -} + <-ctx.Done() +} \ No newline at end of file diff --git a/go/pkg/config/config.go b/go/pkg/config/config.go index c5924ef..7c46d0e 100644 --- a/go/pkg/config/config.go +++ b/go/pkg/config/config.go @@ -9,20 +9,9 @@ import ( ) type Config struct { - Server ServerConfig `yaml:"server"` Redis RedisConfig `yaml:"redis"` } -type ServerConfig struct { - Grpc GrpcConfig `yaml:"grpc"` - Http HttpConfig `yaml:"http"` -} - -type GrpcConfig struct { - Host string `yaml:"host"` - Port string `yaml:"port"` -} - type HttpConfig struct { Host string `yaml:"host"` Port string `yaml:"port"` @@ -59,18 +48,8 @@ func NewConfig() *Config { func defaultConfig () *Config { return &Config{ - Server: ServerConfig{ - Grpc: GrpcConfig{ - Host: "localhost", - Port: "9000", - }, - Http: HttpConfig{ - Host: "localhost", - Port: "8080", - }, - }, Redis: RedisConfig{ - Addr: "localhost:6379", + Addr: "redis:6379", Password: "", DB: 0, PoolSize: 1000, diff --git a/go/pkg/server/const.go b/go/pkg/server/const.go new file mode 100644 index 0000000..f79eebb --- /dev/null +++ b/go/pkg/server/const.go @@ -0,0 +1,6 @@ +package server + +const ( + grpcEndpoint = "0.0.0.0:8081" + httpEndpoint = "0.0.0.0:8080" +) \ No newline at end of file diff --git a/go/pkg/server/gateway.go b/go/pkg/server/gateway.go index 58d47ec..4ce7613 100644 --- a/go/pkg/server/gateway.go +++ b/go/pkg/server/gateway.go @@ -5,25 +5,19 @@ import ( "net/http" "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" - "github.com/shibukazu/open-ve/go/pkg/config" pbDSL "github.com/shibukazu/open-ve/go/proto/dsl/v1" pbValidate "github.com/shibukazu/open-ve/go/proto/validate/v1" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" ) -type Gateway struct { - serverConfig *config.ServerConfig -} +type Gateway struct {} -func NewGateway(serverConfig *config.ServerConfig) *Gateway { - return &Gateway{ - serverConfig: serverConfig, - } +func NewGateway() *Gateway { + return &Gateway{} } func (g *Gateway) Run(ctx context.Context) { - grpcEndpoint := g.serverConfig.Grpc.Host + ":" + g.serverConfig.Grpc.Port grpcGateway := runtime.NewServeMux() opts := []grpc.DialOption{ grpc.WithTransportCredentials(insecure.NewCredentials()), @@ -36,7 +30,7 @@ func (g *Gateway) Run(ctx context.Context) { panic(err) } - if err := http.ListenAndServe(":"+g.serverConfig.Http.Port, grpcGateway); err != nil { + if err := http.ListenAndServe(httpEndpoint, grpcGateway); err != nil { panic(err) } } \ No newline at end of file diff --git a/go/pkg/server/grpc.go b/go/pkg/server/grpc.go index 1a3457d..1cf8fb2 100644 --- a/go/pkg/server/grpc.go +++ b/go/pkg/server/grpc.go @@ -6,7 +6,6 @@ import ( "github.com/morikuni/failure/v2" "github.com/shibukazu/open-ve/go/pkg/appError" - "github.com/shibukazu/open-ve/go/pkg/config" "github.com/shibukazu/open-ve/go/pkg/dsl" svcDSL "github.com/shibukazu/open-ve/go/pkg/services/dsl/v1" svcValidate "github.com/shibukazu/open-ve/go/pkg/services/validate/v1" @@ -19,22 +18,20 @@ import ( ) type Grpc struct { - serverConfig *config.ServerConfig dslReader *dsl.DSLReader validator *validator.Validator } -func NewGrpc(validator *validator.Validator, dslReader *dsl.DSLReader, serverConfig *config.ServerConfig) *Grpc { +func NewGrpc(validator *validator.Validator, dslReader *dsl.DSLReader) *Grpc { return &Grpc{ validator: validator, dslReader: dslReader, - serverConfig: serverConfig, } } func (g *Grpc) Run(ctx context.Context) { - listen, err := net.Listen("tcp", ":" + g.serverConfig.Grpc.Port) + listen, err := net.Listen("tcp", grpcEndpoint) if err != nil { panic(failure.Translate(err, appError.ErrServerStartFailed)) } @@ -49,7 +46,6 @@ func (g *Grpc) Run(ctx context.Context) { reflection.Register(grpcServer) - // 以下でリッスンし続ける if err := grpcServer.Serve(listen); err != nil { panic(failure.Translate(err, appError.ErrServerStartFailed)) }