Skip to content
This repository was archived by the owner on Jan 19, 2026. It is now read-only.
/ syncproxy Public archive
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,12 @@ you can build from source:
2. Build with `go build -o mautrix-syncproxy`. The resulting executable will be
in the current directory named `mautrix-syncproxy`.

Configuring is done via environment variables.
Configuring is done via .yaml configuration file or via environment variables.

If using a configuration file, see the included example-config.yaml, and pass
`-config CONFIGURATION_FILENAME.yaml` on the command line.

If using environment variables (convenient for running syncproxy in docker):

* `LISTEN_ADDRESS` - The address where to listen.
* `HOMESERVER_URL` - The address to Synapse. If using workers, it is sufficient
Expand Down
6 changes: 6 additions & 0 deletions example-config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
listen_address: localhost:29332
database_url: postgres://user:pass@host/mautrixsyncproxy
homeserver_url: http://localhost:8008
shared_secret: random string here
debug: true

1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ require (
github.com/jackc/pgx/v4 v4.13.0
github.com/mattn/go-sqlite3 v1.14.8
github.com/prometheus/client_golang v1.11.0
gopkg.in/yaml.v2 v2.4.0
maunium.net/go/maulogger/v2 v2.3.0
maunium.net/go/mautrix v0.9.22
)
2 changes: 2 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -328,6 +328,8 @@ gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
Expand Down
60 changes: 42 additions & 18 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ package main

import (
"context"
"flag"
"net/http"
"os"
"os/signal"
Expand All @@ -27,6 +28,7 @@ import (

"github.com/gorilla/mux"
"github.com/prometheus/client_golang/prometheus/promhttp"
"gopkg.in/yaml.v2"
log "maunium.net/go/maulogger/v2"
)

Expand Down Expand Up @@ -56,26 +58,48 @@ func getIntEnv(key string, defVal int) int {
return val
}

var configPath = flag.String("config", "config.yaml", "path to config file")

func readConfig() {
cfg.ListenAddress = os.Getenv("LISTEN_ADDRESS")
cfg.DatabaseURL = os.Getenv("DATABASE_URL")
cfg.DatabaseOpts.MaxOpenConns = getIntEnv("DATABASE_MAX_OPEN_CONNS", 4)
cfg.DatabaseOpts.MaxIdleConns = getIntEnv("DATABASE_MAX_IDLE_CONNS", 2)
cfg.HomeserverURL = os.Getenv("HOMESERVER_URL")
cfg.SharedSecret = os.Getenv("SHARED_SECRET")
cfg.ExpectSynchronous = len(os.Getenv("EXPECT_SYNCHRONOUS")) > 0
cfg.Debug = len(os.Getenv("DEBUG")) > 0

if len(cfg.ListenAddress) == 0 {
log.Fatalln("LISTEN_ADDRESS environment variable is not set")
} else if len(cfg.DatabaseURL) == 0 {
log.Fatalln("DATABASE_URL environment variable is not set")
} else if len(cfg.HomeserverURL) == 0 {
log.Fatalln("HOMESERVER_URL environment variable is not set")
} else if len(cfg.SharedSecret) == 0 {
log.Fatalln("SHARED_SECRET environment variable is not set")
flag.Parse()
if *configPath == "env" {
cfg.ListenAddress = os.Getenv("LISTEN_ADDRESS")
cfg.DatabaseURL = os.Getenv("DATABASE_URL")
cfg.DatabaseOpts.MaxOpenConns = getIntEnv("DATABASE_MAX_OPEN_CONNS", 4)
cfg.DatabaseOpts.MaxIdleConns = getIntEnv("DATABASE_MAX_IDLE_CONNS", 2)
cfg.HomeserverURL = os.Getenv("HOMESERVER_URL")
cfg.SharedSecret = os.Getenv("SHARED_SECRET")
cfg.ExpectSynchronous = len(os.Getenv("EXPECT_SYNCHRONOUS")) > 0
cfg.Debug = len(os.Getenv("DEBUG")) > 0

if len(cfg.ListenAddress) == 0 {
log.Fatalln("LISTEN_ADDRESS environment variable is not set")
} else if len(cfg.DatabaseURL) == 0 {
log.Fatalln("DATABASE_URL environment variable is not set")
} else if len(cfg.HomeserverURL) == 0 {
log.Fatalln("HOMESERVER_URL environment variable is not set")
} else if len(cfg.SharedSecret) == 0 {
log.Fatalln("SHARED_SECRET environment variable is not set")
} else {
return
}
} else {
return
file, err := os.Open(*configPath)
if err != nil {
log.Fatalln("Failed to open config:", err)
}
err = yaml.NewDecoder(file).Decode(&cfg)
if err != nil {
log.Fatalln("Failed to read config:", err)
} else if len(cfg.DatabaseURL) == 0 {
log.Fatalln("DATABASE_URL environment variable is not set")
} else if len(cfg.HomeserverURL) == 0 {
log.Fatalln("HOMESERVER_URL environment variable is not set")
} else if len(cfg.SharedSecret) == 0 {
log.Fatalln("SHARED_SECRET environment variable is not set")
} else {
return
}
}

os.Exit(2)
Expand Down