diff --git a/go.mod b/go.mod
index 0b32b1df2518289216409a0d8c748d56c3e96719..d4e104c0156c89dad1b9c752d60471b6f9d03240 100644
--- a/go.mod
+++ b/go.mod
@@ -5,6 +5,7 @@ go 1.20
 require (
 	github.com/google/uuid v1.3.0
 	github.com/xdg-go/scram v1.1.2
+	golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4
 	k8s.io/api v0.27.4
 	k8s.io/apimachinery v0.27.4
 	k8s.io/client-go v0.27.4
diff --git a/go.sum b/go.sum
index 8d7e7b62cd99b980f4ff8cc433bae065e526f228..0565953bc40a45dc9db2f63bd4985ee3138031c5 100644
--- a/go.sum
+++ b/go.sum
@@ -284,6 +284,7 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJ
 golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 h1:uVc8UZUe6tr40fFVnUP5Oj+veunVezqYl9z7DYw9xzw=
 golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
diff --git a/lib/gat/configs/pgbouncer/config.go b/lib/gat/configs/pgbouncer/config.go
index 428577160cb750f17e17f074abeaa8afdfb72b50..98ca3fc78da6d5efae2b58e4fcd91ce6b098c429 100644
--- a/lib/gat/configs/pgbouncer/config.go
+++ b/lib/gat/configs/pgbouncer/config.go
@@ -6,8 +6,11 @@ import (
 	"net"
 	"os"
 	"strconv"
+	"strings"
 	"time"
 
+	"golang.org/x/sync/errgroup"
+
 	"pggat2/lib/auth/credentials"
 	"pggat2/lib/gat"
 	"pggat2/lib/gat/pools/session"
@@ -360,19 +363,47 @@ func (T *Config) ListenAndServe(pooler *gat.Pooler) error {
 		}
 	}
 
+	var wg errgroup.Group
+
 	if T.PgBouncer.ListenAddr != "" {
-		listenAddr := T.PgBouncer.ListenAddr
-		if listenAddr == "*" {
-			listenAddr = ""
-		}
+		wg.Go(func() error {
+			listenAddr := T.PgBouncer.ListenAddr
+			if listenAddr == "*" {
+				listenAddr = ""
+			}
 
-		listen := net.JoinHostPort(listenAddr, strconv.Itoa(T.PgBouncer.ListenPort))
+			listen := net.JoinHostPort(listenAddr, strconv.Itoa(T.PgBouncer.ListenPort))
 
-		log.Println("listening on", listen)
+			log.Println("listening on", listen)
 
-		return pooler.ListenAndServe(listen)
+			listener, err := net.Listen("tcp", listen)
+			if err != nil {
+				return err
+			}
+
+			return pooler.ListenAndServe(listener)
+		})
 	}
 
 	// listen on unix socket
-	return nil
+	wg.Go(func() error {
+		dir := T.PgBouncer.UnixSocketDir
+		port := T.PgBouncer.ListenPort
+
+		if !strings.HasSuffix(dir, "/") {
+			dir = dir + "/"
+		}
+		dir = dir + ".s.PGSQL." + strconv.Itoa(port)
+
+		listener, err := net.Listen("unix", dir)
+		if err != nil {
+			return err
+		}
+
+		log.Printf("listening on unix:%s", dir)
+
+		return pooler.ListenAndServe(listener)
+	})
+
+	return wg.Wait()
 }
diff --git a/lib/gat/pooler.go b/lib/gat/pooler.go
index a68e7c2e7eac5d78c313fca260c629a04bdfe722..cf04f0bf9f6875a2da1e00f9997d95716d8f4a49 100644
--- a/lib/gat/pooler.go
+++ b/lib/gat/pooler.go
@@ -69,12 +69,7 @@ func (T *Pooler) Serve(client zap.ReadWriter) {
 	pool.Serve(client, startupParameters)
 }
 
-func (T *Pooler) ListenAndServe(address string) error {
-	listener, err := net.Listen("tcp", address)
-	if err != nil {
-		return err
-	}
-
+func (T *Pooler) ListenAndServe(listener net.Listener) error {
 	for {
 		conn, err := listener.Accept()
 		if err != nil {