diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index 719de55..8a30288 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -33,6 +33,8 @@ services: - DATA_MANAGER_URL=htwkalender-data-manager networks: - "net" + depends_on: + - htwkalender-data-manager htwkalender-frontend: image: DOCKER_REGISTRY_REPO-frontend # DOCKER_REGISTRY_REPO will be replaced by CI diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index f52e1aa..061692b 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -33,6 +33,8 @@ services: - DATA_MANAGER_URL=htwkalender-data-manager networks: - "net" + depends_on: + - htwkalender-data-manager htwkalender-frontend: image: DOCKER_REGISTRY_REPO-frontend # DOCKER_REGISTRY_REPO will be replaced by CI diff --git a/docker-compose.yml b/docker-compose.yml index 7ec3d59..97cd99c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -35,6 +35,8 @@ services: target: dev # prod environment: - DATA_MANAGER_URL=htwkalender-data-manager + depends_on: + - htwkalender-data-manager htwkalender-frontend: build: diff --git a/frontend/nginx.conf b/frontend/nginx.conf index 8e67212..dc99832 100644 --- a/frontend/nginx.conf +++ b/frontend/nginx.conf @@ -27,8 +27,10 @@ http { include mime.types; default_type application/octet-stream; - access_log /opt/bitnami/nginx/logs/proxy_access.log; - error_log /opt/bitnami/nginx/logs/proxy_error.log; + log_format anonymized '[$time_local] "$request" $status $body_bytes_sent "$http_referer"'; + + access_log /opt/bitnami/nginx/logs/proxy_access.log anonymized; + error_log /opt/bitnami/nginx/logs/proxy_error.log error; sendfile on; keepalive_timeout 180s; diff --git a/reverseproxy.conf b/reverseproxy.conf index 55220e6..71332dc 100644 --- a/reverseproxy.conf +++ b/reverseproxy.conf @@ -59,8 +59,10 @@ http { real_ip_header CF-Connecting-IP; - access_log /opt/bitnami/nginx/logs/proxy_access.log; - error_log /opt/bitnami/nginx/logs/proxy_error.log; + log_format anonymized '[$time_local] "$request" $status $body_bytes_sent "$http_referer"'; + + access_log /opt/bitnami/nginx/logs/proxy_access.log anonymized; + error_log /opt/bitnami/nginx/logs/proxy_error.log error; sendfile on; keepalive_timeout 180s; diff --git a/reverseproxy.dev.conf b/reverseproxy.dev.conf index 793ce4e..d735cad 100644 --- a/reverseproxy.dev.conf +++ b/reverseproxy.dev.conf @@ -60,8 +60,10 @@ http { real_ip_header CF-Connecting-IP; - access_log /opt/bitnami/nginx/logs/proxy_access.log; - error_log /opt/bitnami/nginx/logs/proxy_error.log; + log_format anonymized '[$time_local] "$request" $status $body_bytes_sent "$http_referer"'; + + access_log /opt/bitnami/nginx/logs/proxy_access.log anonymized; + error_log /opt/bitnami/nginx/logs/proxy_error.log error; sendfile on; keepalive_timeout 180s; diff --git a/reverseproxy.local.conf b/reverseproxy.local.conf index 60b3822..42a12cf 100644 --- a/reverseproxy.local.conf +++ b/reverseproxy.local.conf @@ -10,6 +10,12 @@ events { http { include mime.types; default_type application/octet-stream; + gzip on; + + log_format anonymized '[$time_local] "$request" $status $body_bytes_sent "$http_referer"'; + + access_log /opt/bitnami/nginx/logs/proxy_access.log anonymized; + error_log /opt/bitnami/nginx/logs/proxy_error.log error; map $request_method $ratelimit_key { POST $binary_remote_addr; diff --git a/services/data-manager/service/grpc/server.go b/services/data-manager/service/grpc/server.go index f5b6ad3..9992ec0 100644 --- a/services/data-manager/service/grpc/server.go +++ b/services/data-manager/service/grpc/server.go @@ -2,8 +2,10 @@ package grpc import ( "github.com/pocketbase/pocketbase" + "google.golang.org/grpc/keepalive" "log" "net" + "time" "google.golang.org/grpc" pb "htwkalender/common/genproto/modules" @@ -14,7 +16,20 @@ func StartGRPCServer(app *pocketbase.PocketBase) { if err != nil { log.Fatalf("failed to listen: %v", err) } - s := grpc.NewServer() + s := grpc.NewServer( + grpc.KeepaliveParams(keepalive.ServerParameters{ + MaxConnectionIdle: 5 * time.Minute, // Idle timeout before closing connection + MaxConnectionAge: 30 * time.Minute, // Max time before connection is closed + MaxConnectionAgeGrace: 5 * time.Minute, // Allow grace period before closing + Time: 2 * time.Minute, // Ping the client every 2 minutes + Timeout: 20 * time.Second, // Wait 20 seconds for ping ack + }), + grpc.KeepaliveEnforcementPolicy(keepalive.EnforcementPolicy{ + MinTime: 1 * time.Minute, // Minimum time between pings from clients + PermitWithoutStream: true, // Don't allow pings when there are no active RPCs + }), + grpc.MaxConcurrentStreams(0), + ) pb.RegisterModuleServiceServer(s, &ModuleServiceHandler{ app: app, diff --git a/services/ical/main.go b/services/ical/main.go index 1769786..e0a4d10 100644 --- a/services/ical/main.go +++ b/services/ical/main.go @@ -39,8 +39,15 @@ func main() { } grpcClient := grpc.ConnectGRPCServer(host) + + // Close the grpc connection when the main function ends defer grpc.CloseGRPCServer(grpcClient) + // Log the grpc connection + // Test the connection to the grpc server + grpcClient.Connect() + slog.Info("GRPC connection state", "state", grpcClient.GetState()) + // Initialize a new Fiber app webdavRequestMethods := []string{"PROPFIND", "MKCOL", "COPY", "MOVE"} diff --git a/services/ical/service/connector/grpc/client.go b/services/ical/service/connector/grpc/client.go index 7b3b261..1954523 100644 --- a/services/ical/service/connector/grpc/client.go +++ b/services/ical/service/connector/grpc/client.go @@ -19,14 +19,31 @@ package grpc import ( "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" + "google.golang.org/grpc/keepalive" "log/slog" + "sync" + "time" ) +var conn *grpc.ClientConn +var once sync.Once + func ConnectGRPCServer(host string) *grpc.ClientConn { - conn, err := grpc.NewClient(host+":50051", grpc.WithTransportCredentials(insecure.NewCredentials())) - if err != nil { - slog.Error("could not connect to grpc server", "error", err) - } + once.Do(func() { + var err error + conn, err = grpc.NewClient( + host+":50051", + grpc.WithTransportCredentials(insecure.NewCredentials()), + grpc.WithKeepaliveParams(keepalive.ClientParameters{ + Time: 2 * time.Minute, + Timeout: 20 * time.Second, + PermitWithoutStream: true, + }), + ) + if err != nil { + slog.Error("could not connect to grpc server", "error", err) + } + }) return conn }