• Stars
    star
    119
  • Rank 297,930 (Top 6 %)
  • Language
    Go
  • Created almost 4 years ago
  • Updated 12 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Candy is a zero-config reverse proxy server

Candy gopher_with_candy

Candy is a zero-config reverse proxy server. It makes proxying applications with local top-leveled domains as frictionless as possible. There is no messing around with /etc/hosts, Dnsmasq, or Nginx.

How does it work?

A few simple conventions eliminate the need for tedious configuration. Candy runs as your user on unprivileged ports, and includes an HTTP, an HTTPS, and a DNS server. It also sets up a system hook so that all DNS queries for a local top-level domain (.test) resolve to your local machine.

To route web traffic to an app, just create a file in the ~/.candy directory. Assuming you are developing an app that runs on http://127.0.0.1:8080, and you would like to access it at http://myapp.test, setting it up is as easy as:

$ echo "8080" > ~/.candy/myapp

The name of the file (myapp) determines the hostname (myapp.test) to access the application that it points to (127.0.0.1:8080). Both HTTP and HTTPS request is supported out of the box:

$ curl http://myapp.test
$ curl https://myapp.test

Installation

Mac

brew install owenthereal/candy/candy

After installing the candy binary, you also need to create a DNS resolver config in /etc/resolver/CONFIG. Creating the /etc/resolver directory and the config file require superuser privileges. You can execute with a one-liner:

sudo candy setup

Alternatively, you can manually execute the followings:

sudo mkdir -p /etc/resolver
cat<<EOF | sudo tee /etc/resolver/candy-test > /dev/null
domain test
nameserver 127.0.0.1
port 25353
search_order 1
timeout 5
EOF

Linux

go install github.com/owenthereal/candy/cmd/candy@latest

After installing the candy binary, you also need to create a network name resolution config in /usr/lib/systemd/resolved.conf.d/CONFIG. Creating the /usr/lib/systemd/resolved.conf.d directory and the config file require superuser privileges. You can execute with a one-liner:

sudo candy setup

Alternatively, you can manually execute the followings:

sudo mkdir -p /usr/lib/systemd/resolved.conf.d
cat<<EOF | sudo tee /usr/lib/systemd/resolved.conf.d/01-candy.conf > /dev/null
[Resolve]
DNS=127.0.0.1:25353
Domains=test
EOF
sudo systemctl restart systemd-resolved # Restart systemd-resolved

Usage

Starting Candy

Mac

To have Launchd start Candy and restart at login:

brew services start candy

To restart Candy, run:

brew services restart candy

To stop Candy, run:

brew services stop candy

Or, if you don't want/need a background service, you can just run:

candy run

Linux

TODO

Port/IP proxying

Candy's port/IP proxying feature lets you route all web traffic on a particular hostname to another port or IP address. To use it, create a file in ~/.candy with the the destination port number or IP address as its contents:

echo "8080" > ~/.candy/app1
curl https://app1.test

echo "1.2.3.4:8080" > ~/.candy/app2
curl https://app2.test

Configuration

Candy provides good defaults that most people will never need to configure it. However, if you need to adjust a setting or two, you can create a file to override the defaults in ~/.candyconfig. See this file for a list of settings that you can change.

For example, you may want to have multiple top-leveled domains besides *.test:

{
  "domain": ["test","mydomain"]
}

Changing the domain setting requires resetting DNS resolvers in /etc/resolver. Rerun the setup step and make sure all resolver config files are matching in /etc/resolver.

After changing a setting in ~/.candyconfig, you will also need to restart Candy for the change to take effect:

Prior Arts

More Repositories

1

ccat

Colorizing `cat`
Go
3,105
star
2

godzilla

Godzilla is a ES2015 to Go source code transpiler and runtime
Go
1,482
star
3

hacker-menu

Hacker News Delivered to Desktop πŸ‘―
JavaScript
1,004
star
4

upterm

Instant Terminal Sharing
Go
838
star
5

jqplay

A playground for jq, written in Go
Go
724
star
6

gh

Fast GitHub command line client (deprecated). gh has been merged into https://github.com/github/hub, see https://github.com/github/hub/issues/475 for more info
Go
721
star
7

thunderbird

⚑🐦 Elegant WebSockets in Go
JavaScript
511
star
8

goup

Elegant Go installer
Go
478
star
9

spotctl

A command-line interface to Spotify, written in Go
Go
242
star
10

nut

Vendor Go dependencies
Go
234
star
11

gotask

Idiomatic build tool in Go
Go
177
star
12

jekyll_and_hyde

A HTML presentation generator that generates a basic Jekyll scaffold with Slippy hooking up.
Ruby
174
star
13

devise_uid

Add UID support to Devise.
Ruby
61
star
14

gaffer

Gaffer - Foreman on JVM
Java
56
star
15

msgpack_rails

MessagePack for Rails / msgpack.org[Rails]
Ruby
45
star
16

conf

Configuration loader in Go
Go
31
star
17

negroni-gorelic

negroni_gorelic is NewRelic middleware for negroni framework.
Go
27
star
18

gundam

The most destructive robot
Go
18
star
19

sql_parser

A Ruby SQL parser based on Treetop.
Ruby
18
star
20

vimux-zeus

vimux and zeus in action.
Vim Script
14
star
21

go-get-nuts

HTML5 Game built with Phaser
JavaScript
10
star
22

heroic_haiku

A simple game that is written in Flutter and Flame.
Dart
10
star
23

heroku-buildpack-wasmer

Heroku Buildpack for Wasmer
Shell
8
star
24

osh

The O shell
Go
8
star
25

jruby_sinatra_activerecord

A template app to run JRuby with Sinatra and ActiveRecord
Ruby
7
star
26

travisarchive

Travis Archive
Go
7
star
27

blog

My blog
JavaScript
6
star
28

dotfiles_old

My dotfiles
Shell
6
star
29

git-rebase-merge

A bash script to rebase and merge a Git topic branch to current branch.
Shell
5
star
30

homebrew-ccat

Homebrew fomular for `ccat` (deprecated), use `brew install ccat` instead
Ruby
4
star
31

eventloopclass

Go version of the exercises for The Truth About Event Loop Online Masterclass
Go
4
star
32

message_queue

A common interface to multiple message queues libraries.
Ruby
4
star
33

codeface

Run web-based VS Code on Heroku
Go
3
star
34

cheatsheets

3
star
35

patching_with_class_shadowing_and_maven

Using Maven to help with class shadowing.
Java
3
star
36

codefaces

a web-based source control client
Java
3
star
37

dotfiles

My dotfiles
Shell
3
star
38

hdp

HTTP Debug Proxy (HDP) logs HTTP requests for inspection.
Go
3
star
39

com.google.dart.compiler

A Dart compiler implemented in Java extracted from Dart's official repository.
Java
3
star
40

maven_jetty_plugin_example

Speed Up J2EE Environment Setup With Jetty Maven Plugin Example
Java
2
star
41

.dotfiles

dotfiles for my Mac
Ruby
2
star
42

mag

MAG - Full-Stack application development using MongoDB, AngularJS, and Go
2
star
43

ruby_grep

Module to search file(s) for lines that match a given pattern.
Ruby
2
star
44

priority_test

Run tests in priority order.
Ruby
2
star
45

tic_tac_toe_engine

A dead simple Tic Tac Toe engine.
Ruby
2
star
46

homebrew-gh

GH formulae for the Homebrew package manager
Ruby
2
star
47

testing_rest_web_services_with_rails

Ruby
2
star
48

rbfmt

Format Ruby code
Ruby
2
star
49

StoryboardRecipes

Example app following the book "iOS SDK Development" from Pragmatic Programmer
Objective-C
2
star
50

gostart

Go
1
star
51

buildzilla

Ruby
1
star
52

twitter_plus

an example of my talk about testing web service client
Ruby
1
star
53

isittheday.com

Ruby
1
star
54

stats_foundry

Ruby
1
star
55

ijws

I Just Wanna Say
Ruby
1
star
56

jekyll_and_hyde_demo

An example presentation generated by jekyll_and_hyde
1
star
57

karotz-proxy

Ruby
1
star
58

rails_engines_spike

Ruby
1
star
59

vpm

An awesome utility for managing Vim plugins.
Ruby
1
star
60

heroku-nginx-wasmer

Run Nginx with Wasmer on Heroku
HTML
1
star
61

api-proxy-spike

A spike to implement an API proxy
JavaScript
1
star
62

automatic_testing_of_rest_web_sevices_client_with_rails_source

Ruby
1
star
63

cortana

A Hubot for Twitter
CoffeeScript
1
star
64

odt

Owen's Development Tool
Go
1
star
65

rab

Rails Asset Builder (RAB)
Ruby
1
star
66

summarize-github-pull-requests

Perform automatic code reviews for GitHub pull requests (PR). The review is triggered when a PR is created and is triggered again for every subsequent commit in the PR. The code review is conducted for commit in the PR.
Rust
1
star
67

shortenerclj

A URL shortener implemented in Clojure
Clojure
1
star
68

hurley

Hurley and Faraday are both from the lost island
Go
1
star
69

sinatra-jruby-heroku

Shell
1
star
70

gameserverstatus

gameserverstatus
Clojure
1
star
71

narc

Node.js CI Server
JavaScript
1
star
72

jekyll_and_hyde_template

The source of the default jekyll_and_hyde template used by its generator.
1
star
73

loading_path_gotchas_in_rails3

A gotchas on load path of Rails 3.
Ruby
1
star
74

testing_web_services_client_slides

JavaScript
1
star