Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/alexbrazier/go-url
Url Shortener for use inside organisation
https://github.com/alexbrazier/go-url
azure-active-directory golang hacktoberfest opensearch react url-shortener
Last synced: 3 months ago
JSON representation
Url Shortener for use inside organisation
- Host: GitHub
- URL: https://github.com/alexbrazier/go-url
- Owner: alexbrazier
- License: mit
- Created: 2018-12-02T22:18:14.000Z (about 6 years ago)
- Default Branch: master
- Last Pushed: 2023-03-01T10:01:03.000Z (almost 2 years ago)
- Last Synced: 2024-10-12T05:23:35.503Z (3 months ago)
- Topics: azure-active-directory, golang, hacktoberfest, opensearch, react, url-shortener
- Language: Go
- Homepage: https://alexbrazier.github.io/go-url/
- Size: 2.87 MB
- Stars: 31
- Watchers: 4
- Forks: 4
- Open Issues: 4
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Go URL
[![CircleCI](https://circleci.com/gh/alexbrazier/go-url.svg?style=svg)](https://circleci.com/gh/alexbrazier/go-url)
[![Cypress Dashboard](https://img.shields.io/badge/cypress-dashboard-brightgreen.svg)](https://dashboard.cypress.io/#/projects/7dct13/runs)
[![dependencies](https://img.shields.io/david/alexbrazier/go-url.svg?path=frontend)](https://david-dm.org/alexbrazier/go-url?path=frontend)A simple URL shortener written in Go with a React frontend and Postgres database.
# Features
- Shorten urls based on a user defined key
- Alias a key to point to another short url
- Open multiple pages at once by separating keys with a comma
- Alias a key to point to multiple other keys
- Use variables in URLs
- Opensearch integration to provide suggestions directly to browser
- Frontend to view most popular searches and search to find existing links
- Frontend to allow anyone to add and edit links
- Optional authentication using Azure AD or Okta
- Slack `/` command integration
- Slackbot integration![Demo](.github/go-demo.gif)
# Getting Started
The recommended way to test and deploy is using Docker. You will need to run both the go-url app, and the Postgres DB.
**Start Postgres**
```sh
docker run -d -P --name db -e POSTGRES_PASSWORD=password -e POSTGRES_DB=go -e POSTGRES_ADDR=db:5432 postgres:11.3-alpine
```**Start App**
```sh
docker run -p 1323:1323 -e HOSTS=localhost -e APP_URI=http://localhost:1323 --link db alexbrazier/go-url
```Alteratively use the docker-compose file and run:
```sh
docker-compose up
```## Development
Open http://localhost:8080/go
Run Postgres manually or with Docker
```sh
docker-compose up postgres
```Install node (via nvm), yarn & go
```sh
brew install nvm yarn go
nvm install
```### Start frontend
```sh
cd frontend
yarn
yarn start
```### Start API
```sh
cd api
dep ensure
POSTGRES_PASS=password HOSTS=localhost APP_URI=http://localhost:3000 go run server.go
```## Enviroment Configuration
| Env Var | Required | Default | Example | Description |
| --------------------------- | -------- | -------------- | ---------------------------------------------- | ------------------------------------------------------------------------------------------------------ |
| `HOSTS` | yes | | go.domain.com,go2.domain.com | List of comma separated hosts that the server will be able to be accessed from |
| `BLOCKED_HOSTS` | | | go.domain.com,go2.domain.com | List of hosts you want to block from being linked - HOSTS are already included to stop recursive calls |
| `APP_URI` | yes | | https://go.domain.com | Default URI of app - used to link back to app |
| `PORT` | | 1323 | | Port the app will run on |
| `DEBUG` | | false | | Enable more logging |
| `JSON_LOGS` | | false | | Use JSON logs where possible |
| `POSTGRES_ADDR` | | localhost:5432 | | Postgres db address |
| `POSTGRES_DATABASE` | | go | | Postgres db name |
| `POSTGRES_USER` | | postgres | | Postgres user |
| `POSTGRES_PASS` | | password | | Postgres password |
| `SLACK_TOKEN` | | | xoxb-xxxxxxxxx-xxxxxxxx-xxxx | Slack OAuth token to enable slackbot |
| `SENTRY_API_DSN` | | | | Sentry DSN for go API |
| `SENTRY_FRONTEND_DSN` | | | | Sentry DSN for react frontend |
| `SLACK_SIGNING_SECRET` | | | xxxxxxxxxxx | Slack signing secret to enable Slack `/go` command |
| `SLACK_TEAM_ID` | | | Txxxxxxxx | Slack team id to restrict slash command responses to single team |
| `ENABLE_AUTH` | | false | | Enable Azure auth or not - if enabled, all other fields must be filled in |
| `AUTH_EXPIRY_SECONDS` | | 2592000 | | Auth cookie expiry (default 30 days) |
| `SECURE_COOKIES` | | true | | Use secure https only cookies |
| `AD_TENANT_ID` | | | | Azure AD tenant ID |
| `AD_CLIENT_ID` | | | | Azure AD client ID |
| `AD_CLIENT_SECRET` | | | | Azure AD client secret |
| `OKTA_CLIENT_ID` | | | | Okta client ID |
| `OKTA_CLIENT_SECRET` | | | | Okta client secret |
| `OKTA_ISSUER` | | | https://dev-123.oktapreview.com/oauth2/default | Okta issuer url |
| `SESSION_TOKEN` | | | | Secret session token to store the user sessions |
| `ALLOWED_IPS` | | | 110.1.10.2,1.1.22.0/24 | IP addresses or CIDRs that are always allowed access, even with auth enabled |
| `ALLOW_FORWARDED_FOR` | | false | | Retrieve origin IP from X-Forwarded-For header. Only enable if source is trusted, e.g. via Cloudfront |
| `FORWARDED_FOR_TRUST_LEVEL` | | 1 | | Number of levels to trust X-Forwarded-For header - should map to number of proxies used |## FAQ
#### Slackbot is posting multiple replies messages to a single message
When enabled, the Slackbot will be running on every node in a load balanced system. Either disable load balancing, or run a separate instance just for the Slackbot.