{"id":26953031,"url":"https://github.com/anijackich/go-url-shortener","last_synced_at":"2026-04-12T12:49:16.703Z","repository":{"id":276617660,"uuid":"928975220","full_name":"anijackich/go-url-shortener","owner":"anijackich","description":"Simple URL shortener written in Go","archived":false,"fork":false,"pushed_at":"2025-04-01T22:16:12.000Z","size":102,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-01T23:24:55.623Z","etag":null,"topics":["docker","gin","github-actions","go","gorm","rest-api","swagger"],"latest_commit_sha":null,"homepage":"https://ozon.anjk.ru/swagger/index.html","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/anijackich.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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":"2025-02-07T15:26:16.000Z","updated_at":"2025-04-01T22:16:08.000Z","dependencies_parsed_at":"2025-02-10T06:02:21.488Z","dependency_job_id":null,"html_url":"https://github.com/anijackich/go-url-shortener","commit_stats":null,"previous_names":["anijackich/go-url-shortener"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/anijackich/go-url-shortener","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anijackich%2Fgo-url-shortener","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anijackich%2Fgo-url-shortener/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anijackich%2Fgo-url-shortener/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anijackich%2Fgo-url-shortener/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/anijackich","download_url":"https://codeload.github.com/anijackich/go-url-shortener/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anijackich%2Fgo-url-shortener/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31715492,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-12T06:22:27.080Z","status":"ssl_error","status_checked_at":"2026-04-12T06:21:52.710Z","response_time":58,"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":["docker","gin","github-actions","go","gorm","rest-api","swagger"],"created_at":"2025-04-03T01:19:13.136Z","updated_at":"2026-04-12T12:49:16.684Z","avatar_url":"https://github.com/anijackich.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Go URL Shortener\n\n[![Ozon Tech](https://img.shields.io/badge/Ozon%20Tech-FFF.svg?\u0026logo=data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDgiIGhlaWdodD0iNDgiIHZpZXdCb3g9IjAgMCA0OCA0OCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTE5Ljg4MDQgMTAuNzQ2MUM5LjAzODk5IDEzLjI0OTcgMi4xNjQxNSAyMS4yMTg4IDQuNDMyNTIgMjguNTE0NkM2LjcwMDg5IDM1LjgxMDUgMTcuMjc4MSAzOS43NDk1IDI4LjExOTYgMzcuMjQ2QzM4Ljk2MSAzNC43NDI0IDQ1LjgzNTkgMjYuNzczMyA0My41Njc1IDE5LjQ3NzVDNDEuMjk5MSAxMi4xODE2IDMwLjYzMzcgOC4yNjI5NSAxOS44ODA0IDEwLjc0NjFaTTI2LjIxNjIgMzEuMTI0MkMxOC43MjQyIDMyLjg1NDMgMTEuOTk3OSAzMC4zNjI4IDEwLjk4MTEgMjcuMDkyM0M5Ljk2NDIzIDIzLjgyMTcgMTQuMzQzOSAxOC43NjU3IDIxLjgzNTkgMTcuMDM1NkMyOS4zMjggMTUuMzA1NiAzNi4wNTQyIDE3Ljc5NyAzNy4wNzExIDIxLjA2NzVDMzguMDg3OSAyNC4zMzgxIDMzLjYyMDEgMjkuNDE0NCAyNi4yMTYyIDMxLjEyNDJaIiBmaWxsPSIjMDAxQTM0Ii8+Cjwvc3ZnPgo=)](https://ozon.tech/)\n[![CI pipeline](https://github.com/anijackich/go-url-shortener/actions/workflows/ci.yml/badge.svg)](https://github.com/anijackich/go-url-shortener/actions/workflows/ci.yml)\n[![Go version](https://img.shields.io/github/go-mod/go-version/anijackich/go-url-shortener)](https://github.com/anijackich/go-url-shortener)\n[![Go Report Card](https://goreportcard.com/badge/github.com/anijackich/go-url-shortener)](https://goreportcard.com/report/github.com/anijackich/go-url-shortener)\n\nSimple Go API application for URL shortener service.\n\n## ✨ Features\n\n- [x] Convert long URL to a short link\n- [x] Expand long URL from a short link\n- [x] In-memory storage\n- [x] PostgreSQL storage\n\n## 🕹️ Play with Demo\n\nThe application is deployed on [ozon.anjk.ru](https://ozon.anjk.ru/api/v1), and you can try to interact with it\nthrough [Swagger](https://ozon.anjk.ru/swagger/index.html).\n\n### `POST` `/api/v1/shorten`\n\n#### Shorten link\n\n\u003e Converts a long URL to a short link\n\n#### Request body\n\n```json\n{\n  \"long_url\": \"https://some-very-very.com/very/very/long/url\"\n}\n```\n\n#### Response body\n\n```json\n{\n  \"short_url\": \"https://example.com/a1b2c3d4e5\"\n}\n```\n\n### `GET` `/api/v1/expand?u=\u003cshort_url\u003e`\n\n#### Expand link\n\n\u003e Returns a long URL for the specified short link\n\n#### Request params\n\n`u`: `https://example.com/a1b2c3d4e5`\n\n#### Response body\n\n```json\n{\n  \"long_url\": \"https://some-very-very.com/very/very/long/url\"\n}\n```\n\n## ⬇️ Clone \u0026 Setup\n\n1. Clone this repository\n\n   ```shell\n   git clone https://github.com/anijackich/go-url-shortener\n   ```\n\n2. Go to `go-url-shortener` directory\n\n   ```shell\n   cd go-url-shortener\n   ```\n\n3. Rename `.env.example` to `.env`\n\n   ```shell\n   mv .env.example .env\n   ```\n\n4. Set environment variables\n\n   | Variable             | Description                                         |\n   |----------------------|-----------------------------------------------------|\n   | `HOST`               | Host serving the API                                |\n   | `PORT`               | Port serving the API                                |\n   | `DOMAIN`             | Base domain for shortened links                     |\n   | `LINK_CODE_LENGTH`   | Length of code in path of shortened links           |\n   | `LINK_CODE_ALPHABET` | Acceptable chars of code in path of shortened links |\n   | `POSTGRES_USER`      | PostgreSQL User                                     |\n   | `POSTGRES_PASSWORD`  | PostgreSQL Password                                 |\n   | `POSTGRES_HOST`      | PostgreSQL Host                                     |\n   | `POSTGRES_PORT`      | PostgreSQL Port                                     |\n   | `POSTGRES_DATABASE`  | PostgreSQL Database name                            |\n\n## 💾 Storage\n\nThe application supports two possible options for storing links:\n\n- `memory` temporary storage in memory\n- `postgres` persistent storage in PostgreSQL\n\nOnce selected, replace `\u003cSTORAGE\u003e` in following commands with one of these values.\n\n## 🐋 Docker\n\n### Run\n\n```shell\ndocker run -it -p 8080:8080 --env-file .env anijack/go-url-shortener --storage \u003cSTORAGE\u003e\n```\n\nServer will start on `localhost:8080`\n\n### Run using Docker Compose (with PostgreSQL)\n\n```shell\nSTORAGE=\u003cSTORAGE\u003e docker compose up\n```\n\nHowever, it makes no sense to run application with `memory` storage type using Docker Compose, since PostgreSQL is\nlaunched with it, which is necessary only for `postgres` storage type.\n\n### Build from sources\n\n```shell\ndocker build -t anijack/go-url-shortener .\n```\n\n## 🔨 Build\n\n```shell\nmake build\n```\n\n## 🚀 Run\n\n```shell\nmake run STORAGE=\u003cSTORAGE\u003e\n```\n\nServer is listening and serving on `localhost:8080`\n\n## ✔️ Code quality\n\n### Run Formatter\n\n```shell\nmake fmt\n```\n\n### Run Linter\n\n```shell\nmake lint\n```\n\n[golangci-lint](https://github.com/golangci/golangci-lint) is required\n\n### Run Tests\n\n```shell\nmake test\n```\n\nCoverage report in `coverage.out`\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanijackich%2Fgo-url-shortener","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fanijackich%2Fgo-url-shortener","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanijackich%2Fgo-url-shortener/lists"}