Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

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

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.