diff --git a/.gitignore b/.gitignore index c153235..9bfcada 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ # IDEA /.idea -# Docker Compose override file +# Docker Compose file +docker-compose.yml docker-compose.override.yml diff --git a/README.md b/README.md index 77e7af0..45ba303 100644 --- a/README.md +++ b/README.md @@ -15,30 +15,19 @@ ln -s $PWD $GOPATH/src/elyby/minecraft-skinsystem git clone git@bitbucket.org:elyby/minecraft-skinsystem.git $GOPATH/src/elyby/minecraft-skinsystem ``` -Поднять репозиторий можно командой: +Нужно скопировать правильный docker-compose файл для желаемого окружения: + +```sh +cp docker-compose.dev.yml docker-compose.yml # dev env +cp docker-compose.prod.yml docker-compose.yml # prod env +``` + +И за тем всё это поднять: ```sh docker-compose up -d ``` -Рекомендуемый файл `docker-compose.override.yml` для dev-окружения: - -```sh -version: '2' -services: - app: - volumes: - - ./:/go/src/app - command: ["go", "run", "minecraft-skinsystem.go"] -``` - -В таком случае, для перезапуска контейнера (при условии, что не появляется -новых зависимостей) будет достаточно выполнить только одну команду: - -```sh -docker-compose restart app -``` - Если нужно пересобрать весь контейнер, то выполняем следующее: ``` diff --git a/data/.gitignore b/data/redis/.gitignore similarity index 100% rename from data/.gitignore rename to data/redis/.gitignore diff --git a/docker-compose.yml b/docker-compose.base.yml similarity index 60% rename from docker-compose.yml rename to docker-compose.base.yml index 99380c2..4632d92 100644 --- a/docker-compose.yml +++ b/docker-compose.base.yml @@ -1,13 +1,10 @@ version: '2' services: app: - build: . - links: - - redis ports: - "80:80" redis: image: redis:3.0 volumes: - - ./data/:/data + - ./data/redis:/data diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml new file mode 100644 index 0000000..a1547cc --- /dev/null +++ b/docker-compose.dev.yml @@ -0,0 +1,17 @@ +version: '2' +services: + app: + extends: + file: docker-compose.base.yml + service: app + build: . + volumes: + - ./:/go/src/app + command: ["go", "run", "minecraft-skinsystem.go"] + links: + - redis + + redis: + extends: + file: docker-compose.base.yml + service: redis diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml new file mode 100644 index 0000000..5663db1 --- /dev/null +++ b/docker-compose.prod.yml @@ -0,0 +1,16 @@ +version: '2' +services: + app: + extends: + file: docker-compose.base.yml + service: app + image: erickskrauch/ely-by-skinsystem:master + links: + - redis + restart: always + + redis: + extends: + file: docker-compose.base.yml + service: redis + restart: always diff --git a/lib/data/DataNotFound.go b/lib/data/DataNotFound.go new file mode 100644 index 0000000..0f5e5c2 --- /dev/null +++ b/lib/data/DataNotFound.go @@ -0,0 +1,11 @@ +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 c381ed5..ee666e1 100644 --- a/lib/data/SkinItem.go +++ b/lib/data/SkinItem.go @@ -6,6 +6,8 @@ import ( "elyby/minecraft-skinsystem/lib/services" "elyby/minecraft-skinsystem/lib/tools" + + "github.com/mediocregopher/radix.v2/redis" ) type SkinItem struct { @@ -25,14 +27,17 @@ func (s *SkinItem) Save() { func FindRecord(username string) (SkinItem, error) { var record SkinItem; - result, err := services.RedisPool.Cmd("GET", tools.BuildKey(username)).Str(); + response := services.RedisPool.Cmd("GET", tools.BuildKey(username)); + if (response.IsType(redis.Nil)) { + return record, DataNotFound{username} + } + + result, err := response.Str() if (err == nil) { decodeErr := json.Unmarshal([]byte(result), &record) if (decodeErr != nil) { log.Println("Cannot decode record data") } - } else { - log.Println("Error on request user data: " + err.Error()) } return record, err diff --git a/lib/routes/Cape.go b/lib/routes/Cape.go index ff58a28..20020b6 100644 --- a/lib/routes/Cape.go +++ b/lib/routes/Cape.go @@ -1,6 +1,7 @@ package routes import ( + "log" "net/http" "github.com/gorilla/mux" @@ -10,6 +11,7 @@ import ( func Cape(w http.ResponseWriter, r *http.Request) { username := tools.ParseUsername(mux.Vars(r)["username"]) + log.Println("request cape for username " + username) http.Redirect(w, r, "http://skins.minecraft.net/MinecraftCloaks/" + username + ".png", 301) } diff --git a/minecraft-skinsystem.go b/minecraft-skinsystem.go index 04c2b0b..49df237 100644 --- a/minecraft-skinsystem.go +++ b/minecraft-skinsystem.go @@ -17,12 +17,16 @@ import ( const redisString string = "redis:6379" func main() { + log.Println("Starting...") + runtime.GOMAXPROCS(runtime.NumCPU()) - pool, redisErr := pool.New("tcp", redisString, 10) + log.Println("Connecting to redis") + redisPool, redisErr := pool.New("tcp", redisString, 10) if redisErr != nil { log.Fatal("Redis unavailable") } + log.Println("Connected to redis") router := mux.NewRouter().StrictSlash(true) router.HandleFunc("/skins/{username}", routes.Skin).Methods("GET").Name("skins") @@ -38,7 +42,7 @@ func main() { apiRouter := router.PathPrefix("/api").Subrouter() apiRouter.HandleFunc("/user/{username}/skin", routes.SetSkin).Methods("POST") - services.RedisPool = pool + services.RedisPool = redisPool services.Router = router /*go func() {