{"id":16192830,"url":"https://github.com/cube2222/homework","last_synced_at":"2026-01-20T20:33:41.973Z","repository":{"id":86704582,"uuid":"578985891","full_name":"cube2222/homework","owner":"cube2222","description":null,"archived":false,"fork":false,"pushed_at":"2022-12-14T14:28:37.000Z","size":18,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-10-29T03:51:43.097Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":null,"has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cube2222.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-12-16T11:23:09.000Z","updated_at":"2022-12-14T14:25:56.000Z","dependencies_parsed_at":null,"dependency_job_id":"a8df4cbb-adf4-46a8-b73c-d628df68887e","html_url":"https://github.com/cube2222/homework","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/cube2222/homework","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cube2222%2Fhomework","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cube2222%2Fhomework/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cube2222%2Fhomework/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cube2222%2Fhomework/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cube2222","download_url":"https://codeload.github.com/cube2222/homework/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cube2222%2Fhomework/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28612970,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-20T18:56:40.769Z","status":"ssl_error","status_checked_at":"2026-01-20T18:54:26.653Z","response_time":117,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-10T08:12:44.991Z","updated_at":"2026-01-20T20:33:41.959Z","avatar_url":"https://github.com/cube2222.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"Hey there! Hope you'll have at least as much fun with this exercise, as we had designing it 😄\n\nYour starting point is a local Docker daemon with multiple self-contained Minio Object Storage instances.\nThey can be identified by having amazin-object-storage-node in their container name.\nEach of them listens on port 9000.\nThey have access keys and secret keys configured through Docker using environment variables.\nYou can assume that the set of Minio instances doesn't change in a \"test scenario\", though you shouldn't assume any constant number of them existing.\n\nAs you're task you'll be creating a simple **stateless** distributed Object Storage Gateway, listening on HTTP port 3000.\nAs its main functionality it should offer two endpoints:\n - **PUT** */object/{id}* - The request body should be used as the object body. If the file already exists, you should either overwrite it, or return an error, your choice.\n - **GET** */object/{id}* - Should respond with the object body, or return code 404 if it doesn't exist.\n\nWhen handling a get or put request, you should consistently (wrt the ID) choose one of the Minio instances and use it to serve the request.\nYou should use varying Minio instances depending on the ID.\n\nThe IDs are alphanumeric, up to 32 characters.\n\nThe container your app runs in will have /var/run/docker.sock mounted and will share a docker network with the Minio instances.\nAny information about the Minio instances (such as the IP address, or the access/secret keys) should be read dynamically from the local Docker daemon.\n\nYou should use the [Docker client library](https://github.com/moby/moby/tree/master/client),\nthe [Minio client library](https://github.com/minio/minio-go),\nas well as any other libraries you may deem necessary or useful (within reason).\ni.e. you can use the [Gorrila Mux](https://github.com/gorilla/mux) library as an HTTP router,\nbut feel free to use a different one or even just the standard library.\n\nYou should implement proper error handling. (the app shouldn't instantly crash if something doesn't work)\n\nThere's a docker-compose.yml file included you can use as a starting point. The comments there contain some tips.\nFeel free to modify the docker-compose.yml file, as well as the Dockerfile, as you see fit.\n\nThe project should work out of the box using\n```\ndocker-compose up --build\n```\n\nGood luck!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcube2222%2Fhomework","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcube2222%2Fhomework","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcube2222%2Fhomework/lists"}