A simple http router for apt downloads based on GeoIP
Go to file
tyler 3e7782e5ec
continuous-integration/drone/push Build is passing Details
Merge pull request 'Initial testing and improvements of code' (#1) from feature/testing into master
Reviewed-on: #1
2022-08-14 08:03:49 +00:00
assets Add mirror status endpoint, timestamp on last activity 2022-04-02 04:50:12 -04:00
.drone.yml Fix tests and add coverage 2022-08-14 03:49:28 -04:00
.gitignore Initial testing implementation of checks 2022-08-06 16:20:46 -04:00
Dockerfile Add proper CMD 2022-03-30 20:43:10 -04:00
LICENSE Initial testing implementation of checks 2022-08-06 16:20:46 -04:00
README.md Improve readme with proper information and configuration 2022-08-14 04:02:10 -04:00
armbianmirror_suite_test.go Initial testing implementation of checks 2022-08-06 16:20:46 -04:00
check.go Improve test coverage and documentation 2022-08-14 03:42:49 -04:00
check_test.go Improve test coverage and documentation 2022-08-14 03:42:49 -04:00
config.go Improve test coverage and documentation 2022-08-14 03:42:49 -04:00
dlrouter.yaml Mimic existing mirrors endpoint, add geoip 2022-03-31 22:04:19 -04:00
go.mod Fix tests and add coverage 2022-08-14 03:49:28 -04:00
go.sum go.sum magically removed ginkgo 2022-08-14 03:50:11 -04:00
http.go Improve test coverage and documentation 2022-08-14 03:42:49 -04:00
main.go Improve test coverage and documentation 2022-08-14 03:42:49 -04:00
map.go Improve test coverage and documentation 2022-08-14 03:42:49 -04:00
map_test.go Improve test coverage and documentation 2022-08-14 03:42:49 -04:00
middleware.go Allow real IP from loopback AND private 2022-03-30 22:58:15 -04:00
mirrors.go Improve test coverage and documentation 2022-08-14 03:42:49 -04:00
servers.go Improve test coverage and documentation 2022-08-14 03:42:49 -04:00
util.go Resolve issue with returning a lower number of servers, add auth to reload 2022-04-02 14:35:46 -04:00

README.md

Armbian Redirector

This repository contains a redirect service for Armbian downloads, apt, etc.

It uses multiple current technologies and best practices, including:

  • Go 1.17/1.18
  • GeoIP + Distance routing
  • Server weighting, pooling (top x servers are served instead of a single one)
  • Health checks (HTTP, TLS)

Code Quality

The code quality isn't the greatest/top tier. All code lives in the "main" package and should be moved at some point.

Regardless, it is meant to be simple and easy to understand.

Configuration

Modes

Redirect

Standard redirect functionality

Download Mapping

Uses the dl_map configuration variable to enable mapping of paths to new paths.

Think symlinks, but in a generated file.

Mirrors

Mirror targets with trailing slash are placed in the yaml configuration file.

Example YAML

# GeoIP Database Path
geodb: GeoLite2-City.mmdb

# Comment out to disable
dl_map: userdata.csv

# LRU Cache Size (in items)
cacheSize: 1024

# Server definition
# Weights are just like nginx, where if it's > 1 it'll be chosen x out of x + total times
# By default, the top 3 servers are used for choosing the best.
# server = full url or host+path
# weight = int
# optional: latitude, longitude (float)
servers:
  - server: armbian.12z.eu/apt/
  - server: armbian.chi.auroradev.org/apt/
    weight: 15
    latitude: 41.8879
    longitude: -88.1995

API

/status

Meant for a simple health check (nginx/etc can 502 or similar if down)

/reload

Flushes cache and reloads configuration and mapping. Requires reloadToken to be set in the configuration, and a matching token provided in Authorization: Bearer TOKEN

/mirrors

Shows all mirrors in the legacy (by region) format

/mirrors.json

Shows all mirrors in the new JSON format. Example:

[
  {
    "available":true,
    "host":"imola.armbian.com",
    "path":"/apt/",
    "latitude":46.0503,
    "longitude":14.5046,
    "weight":10,
    "continent":"EU",
    "lastChange":"2022-08-12T06:52:35.029565986Z"
  }
]

/mirrors/{server}.svg

Magic SVG path to show badges based on server status, for use in dynamic mirror lists.

/dl_map

Shows json-encoded download mappings

/geoip

Shows GeoIP information for the requester

/region/REGIONCODE/PATH

Using this magic path will redirect to the desired region:

  • NA - North America
  • EU - Europe
  • AS - Asia

/metrics

Prometheus metrics endpoint. Metrics aren't considered private, thus are exposed to the public.