From 408d4118467866a871ac3e8838d0e66e3851abef Mon Sep 17 00:00:00 2001 From: ErickSkrauch Date: Thu, 15 Sep 2016 01:19:16 +0300 Subject: [PATCH 01/13] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=BE=D0=BD?= =?UTF-8?q?=D0=B0=D0=BB=20=D1=81=D0=BE=D1=85=D1=80=D0=B0=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20id=20=D0=BA=20username=20=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D0=B5=D0=BB=D1=8F=20+=20?= =?UTF-8?q?=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=20Delete=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?SkinItem?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/data/SkinItem.go | 65 ++++++++++++++++++++++++++++++++++++------ lib/routes/Skin.go | 2 +- lib/routes/Textures.go | 2 +- 3 files changed, 58 insertions(+), 11 deletions(-) diff --git a/lib/data/SkinItem.go b/lib/data/SkinItem.go index ee666e1..0aca44f 100644 --- a/lib/data/SkinItem.go +++ b/lib/data/SkinItem.go @@ -11,21 +11,55 @@ import ( ) type SkinItem struct { - UserId int `json:"userId"` - Username string `json:"username"` - SkinId int `json:"skinId"` - Url string `json:"url"` - Is1_8 bool `json:"is1_8"` - IsSlim bool `json:"isSlim"` - Hash string `json:"hash"` + UserId int `json:"userId"` + Username string `json:"username"` + SkinId int `json:"skinId"` + Url string `json:"url"` + Is1_8 bool `json:"is1_8"` + IsSlim bool `json:"isSlim"` + Hash string `json:"hash"` + oldUsername string } +const accountIdToUsernameKey string = "hash:username-to-account-id" + func (s *SkinItem) Save() { str, _ := json.Marshal(s) - services.RedisPool.Cmd("SET", tools.BuildKey(s.Username), str) + pool, _ := services.RedisPool.Get() + pool.Cmd("MULTI") + + // Если пользователь сменил ник, то мы должны удать его ключ + if (s.oldUsername != "" && s.oldUsername != s.Username) { + pool.Cmd("DEL", tools.BuildKey(s.oldUsername)) + } + + // Если это новая запись или если пользователь сменил ник, то обновляем значение в хэш-таблице + if (s.oldUsername != "" || s.oldUsername != s.Username) { + pool.Cmd("HSET", accountIdToUsernameKey, s.UserId, s.Username) + } + + pool.Cmd("SET", tools.BuildKey(s.Username), str) + + pool.Cmd("EXEC") + + s.oldUsername = s.Username } -func FindRecord(username string) (SkinItem, error) { +func (s *SkinItem) Delete() { + if (s.oldUsername == "") { + return; + } + + pool, _ := services.RedisPool.Get() + pool.Cmd("MULTI") + + pool.Cmd("DEL", tools.BuildKey(s.oldUsername)) + pool.Cmd("HDEL", accountIdToUsernameKey, s.UserId) + + pool.Cmd("EXEC") +} + +func FindByUsername(username string) (SkinItem, error) { var record SkinItem; response := services.RedisPool.Cmd("GET", tools.BuildKey(username)); if (response.IsType(redis.Nil)) { @@ -38,7 +72,20 @@ func FindRecord(username string) (SkinItem, error) { if (decodeErr != nil) { log.Println("Cannot decode record data") } + + record.oldUsername = record.Username } return record, err } + +func FindById(id int) (SkinItem, error) { + response := services.RedisPool.Cmd("HGET", accountIdToUsernameKey, id); + if (response.IsType(redis.Nil)) { + return SkinItem{}, DataNotFound{"unknown"} + } + + username, _ := response.Str() + + return FindByUsername(username) +} diff --git a/lib/routes/Skin.go b/lib/routes/Skin.go index 650fd37..baeaeb2 100644 --- a/lib/routes/Skin.go +++ b/lib/routes/Skin.go @@ -13,7 +13,7 @@ import ( func Skin(w http.ResponseWriter, r *http.Request) { username := tools.ParseUsername(mux.Vars(r)["username"]) log.Println("request skin for username " + username); - rec, err := data.FindRecord(username) + rec, err := data.FindByUsername(username) if (err != nil) { http.Redirect(w, r, "http://skins.minecraft.net/MinecraftSkins/" + username + ".png", 301) return diff --git a/lib/routes/Textures.go b/lib/routes/Textures.go index e298922..fa9f573 100644 --- a/lib/routes/Textures.go +++ b/lib/routes/Textures.go @@ -15,7 +15,7 @@ func Textures(w http.ResponseWriter, r *http.Request) { username := tools.ParseUsername(mux.Vars(r)["username"]) log.Println("request textures for username " + username) - rec, err := data.FindRecord(username) + rec, err := data.FindByUsername(username) if (err != nil || rec.SkinId == 0) { rec.Url = "http://skins.minecraft.net/MinecraftSkins/" + username + ".png" rec.Hash = string(tools.BuildNonElyTexturesHash(username)) From e8bd90d8d96ae2aef8133932a03990ad14ed1deb Mon Sep 17 00:00:00 2001 From: ErickSkrauch Date: Thu, 15 Sep 2016 01:22:57 +0300 Subject: [PATCH 02/13] =?UTF-8?q?=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8?= =?UTF-8?q?=D0=BE=D0=BD=D0=B0=D0=BB=20=D0=BF=D1=80=D0=BE=D1=81=D0=BB=D1=83?= =?UTF-8?q?=D1=88=D0=B8=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F=20RabbitMQ=20=D1=81?= =?UTF-8?q?=D0=BE=D0=BE=D0=B1=D1=89=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=B8=20?= =?UTF-8?q?=D1=81=D0=BE=D0=BE=D1=82=D0=B2=D0=B5=D1=82=D1=81=D1=82=D0=B2?= =?UTF-8?q?=D1=83=D1=8E=D1=89=D0=B8=D0=B5=20handlers=20=D0=B4=D0=BB=D1=8F?= =?UTF-8?q?=20=D1=81=D0=BE=D0=B1=D1=8B=D1=82=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker-compose.base.yml | 9 +++- docker-compose.dev.yml | 6 +++ docker-compose.prod.yml | 7 ++++ lib/services/services.go | 4 +- lib/worker/handlers.go | 52 +++++++++++++++++++++++ lib/worker/models.go | 17 ++++++++ lib/worker/worker.go | 91 ++++++++++++++++++++++++++++++++++++++++ minecraft-skinsystem.go | 21 +++++++++- 8 files changed, 203 insertions(+), 4 deletions(-) create mode 100644 lib/worker/handlers.go create mode 100644 lib/worker/models.go create mode 100644 lib/worker/worker.go diff --git a/docker-compose.base.yml b/docker-compose.base.yml index 4632d92..a7db8a2 100644 --- a/docker-compose.base.yml +++ b/docker-compose.base.yml @@ -2,9 +2,16 @@ version: '2' services: app: ports: - - "80:80" + - "81:80" redis: image: redis:3.0 volumes: - ./data/redis:/data + + rabbitmq: + image: rabbitmq:3.6 + environment: + RABBITMQ_DEFAULT_USER: "ely-skinsystem-app" + RABBITMQ_DEFAULT_PASS: "ely-skinsystem-app-password" + RABBITMQ_DEFAULT_VHOST: "/ely" diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index a1547cc..087a4bc 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -10,8 +10,14 @@ services: command: ["go", "run", "minecraft-skinsystem.go"] links: - redis + - rabbitmq redis: extends: file: docker-compose.base.yml service: redis + + rabbitmq: + extends: + file: docker-compose.base.yml + service: rabbitmq diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 5663db1..a995d39 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -7,6 +7,7 @@ services: image: erickskrauch/ely-by-skinsystem:master links: - redis + - rabbitmq restart: always redis: @@ -14,3 +15,9 @@ services: file: docker-compose.base.yml service: redis restart: always + + rabbitmq: + extends: + file: docker-compose.base.yml + service: rabbitmq + restart: always diff --git a/lib/services/services.go b/lib/services/services.go index f0f612d..5f4e996 100644 --- a/lib/services/services.go +++ b/lib/services/services.go @@ -2,9 +2,9 @@ package services import ( "github.com/mediocregopher/radix.v2/pool" - "github.com/gorilla/mux" + "github.com/streadway/amqp" ) var RedisPool *pool.Pool -var Router *mux.Router +var RabbitMQChannel *amqp.Channel diff --git a/lib/worker/handlers.go b/lib/worker/handlers.go new file mode 100644 index 0000000..7986490 --- /dev/null +++ b/lib/worker/handlers.go @@ -0,0 +1,52 @@ +package worker + +import ( + "elyby/minecraft-skinsystem/lib/data" + "log" +) + +func handleChangeUsername(model usernameChanged) (bool) { + if (model.OldUsername == "") { + record := data.SkinItem{ + UserId: model.AccountId, + Username: model.NewUsername, + } + + record.Save() + + return true + } + + record, err := data.FindByUsername(model.OldUsername) + if (err != nil) { + log.Println("Exit by not found record") + // TODO: я не уверен, что это валидное поведение + // Суть в том, что здесь может возникнуть ошибка в том случае, если записи в базе нету + // а значит его нужно, как минимум, зарегистрировать + return true + } + + record.Username = model.NewUsername + record.Save() + + log.Println("all saved!") + + return true +} + +func handleSkinChanged(model skinChanged) (bool) { + record, err := data.FindById(model.AccountId) + if (err != nil) { + return true + } + + record.SkinId = model.SkinId + record.Hash = model.Hash + record.Is1_8 = model.Is1_8 + record.IsSlim = model.IsSlim + record.Url = model.Url + + record.Save() + + return true +} diff --git a/lib/worker/models.go b/lib/worker/models.go new file mode 100644 index 0000000..eede2c2 --- /dev/null +++ b/lib/worker/models.go @@ -0,0 +1,17 @@ +package worker + +type usernameChanged struct { + AccountId int `json:"accountId"` + OldUsername string `json:"oldUsername"` + NewUsername string `json:"newUsername"` +} + +type skinChanged struct { + AccountId int `json:"userId"` + SkinId int `json:"skinId"` + OldSkinId int `json:"oldSkinId"` + Hash string `json:"hash"` + Is1_8 bool `json:"is1_8"` + IsSlim bool `json:"isSlim"` + Url string `json:"url"` +} diff --git a/lib/worker/worker.go b/lib/worker/worker.go new file mode 100644 index 0000000..ba27151 --- /dev/null +++ b/lib/worker/worker.go @@ -0,0 +1,91 @@ +package worker + +import ( + "log" + + "encoding/json" + + "elyby/minecraft-skinsystem/lib/services" +) + +const exchangeName string = "events" +const queueName string = "skinsystem-accounts-events" + +func Listen() { + var err error + ch := services.RabbitMQChannel + + err = ch.ExchangeDeclare( + exchangeName, // name + "topic", // type + true, // durable + false, // auto-deleted + false, // internal + false, // no-wait + nil, // arguments + ) + failOnError(err, "Failed to declare an exchange") + + _, err = ch.QueueDeclare( + queueName, // name + true, // durable + false, // delete when usused + false, // exclusive + false, // no-wait + nil, // arguments + ) + failOnError(err, "Failed to declare a queue") + + err = ch.QueueBind( + queueName, // queue name + "accounts.#", // routing key + exchangeName, // exchange + false, + nil, + ) + failOnError(err, "Failed to bind a queue") + + msgs, err := ch.Consume( + queueName, // queue + "", // consumer + false, // auto-ack + false, // exclusive + false, // no-local + false, // no-wait + nil, // args + ) + failOnError(err, "Failed to register a consumer") + + forever := make(chan bool) + + go func() { + for d := range msgs { + log.Println("Incoming message with routing key " + d.RoutingKey) + var result bool = true; + switch d.RoutingKey { + case "accounts.username-changed": + var model usernameChanged + json.Unmarshal(d.Body, &model) + result = handleChangeUsername(model) + case "accounts.skin-changed": + var model skinChanged + json.Unmarshal(d.Body, &model) + result = handleSkinChanged(model) + } + + if (result) { + d.Ack(false) + } else { + d.Reject(true) + } + } + }() + + <-forever +} + +func failOnError(err error, msg string) { + if err != nil { + log.Fatalf("%s: %s", msg, err) + } +} diff --git a/minecraft-skinsystem.go b/minecraft-skinsystem.go index 49df237..5d86c59 100644 --- a/minecraft-skinsystem.go +++ b/minecraft-skinsystem.go @@ -12,9 +12,13 @@ import ( "elyby/minecraft-skinsystem/lib/routes" "elyby/minecraft-skinsystem/lib/services" //"github.com/mediocregopher/radix.v2/redis" + + "github.com/streadway/amqp" + "elyby/minecraft-skinsystem/lib/worker" ) const redisString string = "redis:6379" +const rabbitmqString string = "amqp://ely-skinsystem-app:ely-skinsystem-app-password@rabbitmq:5672/%2fely" func main() { log.Println("Starting...") @@ -28,6 +32,19 @@ func main() { } log.Println("Connected to redis") + log.Println("Connecting to rabbitmq") + // TODO: rabbitmq становится доступен не сразу. Нужно дождаться, пока он станет доступен, периодически повторяя запросы + rabbitConnection, rabbitmqErr := amqp.Dial(rabbitmqString) + if rabbitmqErr != nil { + log.Fatalf("%s", rabbitmqErr) + } + log.Println("Connected to rabbitmq. Trying to open a channel") + rabbitChannel, rabbitmqErr := rabbitConnection.Channel() + if rabbitmqErr != nil { + log.Fatalf("%s", rabbitmqErr) + } + log.Println("Connected to rabbitmq channel") + router := mux.NewRouter().StrictSlash(true) router.HandleFunc("/skins/{username}", routes.Skin).Methods("GET").Name("skins") router.HandleFunc("/cloaks/{username}", routes.Cape).Methods("GET").Name("cloaks") @@ -43,7 +60,7 @@ func main() { apiRouter.HandleFunc("/user/{username}/skin", routes.SetSkin).Methods("POST") services.RedisPool = redisPool - services.Router = router + services.RabbitMQChannel = rabbitChannel /*go func() { for { @@ -63,6 +80,8 @@ func main() { } }()*/ + go worker.Listen() + log.Println("Started"); log.Fatal(http.ListenAndServe(":80", router)) } From 3e3ba296d548d2ee9953a7adc0487ab7181604b7 Mon Sep 17 00:00:00 2001 From: ErickSkrauch Date: Thu, 15 Sep 2016 01:29:08 +0300 Subject: [PATCH 03/13] =?UTF-8?q?=D0=91=D0=B8=D0=BD=D0=B4=D0=B8=D0=BC?= =?UTF-8?q?=D1=81=D1=8F=20=D1=82=D0=BE=D0=BB=D1=8C=D0=BA=D0=BE=20=D0=BA=20?= =?UTF-8?q?=D1=82=D0=BE=D0=BC=D1=83,=20=D1=87=D1=82=D0=BE=20=D0=BD=D0=B0?= =?UTF-8?q?=D0=BC=20=D0=B8=D0=BD=D1=82=D0=B5=D1=80=D0=B5=D1=81=D0=BD=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/worker/worker.go | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/lib/worker/worker.go b/lib/worker/worker.go index ba27151..27a3407 100644 --- a/lib/worker/worker.go +++ b/lib/worker/worker.go @@ -36,13 +36,10 @@ func Listen() { ) failOnError(err, "Failed to declare a queue") - err = ch.QueueBind( - queueName, // queue name - "accounts.#", // routing key - exchangeName, // exchange - false, - nil, - ) + err = ch.QueueBind(queueName, "accounts.username-changed", exchangeName, false, nil) + failOnError(err, "Failed to bind a queue") + + err = ch.QueueBind(queueName, "accounts.skin-changed", exchangeName, false, nil) failOnError(err, "Failed to bind a queue") msgs, err := ch.Consume( From 2477433dc9de81f7980cccf789333e277805c79d Mon Sep 17 00:00:00 2001 From: ErickSkrauch Date: Fri, 16 Sep 2016 19:35:58 +0300 Subject: [PATCH 04/13] =?UTF-8?q?=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=D0=BE=20=D0=B2=D0=BE=D1=81=D1=81=D1=82?= =?UTF-8?q?=D0=B0=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=81?= =?UTF-8?q?=D0=BE=D0=B5=D0=B4=D0=B8=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=81?= =?UTF-8?q?=20redis?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- minecraft-skinsystem.go | 46 ++++++++++++++++++++++------------------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/minecraft-skinsystem.go b/minecraft-skinsystem.go index 5d86c59..513aa30 100644 --- a/minecraft-skinsystem.go +++ b/minecraft-skinsystem.go @@ -3,21 +3,21 @@ package main import ( "log" "runtime" - //"time" + "time" "net/http" "github.com/gorilla/mux" + "github.com/streadway/amqp" "github.com/mediocregopher/radix.v2/pool" "elyby/minecraft-skinsystem/lib/routes" "elyby/minecraft-skinsystem/lib/services" - //"github.com/mediocregopher/radix.v2/redis" - - "github.com/streadway/amqp" "elyby/minecraft-skinsystem/lib/worker" ) const redisString string = "redis:6379" +const redisPoolSize int = 10 + const rabbitmqString string = "amqp://ely-skinsystem-app:ely-skinsystem-app-password@rabbitmq:5672/%2fely" func main() { @@ -26,8 +26,8 @@ func main() { runtime.GOMAXPROCS(runtime.NumCPU()) log.Println("Connecting to redis") - redisPool, redisErr := pool.New("tcp", redisString, 10) - if redisErr != nil { + redisPool, redisErr := pool.New("tcp", redisString, redisPoolSize) + if (redisErr != nil) { log.Fatal("Redis unavailable") } log.Println("Connected to redis") @@ -35,12 +35,12 @@ func main() { log.Println("Connecting to rabbitmq") // TODO: rabbitmq становится доступен не сразу. Нужно дождаться, пока он станет доступен, периодически повторяя запросы rabbitConnection, rabbitmqErr := amqp.Dial(rabbitmqString) - if rabbitmqErr != nil { + if (rabbitmqErr != nil) { log.Fatalf("%s", rabbitmqErr) } log.Println("Connected to rabbitmq. Trying to open a channel") rabbitChannel, rabbitmqErr := rabbitConnection.Channel() - if rabbitmqErr != nil { + if (rabbitmqErr != nil) { log.Fatalf("%s", rabbitmqErr) } log.Println("Connected to rabbitmq channel") @@ -62,23 +62,27 @@ func main() { services.RedisPool = redisPool services.RabbitMQChannel = rabbitChannel - /*go func() { + go func() { + period := 5 for { - time.Sleep(5 * time.Second) + time.Sleep(time.Duration(period) * time.Second) - resp := services.Redis.Cmd("PING") - if (resp.Err != nil) { - log.Println("Redis not pinged. Try to reconnect") - newClient, redisErr := redis.Dial("tcp", redisString) - if (redisErr != nil) { - log.Println("Cannot reconnect to redis") - } else { - services.Redis = newClient - log.Println("Reconnected") - } + resp := services.RedisPool.Cmd("PING") + if (resp.Err == nil) { + // Если редис успешно пинганулся, значит всё хорошо + continue + } + + log.Println("Redis not pinged. Try to reconnect") + newPool, redisErr := pool.New("tcp", redisString, redisPoolSize) + if (redisErr != nil) { + log.Printf("Cannot reconnect to redis, waiting %d seconds\n", period) + } else { + services.RedisPool = newPool + log.Println("Reconnected") } } - }()*/ + }() go worker.Listen() From e03832b4e8f2596b4ad93179e4371f1421341f95 Mon Sep 17 00:00:00 2001 From: ErickSkrauch Date: Wed, 21 Sep 2016 20:52:28 +0300 Subject: [PATCH 05/13] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D1=80=D0=BE=D1=83=D1=82=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D0=B8=20=D1=80=D0=B5?= =?UTF-8?q?=D0=BD=D0=B4=D0=B5=D1=80=D0=B0=20=D0=BB=D0=B8=D1=86=D0=B0=20?= =?UTF-8?q?=D1=81=D0=BA=D0=B8=D0=BD=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/routes/Face.go | 31 +++++++++++++++++++++++++++++++ minecraft-skinsystem.go | 2 ++ 2 files changed, 33 insertions(+) create mode 100644 lib/routes/Face.go diff --git a/lib/routes/Face.go b/lib/routes/Face.go new file mode 100644 index 0000000..7b99996 --- /dev/null +++ b/lib/routes/Face.go @@ -0,0 +1,31 @@ +package routes + +import ( + "log" + "net/http" + + "github.com/gorilla/mux" + + "elyby/minecraft-skinsystem/lib/tools" + "elyby/minecraft-skinsystem/lib/data" +) + +const defaultHash = "default" + +func Face(w http.ResponseWriter, r *http.Request) { + username := tools.ParseUsername(mux.Vars(r)["username"]) + log.Println("request skin for username " + username); + rec, err := data.FindByUsername(username) + var hash string + if (err != nil || rec.SkinId == 0) { + hash = defaultHash; + } else { + hash = rec.Hash + } + + http.Redirect(w, r, tools.BuildElyUrl(buildFaceUrl(hash)), 301); +} + +func buildFaceUrl(hash string) string { + return "/minecfaft/skin_buffer/faces/" + hash + ".png" +} diff --git a/minecraft-skinsystem.go b/minecraft-skinsystem.go index 513aa30..1f99e2a 100644 --- a/minecraft-skinsystem.go +++ b/minecraft-skinsystem.go @@ -49,6 +49,8 @@ func main() { router.HandleFunc("/skins/{username}", routes.Skin).Methods("GET").Name("skins") router.HandleFunc("/cloaks/{username}", routes.Cape).Methods("GET").Name("cloaks") router.HandleFunc("/textures/{username}", routes.Textures).Methods("GET").Name("textures") + router.HandleFunc("/skins/{username}/face", routes.Face).Methods("GET").Name("faces") + router.HandleFunc("/skins/{username}/face.png", routes.Face).Methods("GET").Name("faces") // Legacy router.HandleFunc("/minecraft.php", routes.MinecraftPHP).Methods("GET") router.HandleFunc("/skins/", routes.SkinGET).Methods("GET") From 4bcd0495edb764906893bf9835dab076048cc4ea Mon Sep 17 00:00:00 2001 From: ErickSkrauch Date: Wed, 21 Sep 2016 20:52:54 +0300 Subject: [PATCH 06/13] =?UTF-8?q?=D0=9E=D1=82=D0=BA=D0=B0=D1=82=20=D0=B8?= =?UTF-8?q?=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B0=D0=BA?= =?UTF-8?q?=D1=82=D0=B8=D0=B2=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=BF=D0=BE=D1=80?= =?UTF-8?q?=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker-compose.base.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.base.yml b/docker-compose.base.yml index a7db8a2..9c20795 100644 --- a/docker-compose.base.yml +++ b/docker-compose.base.yml @@ -2,7 +2,7 @@ version: '2' services: app: ports: - - "81:80" + - "80:80" redis: image: redis:3.0 From 98b787fa9985e9dad9985224ab0409916dacfd53 Mon Sep 17 00:00:00 2001 From: ErickSkrauch Date: Wed, 21 Sep 2016 21:44:52 +0300 Subject: [PATCH 07/13] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=BE=D0=BD?= =?UTF-8?q?=D0=B0=D0=BB=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B8?= =?UTF-8?q?=20=D1=81=D1=83=D1=89=D0=B5=D1=81=D1=82=D0=B2=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D1=81=D0=BA=D0=B8=D0=BD=D0=B0=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D1=80=D0=BE=D1=83=D1=82=D0=B0=20/cloaks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .dockerignore | 2 ++ Dockerfile | 1 + data/capes/.gitignore | 2 ++ lib/routes/Cape.go | 16 +++++++++++++--- lib/services/services.go | 2 ++ minecraft-skinsystem.go | 4 ++++ 6 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 .dockerignore create mode 100644 data/capes/.gitignore diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..dd69578 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,2 @@ +# Игнорим данные, т.к. они не нужны для внутреннего содержимого этого контейнера +data diff --git a/Dockerfile b/Dockerfile index c72d9d7..7e6d16d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,7 @@ FROM golang:1.7 RUN mkdir -p /go/src/elyby/minecraft-skinsystem \ + /go/src/elyby/minecraft-skinsystem/data/capes \ && ln -s /go/src/elyby/minecraft-skinsystem /go/src/app WORKDIR /go/src/app diff --git a/data/capes/.gitignore b/data/capes/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/data/capes/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/lib/routes/Cape.go b/lib/routes/Cape.go index 20020b6..c38b087 100644 --- a/lib/routes/Cape.go +++ b/lib/routes/Cape.go @@ -1,18 +1,28 @@ package routes import ( + "os" + "io" "log" + "strings" "net/http" "github.com/gorilla/mux" "elyby/minecraft-skinsystem/lib/tools" + "elyby/minecraft-skinsystem/lib/services" ) -func Cape(w http.ResponseWriter, r *http.Request) { - username := tools.ParseUsername(mux.Vars(r)["username"]) +func Cape(response http.ResponseWriter, request *http.Request) { + username := tools.ParseUsername(mux.Vars(request)["username"]) log.Println("request cape for username " + username) - http.Redirect(w, r, "http://skins.minecraft.net/MinecraftCloaks/" + username + ".png", 301) + file, err := os.Open(services.RootFolder + "/data/capes/" + strings.ToLower(username) + ".png") + if (err != nil) { + http.Redirect(response, request, "http://skins.minecraft.net/MinecraftCloaks/" + username + ".png", 301) + } + + request.Header.Set("Content-Type", "image/png") + io.Copy(response, file) } func CapeGET(w http.ResponseWriter, r *http.Request) { diff --git a/lib/services/services.go b/lib/services/services.go index 5f4e996..6f7241b 100644 --- a/lib/services/services.go +++ b/lib/services/services.go @@ -8,3 +8,5 @@ import ( var RedisPool *pool.Pool var RabbitMQChannel *amqp.Channel + +var RootFolder string diff --git a/minecraft-skinsystem.go b/minecraft-skinsystem.go index 1f99e2a..3527e36 100644 --- a/minecraft-skinsystem.go +++ b/minecraft-skinsystem.go @@ -13,6 +13,7 @@ import ( "elyby/minecraft-skinsystem/lib/routes" "elyby/minecraft-skinsystem/lib/services" "elyby/minecraft-skinsystem/lib/worker" + "path/filepath" ) const redisString string = "redis:6379" @@ -64,6 +65,9 @@ func main() { services.RedisPool = redisPool services.RabbitMQChannel = rabbitChannel + _, file, _, _ := runtime.Caller(0) + services.RootFolder = filepath.Dir(file) + go func() { period := 5 for { From a9acfb954ff639c1ffee1ab4999872696797d8b5 Mon Sep 17 00:00:00 2001 From: ErickSkrauch Date: Thu, 22 Sep 2016 19:30:41 +0300 Subject: [PATCH 08/13] =?UTF-8?q?=D0=91=D0=B8=D0=BD=D0=B4=D0=B8=D0=BC=20?= =?UTF-8?q?=D0=BF=D0=B0=D0=BF=D0=BA=D1=83=20=D1=81=20=D0=BF=D0=BB=D0=B0?= =?UTF-8?q?=D1=89=D0=B0=D0=BC=D0=B8=20=D0=BA=20=D0=BA=D0=BE=D0=BD=D1=82?= =?UTF-8?q?=D0=B5=D0=B9=D0=BD=D0=B5=D1=80=D1=83=20=D1=81=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B8=D0=BB=D0=BE=D0=B6=D0=B5=D0=BD=D0=B8=D0=B5=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker-compose.base.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docker-compose.base.yml b/docker-compose.base.yml index 9c20795..2608599 100644 --- a/docker-compose.base.yml +++ b/docker-compose.base.yml @@ -3,6 +3,8 @@ services: app: ports: - "80:80" + volumes: + - ./data/capes:/go/src/app/data/capes redis: image: redis:3.0 From 9467911025a7a60caa95b6f4a642cee55160e232 Mon Sep 17 00:00:00 2001 From: ErickSkrauch Date: Thu, 22 Sep 2016 19:32:00 +0300 Subject: [PATCH 09/13] =?UTF-8?q?=D0=97=D0=B0=D0=B3=D1=80=D1=83=D0=B7?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=BF=D0=BB=D0=B0=D1=89=D0=B0=20=D0=B2=D1=8B?= =?UTF-8?q?=D0=BD=D0=B5=D1=81=D0=B5=D0=BD=D0=B0=20=D0=B2=20=D0=BE=D1=82?= =?UTF-8?q?=D0=B4=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9=20=D0=BC=D0=B5=D1=82?= =?UTF-8?q?=D0=BE=D0=B4,=20=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=BE=20=D0=BE=D1=82=D0=BE=D0=B1=D1=80=D0=B0?= =?UTF-8?q?=D0=B6=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=81=D1=81=D1=8B=D0=BB=D0=BA?= =?UTF-8?q?=D0=B8=20=D0=BD=D0=B0=20=D0=BF=D0=BB=D0=B0=D1=89=20=D0=B2=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=BF=D1=80=D0=BE=D1=81=D0=B0=D1=85=20=D0=BD=D0=B0?= =?UTF-8?q?=20=D1=82=D0=B5=D0=BA=D1=81=D1=82=D1=83=D1=80=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/data/CapeItem.go | 43 ++++++++++++++++++++++++++++++++++++ lib/data/DataNotFound.go | 11 --------- lib/data/SkinItem.go | 19 +++++++++++----- lib/data/TexturesResponse.go | 6 +++++ lib/routes/Cape.go | 8 +++---- lib/routes/Face.go | 2 +- lib/routes/Skin.go | 2 +- lib/routes/Textures.go | 21 +++++++++++++++++- lib/services/services.go | 3 +++ lib/worker/handlers.go | 4 ++-- minecraft-skinsystem.go | 1 + 11 files changed, 94 insertions(+), 26 deletions(-) create mode 100644 lib/data/CapeItem.go delete mode 100644 lib/data/DataNotFound.go diff --git a/lib/data/CapeItem.go b/lib/data/CapeItem.go new file mode 100644 index 0000000..8f03ad8 --- /dev/null +++ b/lib/data/CapeItem.go @@ -0,0 +1,43 @@ +package data + +import ( + "io" + "os" + "fmt" + "strings" + "crypto/md5" + "encoding/hex" + + "elyby/minecraft-skinsystem/lib/services" +) + +type CapeItem struct { + File *os.File +} + +func FindCapeByUsername(username string) (CapeItem, error) { + var record CapeItem + file, err := os.Open(services.RootFolder + "/data/capes/" + strings.ToLower(username) + ".png") + if (err != nil) { + return record, CapeNotFound{username} + } + + record.File = file + + return record, err +} + +func (cape *CapeItem) CalculateHash() string { + hasher := md5.New() + io.Copy(hasher, cape.File) + + return hex.EncodeToString(hasher.Sum(nil)) +} + +type CapeNotFound struct { + Who string +} + +func (e CapeNotFound) Error() string { + return fmt.Sprintf("Cape file not found. Required username \"%v\"", e.Who) +} diff --git a/lib/data/DataNotFound.go b/lib/data/DataNotFound.go deleted file mode 100644 index 0f5e5c2..0000000 --- a/lib/data/DataNotFound.go +++ /dev/null @@ -1,11 +0,0 @@ -package data - -import "fmt" - -type DataNotFound struct { - Who string -} - -func (e DataNotFound) Error() string { - return fmt.Sprintf("Skin data not found. Required username \"%v\"", e.Who) -} diff --git a/lib/data/SkinItem.go b/lib/data/SkinItem.go index 0aca44f..8ad55d7 100644 --- a/lib/data/SkinItem.go +++ b/lib/data/SkinItem.go @@ -2,6 +2,7 @@ package data import ( "log" + "fmt" "encoding/json" "elyby/minecraft-skinsystem/lib/services" @@ -59,11 +60,11 @@ func (s *SkinItem) Delete() { pool.Cmd("EXEC") } -func FindByUsername(username string) (SkinItem, error) { +func FindSkinByUsername(username string) (SkinItem, error) { var record SkinItem; response := services.RedisPool.Cmd("GET", tools.BuildKey(username)); if (response.IsType(redis.Nil)) { - return record, DataNotFound{username} + return record, SkinNotFound{username} } result, err := response.Str() @@ -79,13 +80,21 @@ func FindByUsername(username string) (SkinItem, error) { return record, err } -func FindById(id int) (SkinItem, error) { +func FindSkinById(id int) (SkinItem, error) { response := services.RedisPool.Cmd("HGET", accountIdToUsernameKey, id); if (response.IsType(redis.Nil)) { - return SkinItem{}, DataNotFound{"unknown"} + return SkinItem{}, SkinNotFound{"unknown"} } username, _ := response.Str() - return FindByUsername(username) + return FindSkinByUsername(username) +} + +type SkinNotFound struct { + Who string +} + +func (e SkinNotFound) Error() string { + return fmt.Sprintf("Skin data not found. Required username \"%v\"", e.Who) } diff --git a/lib/data/TexturesResponse.go b/lib/data/TexturesResponse.go index 4716a21..9d2d962 100644 --- a/lib/data/TexturesResponse.go +++ b/lib/data/TexturesResponse.go @@ -2,6 +2,7 @@ package data type TexturesResponse struct { Skin *Skin `json:"SKIN"` + Cape *Cape `json:"CAPE,omitempty"` } type Skin struct { @@ -13,3 +14,8 @@ type Skin struct { type SkinMetadata struct { Model string `json:"model"` } + +type Cape struct { + Url string `json:"url"` + Hash string `json:"hash"` +} diff --git a/lib/routes/Cape.go b/lib/routes/Cape.go index c38b087..9d87832 100644 --- a/lib/routes/Cape.go +++ b/lib/routes/Cape.go @@ -1,28 +1,26 @@ package routes import ( - "os" "io" "log" - "strings" "net/http" "github.com/gorilla/mux" "elyby/minecraft-skinsystem/lib/tools" - "elyby/minecraft-skinsystem/lib/services" + "elyby/minecraft-skinsystem/lib/data" ) func Cape(response http.ResponseWriter, request *http.Request) { username := tools.ParseUsername(mux.Vars(request)["username"]) log.Println("request cape for username " + username) - file, err := os.Open(services.RootFolder + "/data/capes/" + strings.ToLower(username) + ".png") + rec, err := data.FindCapeByUsername(username) if (err != nil) { http.Redirect(response, request, "http://skins.minecraft.net/MinecraftCloaks/" + username + ".png", 301) } request.Header.Set("Content-Type", "image/png") - io.Copy(response, file) + io.Copy(response, rec.File) } func CapeGET(w http.ResponseWriter, r *http.Request) { diff --git a/lib/routes/Face.go b/lib/routes/Face.go index 7b99996..8e19018 100644 --- a/lib/routes/Face.go +++ b/lib/routes/Face.go @@ -15,7 +15,7 @@ const defaultHash = "default" func Face(w http.ResponseWriter, r *http.Request) { username := tools.ParseUsername(mux.Vars(r)["username"]) log.Println("request skin for username " + username); - rec, err := data.FindByUsername(username) + rec, err := data.FindSkinByUsername(username) var hash string if (err != nil || rec.SkinId == 0) { hash = defaultHash; diff --git a/lib/routes/Skin.go b/lib/routes/Skin.go index baeaeb2..97a1e5c 100644 --- a/lib/routes/Skin.go +++ b/lib/routes/Skin.go @@ -13,7 +13,7 @@ import ( func Skin(w http.ResponseWriter, r *http.Request) { username := tools.ParseUsername(mux.Vars(r)["username"]) log.Println("request skin for username " + username); - rec, err := data.FindByUsername(username) + rec, err := data.FindSkinByUsername(username) if (err != nil) { http.Redirect(w, r, "http://skins.minecraft.net/MinecraftSkins/" + username + ".png", 301) return diff --git a/lib/routes/Textures.go b/lib/routes/Textures.go index fa9f573..b1cd1ae 100644 --- a/lib/routes/Textures.go +++ b/lib/routes/Textures.go @@ -9,13 +9,14 @@ import ( "elyby/minecraft-skinsystem/lib/data" "elyby/minecraft-skinsystem/lib/tools" + "elyby/minecraft-skinsystem/lib/services" ) func Textures(w http.ResponseWriter, r *http.Request) { username := tools.ParseUsername(mux.Vars(r)["username"]) log.Println("request textures for username " + username) - rec, err := data.FindByUsername(username) + rec, err := data.FindSkinByUsername(username) if (err != nil || rec.SkinId == 0) { rec.Url = "http://skins.minecraft.net/MinecraftSkins/" + username + ".png" rec.Hash = string(tools.BuildNonElyTexturesHash(username)) @@ -36,6 +37,24 @@ func Textures(w http.ResponseWriter, r *http.Request) { } } + capeRec, err := data.FindCapeByUsername(username) + if (err == nil) { + capeUrl, err := services.Router.Get("cloaks").URL("username", username) + if (err != nil) { + log.Println(err.Error()) + } + + var scheme string = "http://"; + if (r.TLS != nil) { + scheme = "https://" + } + + textures.Cape = &data.Cape{ + Url: scheme + r.Host + capeUrl.String(), + Hash: capeRec.CalculateHash(), + } + } + response,_ := json.Marshal(textures) w.Header().Set("Content-Type", "application/json") w.Write(response) diff --git a/lib/services/services.go b/lib/services/services.go index 6f7241b..e4ce93d 100644 --- a/lib/services/services.go +++ b/lib/services/services.go @@ -3,8 +3,11 @@ package services import ( "github.com/mediocregopher/radix.v2/pool" "github.com/streadway/amqp" + "github.com/gorilla/mux" ) +var Router *mux.Router + var RedisPool *pool.Pool var RabbitMQChannel *amqp.Channel diff --git a/lib/worker/handlers.go b/lib/worker/handlers.go index 7986490..36186f8 100644 --- a/lib/worker/handlers.go +++ b/lib/worker/handlers.go @@ -17,7 +17,7 @@ func handleChangeUsername(model usernameChanged) (bool) { return true } - record, err := data.FindByUsername(model.OldUsername) + record, err := data.FindSkinByUsername(model.OldUsername) if (err != nil) { log.Println("Exit by not found record") // TODO: я не уверен, что это валидное поведение @@ -35,7 +35,7 @@ func handleChangeUsername(model usernameChanged) (bool) { } func handleSkinChanged(model skinChanged) (bool) { - record, err := data.FindById(model.AccountId) + record, err := data.FindSkinById(model.AccountId) if (err != nil) { return true } diff --git a/minecraft-skinsystem.go b/minecraft-skinsystem.go index 3527e36..2df5aa8 100644 --- a/minecraft-skinsystem.go +++ b/minecraft-skinsystem.go @@ -62,6 +62,7 @@ func main() { apiRouter := router.PathPrefix("/api").Subrouter() apiRouter.HandleFunc("/user/{username}/skin", routes.SetSkin).Methods("POST") + services.Router = router services.RedisPool = redisPool services.RabbitMQChannel = rabbitChannel From e8a7008e11ecaea577500399878d1df7d0f901fd Mon Sep 17 00:00:00 2001 From: ErickSkrauch Date: Thu, 6 Oct 2016 00:38:53 +0300 Subject: [PATCH 10/13] =?UTF-8?q?=D0=A0=D0=B5=D0=BE=D1=80=D0=B3=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BA=D0=BE=D0=BD?= =?UTF-8?q?=D1=82=D0=B5=D0=B9=D0=BD=D0=B5=D1=80=D0=BE=D0=B2=20=D0=B2=20com?= =?UTF-8?q?pose=20=D1=84=D0=B0=D0=B9=D0=BB=D0=B0=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker-compose.base.yml | 6 +----- docker-compose.dev.yml | 6 +++--- docker-compose.prod.yml | 7 +++---- 3 files changed, 7 insertions(+), 12 deletions(-) diff --git a/docker-compose.base.yml b/docker-compose.base.yml index 9c20795..d8df429 100644 --- a/docker-compose.base.yml +++ b/docker-compose.base.yml @@ -1,11 +1,7 @@ version: '2' services: - app: - ports: - - "80:80" - redis: - image: redis:3.0 + image: redis:3.0-alpine volumes: - ./data/redis:/data diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index 087a4bc..7022863 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -1,10 +1,10 @@ version: '2' services: app: - extends: - file: docker-compose.base.yml - service: app build: . + image: registry.gitlab.com/elyby/skinsystem:latest + ports: + - "80:80" volumes: - ./:/go/src/app command: ["go", "run", "minecraft-skinsystem.go"] diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index a995d39..30675b6 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -1,10 +1,9 @@ version: '2' services: app: - extends: - file: docker-compose.base.yml - service: app - image: erickskrauch/ely-by-skinsystem:master + image: registry.gitlab.com/elyby/skinsystem:latest + ports: + - "80:80" links: - redis - rabbitmq From aab7ba95173550e5bd02667d73103c0954677252 Mon Sep 17 00:00:00 2001 From: ErickSkrauch Date: Tue, 11 Oct 2016 18:01:33 +0300 Subject: [PATCH 11/13] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D0=B3=D1=80?= =?UTF-8?q?=D1=83=D0=BF=D0=BF=D0=B8=D1=80=D0=BE=D0=B2=D0=BA=D0=B8=20=D0=B8?= =?UTF-8?q?=D0=BC=D0=BF=D0=BE=D1=80=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- minecraft-skinsystem.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/minecraft-skinsystem.go b/minecraft-skinsystem.go index 2df5aa8..ff89ffa 100644 --- a/minecraft-skinsystem.go +++ b/minecraft-skinsystem.go @@ -5,6 +5,7 @@ import ( "runtime" "time" "net/http" + "path/filepath" "github.com/gorilla/mux" "github.com/streadway/amqp" @@ -13,7 +14,6 @@ import ( "elyby/minecraft-skinsystem/lib/routes" "elyby/minecraft-skinsystem/lib/services" "elyby/minecraft-skinsystem/lib/worker" - "path/filepath" ) const redisString string = "redis:6379" From 9c4930a0bef4c248957a3d8a518304179a0ab69e Mon Sep 17 00:00:00 2001 From: ErickSkrauch Date: Tue, 11 Oct 2016 18:20:17 +0300 Subject: [PATCH 12/13] =?UTF-8?q?=D0=98=D1=81=D0=BF=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D0=B7=D1=83=D0=B5=D0=BC=20alpine=20image?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 7e6d16d..3ec24c7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,6 @@ -FROM golang:1.7 +FROM golang:1.7-alpine + +RUN apk add --no-cache git RUN mkdir -p /go/src/elyby/minecraft-skinsystem \ /go/src/elyby/minecraft-skinsystem/data/capes \ From e05c5f200cdc4e7ddb01dc068b5f60b1fcbdc145 Mon Sep 17 00:00:00 2001 From: ErickSkrauch Date: Wed, 12 Oct 2016 20:43:10 +0300 Subject: [PATCH 13/13] =?UTF-8?q?=D0=9F=D0=BE=D0=B4=D0=B4=D0=B5=D1=80?= =?UTF-8?q?=D0=B6=D0=BA=D0=B0=20env=20=D0=B4=D0=BB=D1=8F=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=B4=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BA?= =?UTF-8?q?=20=D0=B2=D0=BD=D0=B5=D1=88=D0=BD=D0=B8=D0=BC=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BD=D1=82=D0=B5=D0=B9=D0=BD=D0=B5=D1=80=D0=B0=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker-compose.dev.yml | 2 +- docker-compose.prod.yml | 2 +- minecraft-skinsystem.go | 16 +++++++++++++--- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index 7022863..db6d8c0 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -2,7 +2,7 @@ version: '2' services: app: build: . - image: registry.gitlab.com/elyby/skinsystem:latest + image: registry.ely.by/elyby/skinsystem:latest ports: - "80:80" volumes: diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 30675b6..3c86b31 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -1,7 +1,7 @@ version: '2' services: app: - image: registry.gitlab.com/elyby/skinsystem:latest + image: registry.ely.by/elyby/skinsystem:latest ports: - "80:80" links: diff --git a/minecraft-skinsystem.go b/minecraft-skinsystem.go index ff89ffa..9f90837 100644 --- a/minecraft-skinsystem.go +++ b/minecraft-skinsystem.go @@ -1,6 +1,7 @@ package main import ( + "os" "log" "runtime" "time" @@ -16,17 +17,20 @@ import ( "elyby/minecraft-skinsystem/lib/worker" ) -const redisString string = "redis:6379" const redisPoolSize int = 10 -const rabbitmqString string = "amqp://ely-skinsystem-app:ely-skinsystem-app-password@rabbitmq:5672/%2fely" - func main() { log.Println("Starting...") runtime.GOMAXPROCS(runtime.NumCPU()) log.Println("Connecting to redis") + + var redisString = os.Getenv("REDIS_ADDR") + if (redisString == "") { + redisString = "redis:6379" + } + redisPool, redisErr := pool.New("tcp", redisString, redisPoolSize) if (redisErr != nil) { log.Fatal("Redis unavailable") @@ -35,6 +39,12 @@ func main() { log.Println("Connecting to rabbitmq") // TODO: rabbitmq становится доступен не сразу. Нужно дождаться, пока он станет доступен, периодически повторяя запросы + + var rabbitmqString = os.Getenv("RABBITMQ_ADDR") + if (rabbitmqString == "") { + rabbitmqString = "amqp://ely-skinsystem-app:ely-skinsystem-app-password@rabbitmq:5672/%2fely" + } + rabbitConnection, rabbitmqErr := amqp.Dial(rabbitmqString) if (rabbitmqErr != nil) { log.Fatalf("%s", rabbitmqErr)