Skip to content

Commit

Permalink
Experemental (#24)
Browse files Browse the repository at this point in the history
go native sqlite
dockerfile
go releaser
cli
  • Loading branch information
mikekonan authored Dec 6, 2021
1 parent 796988c commit de14104
Show file tree
Hide file tree
Showing 12 changed files with 389 additions and 34 deletions.
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
.idea
bin
dist

dist/
43 changes: 43 additions & 0 deletions .goreleaser.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# This is an example .goreleaser.yml file with some sensible defaults.
# Make sure to check the documentation at https://goreleaser.com
before:
hooks:
- go mod tidy
builds:
- env:
- CGO_ENABLED=0
ldflags:
- -s -w -X main.version={{ .Version }}
goos:
- linux
- windows
- darwin
goarch:
- amd64
- arm
- arm64
goarm:
- 6
- 7
ignore:
- goos: windows
goarch: arm
goarm: 7
- goos: windows
goarch: arm
goarm: 6
- goos: windows
goarch: arm64
changelog:
sort: asc
filters:
exclude:
- '^docs:'
- '^test:'
release:
github:
owner: mikekonan
name: freqtrade-proxy
draft: true
name_template: "{{.ProjectName}}-v{{.Version}}"

4 changes: 4 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,15 @@ RUN cd /src && go build -o /src/bin/proxy

FROM alpine:3.15

RUN adduser -g "proxy" -D -H proxy proxy

RUN apk --no-cache add ca-certificates \
&& rm -rf /var/cache/apk/*

COPY --from=builder /src/bin/proxy /bin/proxy

USER proxy

EXPOSE 8080

ENTRYPOINT ["/bin/proxy"]
8 changes: 4 additions & 4 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,17 @@
.DEFAULT_GOAL := help

build-local:
go build -trimpath -o ./bin/freqtrade-proxy
go build -trimpath -o ./dist/freqtrade-proxy

build: ## build binaries
go build -trimpath -o ./bin/freqtrade-proxy-darwin-amd64
go build -trimpath -o ./dist/freqtrade-proxy-darwin-amd64
for arch in "linux/amd64" "linux/arm/v6" "linux/arm/v7" "linux/arm64" ; do \
echo $${arch//\//-}; \
docker run --platform $$arch -v $(PWD):/tmp/src golang:buster /bin/bash -c "cd /tmp/src && go build -trimpath -o ./bin/freqtrade-proxy-"$${arch//\//-} ;\
docker run --platform $$arch -v $(PWD):/tmp/src golang:buster /bin/bash -c "cd /tmp/src && go build -trimpath -o ./dist/freqtrade-proxy-"$${arch//\//-} ;\
done

clean: ## clean
rm ./bin/freqtrade-proxy*
rm ./dist/freqtrade-proxy*

help:
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'
Empty file removed bin/.gitkeep
Empty file.
2 changes: 1 addition & 1 deletion docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ services:
--strategy SampleStrategy
freqtrade-proxy:
image: mikekonan/freqtrade-proxy:main
image: mikekonan/freqtrade-proxy:main-amd64
restart: unless-stopped
command: -verbose 1
container_name: freqtrade-proxy
6 changes: 4 additions & 2 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,15 @@ require (
github.com/doug-martin/goqu/v9 v9.16.0
github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 // indirect
github.com/go-ozzo/ozzo-routing v2.1.4+incompatible // indirect
github.com/go-ozzo/ozzo-validation/v4 v4.3.0
github.com/golang/gddo v0.0.0-20210115222349-20d68f94ee1f // indirect
github.com/jaffee/commandeer v0.5.0
github.com/jmoiron/sqlx v1.3.4
github.com/mattn/go-sqlite3 v1.14.8
github.com/qiangxue/fasthttp-routing v0.0.0-20160225050629-6ccdc2a18d87
github.com/sirupsen/logrus v1.4.1
github.com/spf13/cast v1.1.0
github.com/spf13/cast v1.3.0
github.com/valyala/fasthttp v1.29.0
go.uber.org/ratelimit v0.2.0
go4.org v0.0.0-20201209231011-d4a079459e60
modernc.org/sqlite v1.14.2
)
234 changes: 230 additions & 4 deletions go.sum

Large diffs are not rendered by default.

61 changes: 49 additions & 12 deletions main.go
Original file line number Diff line number Diff line change
@@ -1,33 +1,70 @@
package main

import (
"flag"
"fmt"
"os"

"github.com/Gurpartap/logrus-stack"
logrus_stack "github.com/Gurpartap/logrus-stack"
"github.com/jaffee/commandeer"
"github.com/mikekonan/freqtradeProxy/proxy/kucoin"
"github.com/mikekonan/freqtradeProxy/store"
"github.com/sirupsen/logrus"
)

func main() {
logrus.SetOutput(os.Stdout)
logrus.AddHook(logrus_stack.StandardHook())
var version = "dev"

port := flag.Int("port", 8080, "listen port")
verbose := flag.Int("verbose", 0, "verbose level. 0 - info [default]. 1 - debug. 2 - trace.")
flag.Parse()
type app struct {
Config kucoin.Config `flag:"!embed"`
Verbose int `help:"verbose level: 0 - info, 1 - debug, 2 - trace"`
}

func newApp() *app {
return &app{
Verbose: 0,
Config: kucoin.Config{
Port: "8080",
Bindaddr: "0.0.0.0",
},
}
}

switch *verbose {
func (m *app) configure() {
switch m.Verbose {
case 0:
logrus.SetLevel(logrus.InfoLevel)
case 1:
logrus.SetLevel(logrus.DebugLevel)
case 2:
logrus.SetLevel(logrus.TraceLevel)
}
}

func (a *app) Run() error {
logrus.SetOutput(os.Stdout)
logrus.AddHook(logrus_stack.StandardHook())

logrus.Infof("freqtrade-proxy version - %s", version)

s := store.New()
k := kucoin.New(s)
k.Start(*port)
if a.Verbose > 2 {
return fmt.Errorf("wrong verbose level '%d'", a.Verbose)
}

a.configure()

if err := a.Config.Validate(); err != nil {
return err
}

k := kucoin.New(store.New(), a.Config)
k.Start()

return nil
}

func main() {
app := newApp()

if err := commandeer.Run(app); err != nil {
logrus.Fatal(err)
}
}
20 changes: 20 additions & 0 deletions proxy/kucoin/config.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package kucoin

import (
"github.com/go-ozzo/ozzo-validation/v4"
"github.com/go-ozzo/ozzo-validation/v4/is"
)

type Config struct {
Port string `help:"listen port"`
Bindaddr string `help:"bindable address"`
//Localaddr string `help:"local address (use it if you understand what you are doing)"`
}

func (c Config) Validate() error {
return validation.ValidateStruct(&c,
validation.Field(&c.Port, is.Port),
validation.Field(&c.Bindaddr, is.IPv4),
//validation.Field(&c.Localaddr, validation.When(c.Localaddr != "", is.IPv4)),
)
}
35 changes: 28 additions & 7 deletions proxy/kucoin/kucoin.go
Original file line number Diff line number Diff line change
Expand Up @@ -90,10 +90,30 @@ type ws struct {
count int
}

func New(s *store.Store) *kucoin {
func New(store *store.Store, config Config) *kucoin {
client := &fasthttp.Client{
ReadTimeout: time.Second * 15,
WriteTimeout: time.Second * 15,
}

//if config.Localaddr != "" {
// localAddr, err := net.ResolveIPAddr("ip", config.Localaddr)
// if err != nil {
// logrus.Errorf("cannot revolve '%v'", config.Localaddr)
// }
//
// dialer := &net.Dialer{LocalAddr: &net.TCPAddr{IP: localAddr.IP}}
//
// client.Dial = func(addr string) (net.Conn, error) {
// fmt.Println(addr)
// return dialer.Dial("tcp", addr)
// }
//}

instance := &kucoin{
client: fasthttp.Client{},
store: s,
config: config,
client: client,
store: store,
subscriptionManager: &subscriptionManager{clients: nil, rl: ratelimit.New(9), l: new(sync.Mutex), subs: map[string]struct{}{}},
}

Expand All @@ -106,13 +126,14 @@ func New(s *store.Store) *kucoin {
}

type kucoin struct {
client fasthttp.Client
client *fasthttp.Client

store *store.Store
svc *sdk.ApiService
rl ratelimit.Limiter

subscriptionManager *subscriptionManager
config Config
}

func parseCandle(pair string, tf string, candle sdk.KLineModel) model.Candle {
Expand Down Expand Up @@ -246,7 +267,7 @@ func (resp *apiResp) json() []byte {
return data
}

func (kucoin *kucoin) Start(port int) {
func (kucoin *kucoin) Start() {
router := routing.New()

router.Get("/kucoin/api/v1/market/candles", func(c *routing.Context) error {
Expand Down Expand Up @@ -320,7 +341,7 @@ func (kucoin *kucoin) Start(port int) {
return nil
})

logrus.Infof("starting proxy server on :%d port...", port)
logrus.Infof("starting proxy server on :%s port...", kucoin.config.Port)

panic(fasthttp.ListenAndServe(fmt.Sprintf(":%d", port), router.HandleRequest))
panic(fasthttp.ListenAndServe(fmt.Sprintf("%s:%s", kucoin.config.Bindaddr, kucoin.config.Port), router.HandleRequest))
}
6 changes: 3 additions & 3 deletions store/store.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import (
"github.com/sirupsen/logrus"

"github.com/doug-martin/goqu/v9"
_ "github.com/mattn/go-sqlite3"
_ "modernc.org/sqlite"
)

const cacheSize = 5000
Expand All @@ -27,8 +27,8 @@ var bootstrapScript string
func New() *Store {
store := new(Store)
var err error
store.conn, err = sqlx.Open("sqlite3", "file::memory:?cache=shared")
//store.conn, err = sqlx.Open("sqlite3", "kek.db")
store.conn, err = sqlx.Open("sqlite", "file::memory:?cache=shared")
//store.conn, err = sqlx.Open("sqlite", "kek.db")
if err != nil {
logrus.Panic(err)
}
Expand Down

0 comments on commit de14104

Please sign in to comment.