Skip to content

Commit

Permalink
Migrate to fly
Browse files Browse the repository at this point in the history
  • Loading branch information
leighmcculloch committed Nov 2, 2021
1 parent 8117a7a commit c416a46
Show file tree
Hide file tree
Showing 23 changed files with 139 additions and 321 deletions.
2 changes: 0 additions & 2 deletions .gitignore

This file was deleted.

23 changes: 23 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
FROM ruby:2.6.0 AS ruby
WORKDIR /website
COPY website ./
COPY looks.yml tags.yml ./data/
RUN make build

FROM golang AS gomod
WORKDIR /go/src/
COPY service/go.mod service/go.sum ./
RUN go mod download

FROM golang AS go
WORKDIR /go/src/
COPY service ./
COPY looks.yml tags.yml ./data/
COPY --from=gomod /go/pkg/mod /go/pkg/mod
COPY --from=ruby /website/build ./static
RUN CGO_ENABLED=0 go install

FROM scratch
COPY --from=go /go/bin/service /service
COPY --from=go /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt
ENTRYPOINT ["/service"]
15 changes: 7 additions & 8 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
deploy:
$(MAKE) build
$(MAKE) -C service deploy

clean:
$(MAKE) -C website clean
$(MAKE) -C service clean

build: clean
cp *.yml website/data/
cp *.yml service/data/
$(MAKE) -C website build
cp -r website/build service/static
docker build -t lookswtf .

run: build
docker run -it -p 8080:8080 lookswtf

deploy:
fly deploy --local-only --strategy bluegreen
5 changes: 0 additions & 5 deletions cloudbuild.yaml

This file was deleted.

33 changes: 33 additions & 0 deletions fly.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
app = "lookswtf"

kill_signal = "SIGINT"
kill_timeout = 5
processes = []

[env]

[[services]]
internal_port = 8080
processes = ["app"]
protocol = "tcp"

[services.concurrency]
hard_limit = 25
soft_limit = 20
type = "connections"

[[services.ports]]
handlers = ["http"]
port = 80

[[services.ports]]
handlers = ["tls", "http"]
port = 443

[[services.http_checks]]
interval = 10000
grace_period = "5s"
method = "get"
path = "/"
protocol = "http"
timeout = 2000
1 change: 0 additions & 1 deletion service/.gitignore

This file was deleted.

26 changes: 2 additions & 24 deletions service/Makefile
Original file line number Diff line number Diff line change
@@ -1,29 +1,7 @@
PORT ?= 8080

ifeq ($(VERSION),"")
ifeq ($(strip $(shell git status --porcelain)),)
export VERSION = `git show -s --format=%cd --date=format:'%Y%m%dt%H%M%S' HEAD`-`git rev-parse --short HEAD`
else
export VERSION = `date --utc +%Y%m%dt%H%M%S`-dev
endif
endif

clean:
rm -fR static

datastore:
gcloud beta emulators datastore start
rm -fR static/*

run:
$$(gcloud beta emulators datastore env-init) && \
cd scripts && \
go run local_setup.go && \
cd .. && \
go run .

deploy:
gcloud app deploy \
--project looks-wtf \
--version $(VERSION) \
--promote \
main/app.yaml
go run .
2 changes: 1 addition & 1 deletion service/action.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package service
package main

import (
"encoding/json"
Expand Down
6 changes: 3 additions & 3 deletions service/commandlook.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package service
package main

import (
"bytes"
Expand All @@ -9,11 +9,11 @@ import (
"net/http"
"strings"

"github.com/leighmcculloch/looks.wtf/service/shared/looks"
"github.com/leighmcculloch/looks.wtf/service/data"
"github.com/leighmcculloch/looks.wtf/service/shared/secrets"
)

func commandLookHandler(dataLooks map[string][]looks.Look, dataTags []string) func(w http.ResponseWriter, r *http.Request) error {
func commandLookHandler(dataLooks map[string][]data.Look, dataTags []string) func(w http.ResponseWriter, r *http.Request) error {
return func(w http.ResponseWriter, r *http.Request) error {
c := r.Context()
defer r.Body.Close()
Expand Down
6 changes: 3 additions & 3 deletions service/commandlooks.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package service
package main

import (
"encoding/json"
Expand All @@ -8,11 +8,11 @@ import (
"net/http"
"strings"

"github.com/leighmcculloch/looks.wtf/service/shared/looks"
"github.com/leighmcculloch/looks.wtf/service/data"
"github.com/leighmcculloch/looks.wtf/service/shared/secrets"
)

func commandLooksHandler(dataLooks map[string][]looks.Look, dataTags []string) func(w http.ResponseWriter, r *http.Request) error {
func commandLooksHandler(dataLooks map[string][]data.Look, dataTags []string) func(w http.ResponseWriter, r *http.Request) error {
return func(w http.ResponseWriter, r *http.Request) error {
c := r.Context()
defer r.Body.Close()
Expand Down
16 changes: 16 additions & 0 deletions service/data/data.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package data

import (
"bytes"
_ "embed"
)

//go:embed looks.yml
var looks []byte

var Looks = ParseLooks(bytes.NewReader(looks))

//go:embed tags.yml
var tags []byte

var Tags = ParseTags(bytes.NewReader(tags))
14 changes: 12 additions & 2 deletions service/shared/looks/looks.go → service/data/parse.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package looks
package data

import (
"io"
Expand All @@ -21,7 +21,7 @@ func ParseLooks(r io.Reader) map[string][]Look {
log.Fatal("Error unmarshaling looks yaml:", err)
}

var looksByTags = make(map[string][]Look)
looksByTags := make(map[string][]Look)
for _, l := range looks {
tags := strings.Split(l.Tags, " ")
for _, t := range tags {
Expand All @@ -37,3 +37,13 @@ func ParseLooks(r io.Reader) map[string][]Look {
}
return looksByTags
}

func ParseTags(r io.Reader) []string {
var tags []string
dec := yaml.NewDecoder(r)
err := dec.Decode(&tags)
if err != nil {
log.Fatal("Error unmarshaling tags yaml:", err)
}
return tags
}
13 changes: 3 additions & 10 deletions service/go.mod
Original file line number Diff line number Diff line change
@@ -1,12 +1,5 @@
module github.com/leighmcculloch/looks.wtf/service

require (
cloud.google.com/go v0.34.0
github.com/googleapis/gax-go v2.0.2+incompatible // indirect
go.opencensus.io v0.18.0 // indirect
google.golang.org/api v0.0.0-20181221000618-65a46cafb132 // indirect
google.golang.org/appengine v1.4.0 // indirect
google.golang.org/genproto v0.0.0-20181221175505-bd9b4fb69e2f // indirect
google.golang.org/grpc v1.17.0 // indirect
gopkg.in/yaml.v2 v2.2.2
)
go 1.17

require gopkg.in/yaml.v2 v2.2.2
61 changes: 0 additions & 61 deletions service/go.sum
Original file line number Diff line number Diff line change
@@ -1,65 +1,4 @@
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.34.0 h1:eOI3/cP2VTU6uZLDYAoic+eyzzB9YyGmJ7eIjl8rOPg=
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E=
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/googleapis/gax-go v2.0.2+incompatible h1:silFMLAnr330+NRuag/VjIGF7TLp/LBrV2CJKFLWEww=
github.com/googleapis/gax-go v2.0.2+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY=
github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8=
github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
go.opencensus.io v0.18.0 h1:Mk5rgZcggtbvtAun5aJzAtjKKN/t0R3jJPlWILlv938=
go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA=
golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225 h1:kNX+jCowfMYzvlSvJu5pQWEmyWFrBXJ3PBy10xKMXK8=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20181106065722-10aee1819953 h1:LuZIitY8waaxUfNIdtajyE/YzA/zyf0YxXG27VpLrkg=
golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be h1:vEDujvNQGv4jgYKudGeI/+DAX4Jffq6hpD55MmoEvKs=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/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-20180909124046-d0be0721c37e h1:o3PsSEY8E4eXWkXrIP9YJALUkVZqzHJT5DOasTyn8Vs=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
google.golang.org/api v0.0.0-20181221000618-65a46cafb132 h1:SLcC5l+3o5vwvXAbdm936WwLkHteUZpo1RULZD7YvQ4=
google.golang.org/api v0.0.0-20181221000618-65a46cafb132/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508=
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
google.golang.org/genproto v0.0.0-20181221175505-bd9b4fb69e2f h1:eT3B0O2ghdSPzjAOznr3oOLyN1HFeYUncYl7FRwg4VI=
google.golang.org/genproto v0.0.0-20181221175505-bd9b4fb69e2f/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg=
google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio=
google.golang.org/grpc v1.17.0 h1:TRJYBgMclJvGYn2rIMjj+h9KtMt5r1Ij7ODVRIZkwhk=
google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
58 changes: 29 additions & 29 deletions service/handler.go → service/main.go
Original file line number Diff line number Diff line change
@@ -1,48 +1,48 @@
package service
package main

import (
"io"
"embed"
"io/fs"
"log"
"net/http"
"os"

"github.com/leighmcculloch/looks.wtf/service/shared/looks"
"github.com/leighmcculloch/looks.wtf/service/data"
)

type appHandler func(http.ResponseWriter, *http.Request) error
func main() {
mux := http.NewServeMux()
mux.Handle("/oauth", appHandler(oauthHandler))
mux.Handle("/command/look", appHandler(commandLookHandler(data.Looks, data.Tags)))
mux.Handle("/command/looks", appHandler(commandLooksHandler(data.Looks, data.Tags)))
mux.Handle("/action", appHandler(actionHandler))
mux.Handle("/", http.FileServer(http.FS(staticSub)))

func (a appHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
if err := a(w, r); err != nil {
log.Printf("Error: %#v", err)
http.Error(w, "There was an error. Please try again.", 500)
port := os.Getenv("PORT")
if port == "" {
port = "8080"
}
addr := ":" + port
log.Printf("Listening on %s", addr)
log.Fatal(http.ListenAndServe(addr, mux))
}

var dataLooks = looks.ParseLooks(func() io.Reader {
f, err := os.Open("data/looks.yml")
if err != nil {
panic(err)
}
return f
}())
//go:embed static
var static embed.FS

var dataTags = looks.ParseTags(func() io.Reader {
f, err := os.Open("data/tags.yml")
var staticSub = func() fs.FS {
fs, err := fs.Sub(static, "static")
if err != nil {
panic(err)
}
return f
}())

var mux = func() http.Handler {
mux := http.NewServeMux()
mux.Handle("/oauth", appHandler(oauthHandler))
mux.Handle("/command/look", appHandler(commandLookHandler(dataLooks, dataTags)))
mux.Handle("/command/looks", appHandler(commandLooksHandler(dataLooks, dataTags)))
mux.Handle("/action", appHandler(actionHandler))
return mux
return fs
}()

func Handler(w http.ResponseWriter, r *http.Request) {
mux.ServeHTTP(w, r)
type appHandler func(http.ResponseWriter, *http.Request) error

func (a appHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
if err := a(w, r); err != nil {
log.Printf("Error: %#v", err)
http.Error(w, "There was an error. Please try again.", 500)
}
}
Loading

0 comments on commit c416a46

Please sign in to comment.