mirror of
https://github.com/mentos1386/zdravko.git
synced 2024-11-25 08:58:50 +00:00
feat(temporal): add temporal server
This commit is contained in:
parent
18d6c563a5
commit
e74322f296
7 changed files with 717 additions and 1579 deletions
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -2,6 +2,8 @@ dist/
|
|||
|
||||
# Database
|
||||
zdravko.db
|
||||
temporal.db
|
||||
temporal.db-journal
|
||||
|
||||
# Config
|
||||
.env
|
||||
|
|
131
cmd/temporal/main.go
Normal file
131
cmd/temporal/main.go
Normal file
|
@ -0,0 +1,131 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"log"
|
||||
"os"
|
||||
"path/filepath"
|
||||
|
||||
"go.temporal.io/server/common/config"
|
||||
"go.temporal.io/server/schema/sqlite"
|
||||
"go.temporal.io/server/temporal"
|
||||
|
||||
t "code.tjo.space/mentos1386/zdravko/pkg/temporal"
|
||||
|
||||
"go.temporal.io/server/common/authorization"
|
||||
tlog "go.temporal.io/server/common/log"
|
||||
|
||||
uiserver "github.com/temporalio/ui-server/v2/server"
|
||||
uiconfig "github.com/temporalio/ui-server/v2/server/config"
|
||||
uiserveroptions "github.com/temporalio/ui-server/v2/server/server_options"
|
||||
)
|
||||
|
||||
func backendServer() {
|
||||
cfg := t.NewConfig()
|
||||
|
||||
logger := tlog.NewZapLogger(tlog.BuildZapLogger(tlog.Config{
|
||||
Stdout: true,
|
||||
Level: "info",
|
||||
OutputFile: "",
|
||||
}))
|
||||
|
||||
sqlConfig := cfg.Persistence.DataStores[t.PersistenceStoreName].SQL
|
||||
|
||||
// Apply migrations if file does not already exist
|
||||
if _, err := os.Stat(sqlConfig.DatabaseName); os.IsNotExist(err) {
|
||||
// Check if any of the parent dirs are missing
|
||||
dir := filepath.Dir(sqlConfig.DatabaseName)
|
||||
if _, err := os.Stat(dir); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
if err := sqlite.SetupSchema(sqlConfig); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
// Pre-create namespaces
|
||||
var namespaces []*sqlite.NamespaceConfig
|
||||
for _, ns := range []string{"default"} {
|
||||
namespaces = append(namespaces, sqlite.NewNamespaceConfig(cfg.ClusterMetadata.CurrentClusterName, ns, false))
|
||||
}
|
||||
if err := sqlite.CreateNamespaces(sqlConfig, namespaces...); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
authorizer, err := authorization.GetAuthorizerFromConfig(&cfg.Global.Authorization)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
claimMapper, err := authorization.GetClaimMapperFromConfig(&cfg.Global.Authorization, logger)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
ctx := context.Background()
|
||||
interruptChan := make(chan interface{}, 1)
|
||||
go func() {
|
||||
if doneChan := ctx.Done(); doneChan != nil {
|
||||
s := <-doneChan
|
||||
interruptChan <- s
|
||||
} else {
|
||||
s := <-temporal.InterruptCh()
|
||||
interruptChan <- s
|
||||
}
|
||||
}()
|
||||
|
||||
temporal, err := temporal.NewServer(
|
||||
temporal.WithConfig(cfg),
|
||||
temporal.ForServices(temporal.DefaultServices),
|
||||
temporal.WithLogger(logger),
|
||||
temporal.WithAuthorizer(authorizer),
|
||||
temporal.WithClaimMapper(func(cfg *config.Config) authorization.ClaimMapper {
|
||||
return claimMapper
|
||||
}),
|
||||
temporal.InterruptOn(interruptChan),
|
||||
)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
log.Println("Starting temporal server")
|
||||
if err := temporal.Start(); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
err = temporal.Stop()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func frontendServer() {
|
||||
cfg := &uiconfig.Config{
|
||||
Host: "0.0.0.0",
|
||||
Port: 8223,
|
||||
TemporalGRPCAddress: "localhost:7233",
|
||||
EnableUI: true,
|
||||
UIAssetPath: "",
|
||||
Codec: uiconfig.Codec{
|
||||
Endpoint: "",
|
||||
},
|
||||
CORS: uiconfig.CORS{
|
||||
CookieInsecure: true,
|
||||
},
|
||||
}
|
||||
|
||||
server := uiserver.NewServer(uiserveroptions.WithConfigProvider(cfg))
|
||||
|
||||
log.Println("Starting temporal ui server")
|
||||
if err := server.Start(); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
go func() {
|
||||
frontendServer()
|
||||
}()
|
||||
backendServer()
|
||||
}
|
125
go.mod
125
go.mod
|
@ -6,58 +6,153 @@ require (
|
|||
github.com/glebarez/sqlite v1.10.0
|
||||
github.com/gorilla/mux v1.8.1
|
||||
github.com/gorilla/sessions v1.2.2
|
||||
go.temporal.io/sdk v1.25.1
|
||||
github.com/temporalio/ui-server/v2 v2.23.0
|
||||
go.temporal.io/sdk v1.26.0-rc.2
|
||||
go.temporal.io/server v1.22.4
|
||||
golang.org/x/oauth2 v0.17.0
|
||||
gorm.io/gen v0.3.25
|
||||
gorm.io/gorm v1.25.7
|
||||
gorm.io/plugin/dbresolver v1.5.0
|
||||
)
|
||||
|
||||
replace go.temporal.io/server => github.com/temporalio/temporal v1.23.0-rc2.0.20240207154935-68882596be5d
|
||||
|
||||
require (
|
||||
cloud.google.com/go v0.112.0 // indirect
|
||||
cloud.google.com/go/compute v1.23.3 // indirect
|
||||
cloud.google.com/go/compute/metadata v0.2.3 // indirect
|
||||
cloud.google.com/go/iam v1.1.5 // indirect
|
||||
cloud.google.com/go/storage v1.36.0 // indirect
|
||||
github.com/apache/thrift v0.18.1 // indirect
|
||||
github.com/aws/aws-sdk-go v1.44.289 // indirect
|
||||
github.com/benbjohnson/clock v1.3.5 // indirect
|
||||
github.com/beorn7/perks v1.0.1 // indirect
|
||||
github.com/blang/semver/v4 v4.0.0 // indirect
|
||||
github.com/cactus/go-statsd-client/statsd v0.0.0-20200423205355-cb0885a1018c // indirect
|
||||
github.com/cactus/go-statsd-client/v5 v5.0.0 // indirect
|
||||
github.com/cenkalti/backoff/v4 v4.2.1 // indirect
|
||||
github.com/cespare/xxhash/v2 v2.2.0 // indirect
|
||||
github.com/coreos/go-oidc/v3 v3.1.0 // indirect
|
||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||
github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect
|
||||
github.com/dustin/go-humanize v1.0.1 // indirect
|
||||
github.com/emirpasic/gods v1.18.1 // indirect
|
||||
github.com/facebookgo/clock v0.0.0-20150410010913-600d898af40a // indirect
|
||||
github.com/felixge/httpsnoop v1.0.4 // indirect
|
||||
github.com/glebarez/go-sqlite v1.22.0 // indirect
|
||||
github.com/go-logr/logr v1.3.0 // indirect
|
||||
github.com/go-logr/stdr v1.2.2 // indirect
|
||||
github.com/go-sql-driver/mysql v1.7.1 // indirect
|
||||
github.com/gogo/googleapis v1.4.1 // indirect
|
||||
github.com/gocql/gocql v1.5.2 // indirect
|
||||
github.com/gogo/protobuf v1.3.2 // indirect
|
||||
github.com/gogo/status v1.1.1 // indirect
|
||||
github.com/golang/mock v1.6.0 // indirect
|
||||
github.com/golang-jwt/jwt v3.2.2+incompatible // indirect
|
||||
github.com/golang-jwt/jwt/v4 v4.5.0 // indirect
|
||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
|
||||
github.com/golang/mock v1.7.0-rc.1 // indirect
|
||||
github.com/golang/protobuf v1.5.3 // indirect
|
||||
github.com/golang/snappy v0.0.4 // indirect
|
||||
github.com/google/s2a-go v0.1.7 // indirect
|
||||
github.com/google/uuid v1.6.0 // indirect
|
||||
github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect
|
||||
github.com/googleapis/gax-go/v2 v2.12.0 // indirect
|
||||
github.com/gorilla/securecookie v1.1.2 // indirect
|
||||
github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect
|
||||
github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect
|
||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 // indirect
|
||||
github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed // indirect
|
||||
github.com/iancoleman/strcase v0.3.0 // indirect
|
||||
github.com/jackc/pgpassfile v1.0.0 // indirect
|
||||
github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect
|
||||
github.com/jackc/pgx/v5 v5.4.3 // indirect
|
||||
github.com/jinzhu/inflection v1.0.0 // indirect
|
||||
github.com/jinzhu/now v1.1.5 // indirect
|
||||
github.com/jmespath/go-jmespath v0.4.0 // indirect
|
||||
github.com/jmoiron/sqlx v1.3.4 // indirect
|
||||
github.com/josharian/intern v1.0.0 // indirect
|
||||
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect
|
||||
github.com/labstack/echo/v4 v4.9.1 // indirect
|
||||
github.com/labstack/gommon v0.4.0 // indirect
|
||||
github.com/lib/pq v1.10.9 // indirect
|
||||
github.com/mailru/easyjson v0.7.7 // indirect
|
||||
github.com/mattn/go-colorable v0.1.13 // indirect
|
||||
github.com/mattn/go-isatty v0.0.20 // indirect
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
|
||||
github.com/ncruces/go-strftime v0.1.9 // indirect
|
||||
github.com/olivere/elastic/v7 v7.0.32 // indirect
|
||||
github.com/opentracing/opentracing-go v1.2.0 // indirect
|
||||
github.com/pborman/uuid v1.2.1 // indirect
|
||||
github.com/pkg/errors v0.9.1 // indirect
|
||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||
github.com/prometheus/client_golang v1.16.0 // indirect
|
||||
github.com/prometheus/client_model v0.4.0 // indirect
|
||||
github.com/prometheus/common v0.44.0 // indirect
|
||||
github.com/prometheus/procfs v0.11.0 // indirect
|
||||
github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect
|
||||
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
|
||||
github.com/robfig/cron v1.2.0 // indirect
|
||||
github.com/robfig/cron/v3 v3.0.1 // indirect
|
||||
github.com/sirupsen/logrus v1.9.3 // indirect
|
||||
github.com/stretchr/objx v0.5.0 // indirect
|
||||
github.com/stretchr/testify v1.8.4 // indirect
|
||||
go.temporal.io/api v1.24.0 // indirect
|
||||
go.uber.org/atomic v1.9.0 // indirect
|
||||
github.com/temporalio/ringpop-go v0.0.0-20230606200434-b5c079f412d3 // indirect
|
||||
github.com/temporalio/sqlparser v0.0.0-20231115171017-f4060bcfa6cb // indirect
|
||||
github.com/temporalio/tchannel-go v1.22.1-0.20231116015023-bd4fb7678499 // indirect
|
||||
github.com/twmb/murmur3 v1.1.8 // indirect
|
||||
github.com/uber-common/bark v1.3.0 // indirect
|
||||
github.com/uber-go/tally/v4 v4.1.7 // indirect
|
||||
github.com/valyala/bytebufferpool v1.0.0 // indirect
|
||||
github.com/valyala/fasttemplate v1.2.1 // indirect
|
||||
go.opencensus.io v0.24.0 // indirect
|
||||
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 // indirect
|
||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 // indirect
|
||||
go.opentelemetry.io/otel v1.21.0 // indirect
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 // indirect
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 // indirect
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 // indirect
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0 // indirect
|
||||
go.opentelemetry.io/otel/exporters/prometheus v0.42.0 // indirect
|
||||
go.opentelemetry.io/otel/metric v1.21.0 // indirect
|
||||
go.opentelemetry.io/otel/sdk v1.21.0 // indirect
|
||||
go.opentelemetry.io/otel/sdk/metric v1.19.0 // indirect
|
||||
go.opentelemetry.io/otel/trace v1.21.0 // indirect
|
||||
go.opentelemetry.io/proto/otlp v1.0.0 // indirect
|
||||
go.temporal.io/api v1.27.0 // indirect
|
||||
go.temporal.io/version v0.3.0 // indirect
|
||||
go.uber.org/atomic v1.11.0 // indirect
|
||||
go.uber.org/dig v1.17.0 // indirect
|
||||
go.uber.org/fx v1.20.0 // indirect
|
||||
go.uber.org/multierr v1.11.0 // indirect
|
||||
go.uber.org/zap v1.26.0 // indirect
|
||||
golang.org/x/crypto v0.19.0 // indirect
|
||||
golang.org/x/exp v0.0.0-20231127185646-65229373498e // indirect
|
||||
golang.org/x/mod v0.15.0 // indirect
|
||||
golang.org/x/net v0.21.0 // indirect
|
||||
golang.org/x/sync v0.6.0 // indirect
|
||||
golang.org/x/sys v0.17.0 // indirect
|
||||
golang.org/x/text v0.14.0 // indirect
|
||||
golang.org/x/time v0.3.0 // indirect
|
||||
golang.org/x/time v0.5.0 // indirect
|
||||
golang.org/x/tools v0.17.0 // indirect
|
||||
google.golang.org/appengine v1.6.7 // indirect
|
||||
google.golang.org/genproto v0.0.0-20230815205213-6bfd019c3878 // indirect
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20230815205213-6bfd019c3878 // indirect
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20230815205213-6bfd019c3878 // indirect
|
||||
google.golang.org/grpc v1.57.0 // indirect
|
||||
google.golang.org/protobuf v1.31.0 // indirect
|
||||
google.golang.org/api v0.155.0 // indirect
|
||||
google.golang.org/appengine v1.6.8 // indirect
|
||||
google.golang.org/genproto v0.0.0-20240125205218-1f4bbc51befe // indirect
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20240125205218-1f4bbc51befe // indirect
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20240125205218-1f4bbc51befe // indirect
|
||||
google.golang.org/grpc v1.61.0 // indirect
|
||||
google.golang.org/protobuf v1.32.0 // indirect
|
||||
gopkg.in/inf.v0 v0.9.1 // indirect
|
||||
gopkg.in/square/go-jose.v2 v2.6.0 // indirect
|
||||
gopkg.in/validator.v2 v2.0.1 // indirect
|
||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||
gorm.io/datatypes v1.2.0 // indirect
|
||||
gorm.io/driver/mysql v1.5.4 // indirect
|
||||
gorm.io/hints v1.1.2 // indirect
|
||||
lukechampine.com/uint128 v1.3.0 // indirect
|
||||
modernc.org/cc/v3 v3.41.0 // indirect
|
||||
modernc.org/ccgo/v3 v3.16.15 // indirect
|
||||
modernc.org/libc v1.41.0 // indirect
|
||||
modernc.org/mathutil v1.6.0 // indirect
|
||||
modernc.org/memory v1.7.2 // indirect
|
||||
modernc.org/opt v0.1.3 // indirect
|
||||
modernc.org/sqlite v1.28.0 // indirect
|
||||
modernc.org/strutil v1.2.0 // indirect
|
||||
modernc.org/token v1.1.0 // indirect
|
||||
)
|
||||
|
|
3
justfile
3
justfile
|
@ -11,7 +11,8 @@ run:
|
|||
|
||||
# Start temporal which is accassible at http://localhost:8233/
|
||||
run-temporal:
|
||||
temporal server start-dev
|
||||
go build -o dist/temporal cmd/temporal/main.go
|
||||
./dist/temporal
|
||||
|
||||
# Start web server accessible at http://localhost:8080/
|
||||
run-server:
|
||||
|
|
123
pkg/temporal/config.go
Normal file
123
pkg/temporal/config.go
Normal file
|
@ -0,0 +1,123 @@
|
|||
package temporal
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"go.temporal.io/server/common/cluster"
|
||||
"go.temporal.io/server/common/config"
|
||||
"go.temporal.io/server/common/persistence/sql/sqlplugin/sqlite"
|
||||
)
|
||||
|
||||
const PersistenceStoreName = "sqlite-default"
|
||||
|
||||
const BroadcastAddress = "127.0.0.1"
|
||||
|
||||
const FrontendHttpPort = 8233
|
||||
const FrontendPort = 7233
|
||||
const HistoryPort = 7234
|
||||
const MatchingPort = 7235
|
||||
const WorkerPort = 7236
|
||||
|
||||
func NewConfig() *config.Config {
|
||||
return &config.Config{
|
||||
Persistence: config.Persistence{
|
||||
DataStores: map[string]config.DataStore{
|
||||
PersistenceStoreName: {SQL: &config.SQL{
|
||||
PluginName: sqlite.PluginName,
|
||||
ConnectAttributes: map[string]string{
|
||||
"mode": "rwc",
|
||||
},
|
||||
DatabaseName: "temporal.db",
|
||||
},
|
||||
},
|
||||
},
|
||||
DefaultStore: PersistenceStoreName,
|
||||
VisibilityStore: PersistenceStoreName,
|
||||
NumHistoryShards: 1,
|
||||
},
|
||||
Global: config.Global{
|
||||
Membership: config.Membership{
|
||||
MaxJoinDuration: 30 * time.Second,
|
||||
BroadcastAddress: BroadcastAddress,
|
||||
},
|
||||
},
|
||||
Services: map[string]config.Service{
|
||||
"frontend": {
|
||||
RPC: config.RPC{
|
||||
HTTPPort: FrontendHttpPort,
|
||||
GRPCPort: FrontendPort,
|
||||
MembershipPort: FrontendPort + 100,
|
||||
BindOnLocalHost: false,
|
||||
BindOnIP: "0.0.0.0",
|
||||
},
|
||||
},
|
||||
"history": {
|
||||
RPC: config.RPC{
|
||||
GRPCPort: HistoryPort,
|
||||
MembershipPort: HistoryPort + 100,
|
||||
BindOnLocalHost: true,
|
||||
BindOnIP: "",
|
||||
},
|
||||
},
|
||||
"matching": {
|
||||
RPC: config.RPC{
|
||||
GRPCPort: MatchingPort,
|
||||
MembershipPort: MatchingPort + 100,
|
||||
BindOnLocalHost: true,
|
||||
BindOnIP: "",
|
||||
},
|
||||
},
|
||||
"worker": {
|
||||
RPC: config.RPC{
|
||||
GRPCPort: WorkerPort,
|
||||
MembershipPort: WorkerPort + 100,
|
||||
BindOnLocalHost: true,
|
||||
BindOnIP: "",
|
||||
},
|
||||
},
|
||||
},
|
||||
ClusterMetadata: &cluster.Config{
|
||||
EnableGlobalNamespace: false,
|
||||
FailoverVersionIncrement: 10,
|
||||
MasterClusterName: "active",
|
||||
CurrentClusterName: "active",
|
||||
ClusterInformation: map[string]cluster.ClusterInformation{
|
||||
"active": {
|
||||
Enabled: true,
|
||||
InitialFailoverVersion: 1,
|
||||
RPCAddress: fmt.Sprintf("%s:%d", BroadcastAddress, FrontendPort),
|
||||
ClusterID: "todo",
|
||||
},
|
||||
},
|
||||
},
|
||||
DCRedirectionPolicy: config.DCRedirectionPolicy{
|
||||
Policy: "noop",
|
||||
},
|
||||
Archival: config.Archival{
|
||||
History: config.HistoryArchival{
|
||||
State: "disabled",
|
||||
EnableRead: false,
|
||||
Provider: nil,
|
||||
},
|
||||
Visibility: config.VisibilityArchival{
|
||||
State: "disabled",
|
||||
EnableRead: false,
|
||||
Provider: nil,
|
||||
},
|
||||
},
|
||||
PublicClient: config.PublicClient{
|
||||
HostPort: fmt.Sprintf("%s:%d", BroadcastAddress, FrontendPort),
|
||||
},
|
||||
NamespaceDefaults: config.NamespaceDefaults{
|
||||
Archival: config.ArchivalNamespaceDefaults{
|
||||
History: config.HistoryArchivalNamespaceDefaults{
|
||||
State: "disabled",
|
||||
},
|
||||
Visibility: config.VisibilityArchivalNamespaceDefaults{
|
||||
State: "disabled",
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
|
@ -14,6 +14,6 @@ processes:
|
|||
availability:
|
||||
restart: "always"
|
||||
temporal:
|
||||
command: just run-temporal
|
||||
command: watchexec -r -e go,tmpl,css just run-temporal
|
||||
availability:
|
||||
restart: "always"
|
||||
|
|
Loading…
Reference in a new issue