diff --git a/cmd/cgat/main.go b/cmd/cgat/main.go
index e9559519805b2406517fbe71cefdb5a2e6a760c4..7d8fd084085e803d31fd94eb64ddb9ff23e4c0f7 100644
--- a/cmd/cgat/main.go
+++ b/cmd/cgat/main.go
@@ -4,6 +4,7 @@ import (
 	"log"
 	"net/http"
 	_ "net/http/pprof"
+	"os"
 
 	"pggat2/lib/gat"
 	"pggat2/lib/gat/configs/pgbouncer"
@@ -16,7 +17,11 @@ func main() {
 
 	log.Println("Starting pggat...")
 
-	conf, err := pgbouncer.Load()
+	if len(os.Args) < 2 {
+		panic("usage: pggat <config>")
+	}
+
+	conf, err := pgbouncer.Load(os.Args[1])
 	if err != nil {
 		panic(err)
 	}
diff --git a/lib/gat/configs/pgbouncer/config.go b/lib/gat/configs/pgbouncer/config.go
index a4829f88a1f63354a8bd8dc403fe5b30484c00e2..428577160cb750f17e17f074abeaa8afdfb72b50 100644
--- a/lib/gat/configs/pgbouncer/config.go
+++ b/lib/gat/configs/pgbouncer/config.go
@@ -251,8 +251,8 @@ var Default = Config{
 	},
 }
 
-func Load() (Config, error) {
-	conf, err := ini2.ReadFile("pgbouncer.ini")
+func Load(config string) (Config, error) {
+	conf, err := ini2.ReadFile(config)
 	if err != nil {
 		return Config{}, err
 	}
@@ -360,9 +360,19 @@ func (T *Config) ListenAndServe(pooler *gat.Pooler) error {
 		}
 	}
 
-	listen := net.JoinHostPort(T.PgBouncer.ListenAddr, strconv.Itoa(T.PgBouncer.ListenPort))
+	if T.PgBouncer.ListenAddr != "" {
+		listenAddr := T.PgBouncer.ListenAddr
+		if listenAddr == "*" {
+			listenAddr = ""
+		}
+
+		listen := net.JoinHostPort(listenAddr, strconv.Itoa(T.PgBouncer.ListenPort))
 
-	log.Println("listening on", listen)
+		log.Println("listening on", listen)
+
+		return pooler.ListenAndServe(listen)
+	}
 
-	return pooler.ListenAndServe(listen)
+	// listen on unix socket
+	return nil
 }
diff --git a/pgbouncer.ini b/pgbouncer.ini
index 5ce00217d8bb9e16f5c1024424ed8b24cb1dfd4c..85f013d2d5270ee758ee6cac27c96267e2ff7ba5 100644
--- a/pgbouncer.ini
+++ b/pgbouncer.ini
@@ -1,6 +1,7 @@
 [pgbouncer]
-mode = transaction
+pool_mode = transaction
 auth_file = userlist.txt
+listen_addr = *
 
 [users]
 postgres =