Skip to content

Commit

Permalink
update docs and add health endpoint
Browse files Browse the repository at this point in the history
Signed-off-by: SammyOina <[email protected]>
  • Loading branch information
SammyOina committed Aug 24, 2023
1 parent ffc1fe5 commit e59f8ae
Show file tree
Hide file tree
Showing 7 changed files with 52 additions and 48 deletions.
6 changes: 3 additions & 3 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,9 @@ endef
$(PROGRAM): $(SOURCES)
CGO_ENABLED=$(CGO_ENABLED) GOOS=$(GOOS) GOARCH=$(GOARCH) GOARM=$(GOARM) \
go build -mod=vendor -ldflags "-s -w \
-X 'github.com/mainflux/mainflux.BuildTime=$(TIME)' \
-X 'github.com/mainflux/mainflux.Version=$(VERSION)' \
-X 'github.com/mainflux/mainflux.Commit=$(COMMIT)'" \
-X 'github.com/absmach/aproxy.BuildTime=$(TIME)' \
-X 'github.com/absmach/aproxy.Version=$(VERSION)' \
-X 'github.com/absmach/aproxy.Commit=$(COMMIT)'" \
-o ./build/$(APROXY_DOCKER_IMAGE_NAME_PREFIX)-$(PROGRAM) cmd/main.go

clean:
Expand Down
54 changes: 30 additions & 24 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,37 +11,43 @@ aProxy is typically deployed on-premise, in the enterprise cloud, in front of Io

## Usage
```bash
go get github.com/absmach/aproxy
cd $(GOPATH)/github.com/absmach/aproxy
git clone https://github.com/absmach/aproxy.git
cd aproxy
make
./aproxy
make docker-image
make run
```

## Configuration

The service is configured using the environment variables presented in the following table. Note that any unset variables will be replaced with their default values.

| Variable | Description | Default |
|-------------------------|------------------------------------------------|-----------|
| APROXY_WS_HOST | WebSocket inbound (IN) connection host | 0.0.0.0 |
| APROXY_WS_PORT | WebSocket inbound (IN) connection port | 8080 |
| APROXY_WS_PATH | WebSocket inbound (IN) connection path | /mqtt |
| APROXY_WSS_PORT | WebSocket Secure inbound (IN) connection port | 8080 |
| APROXY_WSS_PATH | WebSocket Secure inbound (IN) connection path | /mqtt |
| APROXY_WS_TARGET_SCHEME | WebSocket Target schema | ws |
| APROXY_WS_TARGET_HOST | WebSocket Target host | localhost |
| APROXY_WS_TARGET_PORT | WebSocket Target port | 8888 |
| APROXY_WS_TARGET_PATH | WebSocket Target path | /mqtt |
| APROXY_MQTT_HOST | MQTT inbound connection host | 0.0.0.0 |
| APROXY_MQTT_PORT | MQTT inbound connection port | 1883 |
| APROXY_MQTTS_PORT | MQTTS inbound connection port | 8883 |
| APROXY_MQTT_TARGET_HOST | MQTT broker host | 0.0.0.0 |
| APROXY_MQTT_TARGET_PORT | MQTT broker port | 1884 |
| APROXY_CLIENT_TLS | Flag that indicates if TLS should be turned on | false |
| APROXY_CA_CERTS | Path to trusted CAs in PEM format | |
| APROXY_SERVER_CERT | Path to server certificate in pem format | |
| APROXY_SERVER_KEY | Path to server key in pem format | |
| APROXY_LOG_LEVEL | Log level | debug |
| Variable | Description | Default |
|---------------------------------|------------------------------------------------|-----------|
| APROXY_WS_HOST | WebSocket inbound (IN) connection host | 0.0.0.0 |
| APROXY_WS_PORT | WebSocket inbound (IN) connection port | 8080 |
| APROXY_WS_PATH | WebSocket inbound (IN) connection path | /mqtt |
| APROXY_WSS_PORT | WebSocket Secure inbound (IN) connection port | 8080 |
| APROXY_WSS_PATH | WebSocket Secure inbound (IN) connection path | /mqtt |
| APROXY_WS_TARGET_SCHEME | WebSocket Target schema | ws |
| APROXY_WS_TARGET_HOST | WebSocket Target host | localhost |
| APROXY_WS_TARGET_PORT | WebSocket Target port | 8888 |
| APROXY_WS_TARGET_PATH | WebSocket Target path | /mqtt |
| APROXY_MQTT_HOST | MQTT inbound connection host | 0.0.0.0 |
| APROXY_MQTT_PORT | MQTT inbound connection port | 1883 |
| APROXY_MQTTS_PORT | MQTTS inbound connection port | 8883 |
| APROXY_MQTT_TARGET_HOST | MQTT broker host | 0.0.0.0 |
| APROXY_MQTT_TARGET_PORT | MQTT broker port | 1884 |
| APROXY_CLIENT_TLS | Flag that indicates if TLS should be turned on | false |
| APROXY_CA_CERTS | Path to trusted CAs in PEM format | |
| APROXY_SERVER_CERT | Path to server certificate in pem format | |
| APROXY_SERVER_KEY | Path to server key in pem format | |
| APROXY_LOG_LEVEL | Log level | debug |
| APROXY_MQTT_ADAPTER_CONFIG_FILE | Config file path. This overites env if set. | |
| APROXY_RELEASE_TAG | Docker release tag. | latest |
| APROXY_THINGS_URL | Things url. | |
| APROXY_THINGS_AUTH_GRPC_URL | Things GRPC URL for authentication. | |
| APROXY_THINGS_AUTH_GRPC_TIMEOUT | Things GRPC timeout duration | 1s |

## License
[Apache-2.0](LICENSE)
Expand Down
22 changes: 8 additions & 14 deletions cmd/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"os"
"time"

"github.com/absmach/aproxy"
"github.com/absmach/aproxy/auth"
"github.com/absmach/aproxy/internal/config"
thingsclient "github.com/absmach/aproxy/internal/grpc/things"
Expand All @@ -24,7 +25,7 @@ import (
"golang.org/x/sync/errgroup"
)

const svcName = "mqtt"
const svcName = "aproxy"

func main() {
ctx, cancel := context.WithCancel(context.Background())
Expand Down Expand Up @@ -64,14 +65,6 @@ func main() {
}
}

//nps, err := brokers.NewPubSub(cfg.General.BrokerURL, "mqtt", logger)
if err != nil {
logger.Error(fmt.Sprintf("failed to connect to message broker: %s", err))
exitCode = 1
return
}
//defer nps.Close()

mpub, err := mqttpub.NewPublisher(fmt.Sprintf("%s:%s", cfg.MQTTAdapter.MQTTTargetHost, cfg.MQTTAdapter.MQTTTargetPort), time.Duration(cfg.MQTTAdapter.MQTTForwarderTimeout))
if err != nil {
logger.Error(fmt.Sprintf("failed to create MQTT publisher: %s", err))
Expand Down Expand Up @@ -101,7 +94,7 @@ func main() {

logger.Info(fmt.Sprintf("Starting MQTT over WS proxy on port %s", cfg.HTTPAdapter.HTTPPort))
g.Go(func() error {
return proxyWS(ctx, cfg.HTTPAdapter, logger, h)
return proxyWS(ctx, cfg, logger, h)
})

g.Go(func() error {
Expand Down Expand Up @@ -136,15 +129,16 @@ func proxyMQTT(ctx context.Context, cfg config.MQTTAdapterConfig, logger mflog.L
}
}

func proxyWS(ctx context.Context, cfg config.HTTPAdapterConfig, logger mflog.Logger, handler session.Handler) error {
target := fmt.Sprintf("%s:%s", cfg.HTTPTargetHost, cfg.HTTPTargetPort)
wp := websocket.New(target, cfg.HTTPTargetPath, "ws", handler, logger)
func proxyWS(ctx context.Context, cfg config.Config, logger mflog.Logger, handler session.Handler) error {
target := fmt.Sprintf("%s:%s", cfg.HTTPAdapter.HTTPTargetHost, cfg.HTTPAdapter.HTTPTargetPort)
wp := websocket.New(target, cfg.HTTPAdapter.HTTPTargetPath, "ws", handler, logger)
http.Handle("/mqtt", wp.Handler())
http.Handle("/health", aproxy.Health(svcName, cfg.General.InstanceID))

errCh := make(chan error)

go func() {
errCh <- wp.Listen(cfg.HTTPPort)
errCh <- wp.Listen(cfg.HTTPAdapter.HTTPPort)
}()

select {
Expand Down
3 changes: 0 additions & 3 deletions docker/.env
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,7 @@ APROXY_MQTT_ADAPTER_WS_TARGET_HOST=vernemq
APROXY_MQTT_ADAPTER_WS_TARGET_PORT=8080
APROXY_MQTT_ADAPTER_WS_TARGET_PATH=/mqtt
APROXY_MQTT_ADAPTER_INSTANCE=
APROXY_MQTT_ADAPTER_ES_URL=es-redis:${APROXY_REDIS_TCP_PORT}
APROXY_MQTT_ADAPTER_ES_PASS=
APROXY_MQTT_ADAPTER_INSTANCE_ID=
APROXY_MQTT_ADAPTER_ES_DB=0
APROXY_MQTT_ADAPTER_CONFIG_FILE="config.toml"

# Docker image tag
Expand Down
6 changes: 3 additions & 3 deletions docker/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,6 @@ services:
APROXY_MQTT_ADAPTER_WS_TARGET_PORT: ${APROXY_MQTT_ADAPTER_WS_TARGET_PORT}
APROXY_MQTT_ADAPTER_WS_TARGET_PATH: ${APROXY_MQTT_ADAPTER_WS_TARGET_PATH}
APROXY_MQTT_ADAPTER_INSTANCE: ${APROXY_MQTT_ADAPTER_INSTANCE}
APROXY_MQTT_ADAPTER_ES_URL: ${APROXY_MQTT_ADAPTER_ES_URL}
APROXY_MQTT_ADAPTER_ES_PASS: ${APROXY_MQTT_ADAPTER_ES_PASS}
APROXY_MQTT_ADAPTER_ES_DB: ${APROXY_MQTT_ADAPTER_ES_DB}
APROXY_THINGS_AUTH_GRPC_URL: ${APROXY_THINGS_AUTH_GRPC_URL}
APROXY_THINGS_AUTH_GRPC_TIMEOUT: ${APROXY_THINGS_AUTH_GRPC_TIMEOUT}
APROXY_THINGS_AUTH_GRPC_CLIENT_TLS: ${APROXY_THINGS_AUTH_GRPC_CLIENT_TLS}
Expand All @@ -33,3 +30,6 @@ services:
- mainflux-base-net
volumes:
- ../configs/config.toml:/config.toml
ports:
- ${APROXY_MQTT_ADAPTER_WS_TARGET_PORT}:${APROXY_MQTT_ADAPTER_WS_TARGET_PORT}

2 changes: 1 addition & 1 deletion health.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package mainflux
package aproxy

import (
"encoding/json"
Expand Down
7 changes: 7 additions & 0 deletions internal/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"github.com/pelletier/go-toml/v2"
)

// MQTTAdapterConfig configuration for mqtt proxy.
type MQTTAdapterConfig struct {
MQTTPort string `toml:"PORT" env:"APROXY_MQTT_ADAPTER_MQTT_PORT" envDefault:"1883"`
MQTTTargetHost string `toml:"TARGET_HOST" env:"APROXY_MQTT_ADAPTER_MQTT_TARGET_HOST" envDefault:"localhost"`
Expand All @@ -17,29 +18,34 @@ type MQTTAdapterConfig struct {
MQTTTargetHealthCheck string `toml:"HEALTH_CHECK" env:"APROXY_MQTT_ADAPTER_MQTT_TARGET_HEALTH_CHECK" envDefault:""`
}

// HTTPAdapterConfig configuration for ws proxy.
type HTTPAdapterConfig struct {
HTTPPort string `toml:"PORT" env:"APROXY_MQTT_ADAPTER_WS_PORT" envDefault:"8080"`
HTTPTargetHost string `toml:"TARGET_HOST" env:"APROXY_MQTT_ADAPTER_WS_TARGET_HOST" envDefault:"localhost"`
HTTPTargetPort string `toml:"TARGET_PORT" env:"APROXY_MQTT_ADAPTER_WS_TARGET_PORT" envDefault:"8080"`
HTTPTargetPath string `toml:"TARGET_PATH" env:"APROXY_MQTT_ADAPTER_WS_TARGET_PATH" envDefault:"/mqtt"`
}

// GeneralConfig general service configuration.
type GeneralConfig struct {
LogLevel string `toml:"LOG_LEVEL" env:"APROXY_MQTT_ADAPTER_LOG_LEVEL" envDefault:"info"`
Instance string `toml:"INSTANCE" env:"APROXY_MQTT_ADAPTER_INSTANCE" envDefault:""`
JaegerURL string `toml:"JAEGER_URL" env:"APROXY_JAEGER_URL" envDefault:"http://jaeger:14268/api/traces"`
InstanceID string `toml:"INSTANCE_ID" env:"APROXY_MQTT_ADAPTER_INSTANCE_ID" envDefault:""`
}

// Config all configuration params for service.
type Config struct {
MQTTAdapter MQTTAdapterConfig `toml:"MQTTAdapter"`
HTTPAdapter HTTPAdapterConfig `toml:"HTTPAdapter"`
General GeneralConfig `toml:"General"`
ConfigFile string `toml:"-" env:"APROXY_MQTT_ADAPTER_CONFIG_FILE" envDefault:"config.toml"`
}

// Duration time duration.
type Duration time.Duration

// UnmarshalText custom unmarsher for Duration.
func (d *Duration) UnmarshalText(b []byte) error {
x, err := time.ParseDuration(string(b))
if err != nil {
Expand All @@ -65,6 +71,7 @@ func parseConfigFile(cfg *Config) error {
return nil
}

// NewConfig creates new configuration from env and config file if provided respectively.
func NewConfig() (Config, error) {
cfg := Config{}
if err := env.Parse(&cfg); err != nil {
Expand Down

0 comments on commit e59f8ae

Please sign in to comment.