{"id":22899706,"url":"https://github.com/wolfulus/letitout","last_synced_at":"2026-04-10T23:53:55.536Z","repository":{"id":84705425,"uuid":"269933965","full_name":"WoLfulus/letitout","owner":"WoLfulus","description":"Easy `inlets` client execution.","archived":false,"fork":false,"pushed_at":"2020-06-06T19:56:46.000Z","size":24,"stargazers_count":12,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-27T08:52:49.766Z","etag":null,"topics":["cloudflare","expose","golang","inlets","microservices","ngrok","service","tunnel","yaml"],"latest_commit_sha":null,"homepage":null,"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/WoLfulus.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":"2020-06-06T09:33:57.000Z","updated_at":"2023-10-20T10:07:24.000Z","dependencies_parsed_at":"2023-10-21T04:30:38.963Z","dependency_job_id":null,"html_url":"https://github.com/WoLfulus/letitout","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WoLfulus%2Fletitout","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WoLfulus%2Fletitout/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WoLfulus%2Fletitout/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WoLfulus%2Fletitout/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/WoLfulus","download_url":"https://codeload.github.com/WoLfulus/letitout/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246586108,"owners_count":20801026,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["cloudflare","expose","golang","inlets","microservices","ngrok","service","tunnel","yaml"],"created_at":"2024-12-14T01:15:55.226Z","updated_at":"2026-04-10T23:53:50.516Z","avatar_url":"https://github.com/WoLfulus.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Let it out!\n\n\u003cimg src=\"docs/logo.png\" /\u003e\n\n# Overview\n\n**Let it out** makes it easier to quickly expose your local services to the internet without\nmessing with `inlets` server tokens, and DNS records.\n\nWhile we just automate the DNS management on your CloudFlare account and the `inlets` command,\nall the tunneling magic comes from [inlets](https://github.com/inlets/inlets) itself. You're still\nrequired to have an exit server up and running in order to expose it to the internet.\n\n# Requirements\n\n- Inlets [`inlets`](https://github.com/inlets/inlets#install-the-cli) executable installed on your machine\n- One or more [exit server](https://docs.inlets.dev/#/?id=exit-servers) [installed](https://github.com/inlets/inlets/blob/master/docs/vps.md)\n- A domain managed by [CloudFlare](https://www.cloudflare.com/)\n\n## Exit servers\n\nYou can use any system you want to run exit servers if they are publicly accessible.\n\nThe easiest way to do it is using [`inletsctl`](https://github.com/inlets/inletsctl) to create an exit server, but if you want a quick and easy setup on a provider not supported by `inletsctl`, here it is how you can do it on a fresh Ubuntu machine (adjust as needed):\n\n- Install inlets\n  - `sudo curl -sLS https://get.inlets.dev | sudo sh`\n  - `sudo curl -sLO https://raw.githubusercontent.com/inlets/inlets/master/hack/inlets-operator.service`\n  - `sudo mv inlets-operator.service /etc/systemd/system/inlets.service`\n  - `echo AUTHTOKEN=$(head -c 16 /dev/urandom | shasum | cut -d\" \" -f1) \u003e ~/inlets`\n  - `echo CONTROLPORT=8000 \u003e\u003e ~/inlets`\n  - `sudo mv ~/inlets /etc/default/inlets`\n  - `sudo systemctl start inlets`\n  - `sudo systemctl enable inlets`\n- Grab your token\n  - `source /etc/default/inlets`\n  - `echo $AUTHTOKEN`\n\n# Installation\n\n\u003e TODO:\n\n# Configuration\n\nTo run **let it out** you need a configuration file that has your domains and exit servers.\n\nThe configuration is done through a `.letitout.yml` file that can be placed in your home directory or the current working directory when you run `letitout`. If the file is found in the current working directory, it takes priority over the file placed on your home folder.\n\n## Example contents\n\n```yaml\ncloudflare:\n  mydomain.com:\n    token: \u003cyour_cloudflare_token_with_edit_zone_permission\u003e\n\n  anotherdomain.com:\n    token: \u003canother_cloudflare_token_with_edit_zone_permission\u003e\n\nservers:\n  my_digitalocean_vps:\n    address: 123.123.123.123:8000\n    token: \u003cthe_digitalocean_exit_server_token\u003e\n\n  some_aws_vps:\n    address: 213.213.213.213:8000\n    token: \u003cthe_aws_exit_server_token\u003e\n\n  some_random_place:\n    address: 222.222.222.222:8000\n    token: \u003cthe_token_on_random_place\u003e\n\nprojects:\n  apache:\n    server: my_digitalocean_vps\n    hostname: sub.mydomain.com\n    upstream: http://127.0.0.1:80\n\n  my_vue_frontend:\n    server: some_aws_vps\n    hostname: project2.anotherdomain.com\n    upstream: http://127.0.0.1:3000\n```\n\nYou can configure any number of domains, servers and projects in the configuration file. You just need to make sure projects references a valid exit server. If the hostname cannot be found under CloudFlare section, the DNS management will be skipped.\n\n# Running\n\nYou can quickly expose your projects by running `letitout \u003cproject_name\u003e` command.\n\nFor example, using the example configuration file, running `letitout apache` will create an `A` record `sub.mydomain.com` that points to the DigitalOcean machine IP. Note that these records have CloudFlare proxy enabled by default.\n\nIf the `exit server` IP  is an IPv6 address, the record is created as an `AAAA` type.\n\n## Quickly (temporarily) changing settings\n\nIf you want to quickly change the hostname, the target server, or the upstream service without editing the configuration file, you can specify it using `--hostname \u003chost\u003e`, `--server \u003cserver\u003e` or `--upstream \u003cupstream\u003e`.\n\n# Examples\n\nThese examples assumes a configuration like this:\n\nServer:\n\n- `server1` at address `111.111.111.111`\n- `server2` at address `222.222.222.222`\n\nDomains:\n\n- `domain1.com`\n- `ddomain2.com`\n\nProjects:\n\n- `project1` on upstream `http://localhost:8000` with domain `project.domain1.com`\n- `project2` on upstream `http://localhost:3000` with domain `project.domain2.com`\n\n## Expose `project1`\n\n### Command\n\n`letitout project1`\n\n### Result\n\n- Creates an `A` DNS record `project.domain1.com` pointing to `111.111.111.111`\n- Tunnels `http://localhost:8000` to `server1`, accessible through `https://project.domain1.com`\n\n## Expose `project2`\n\n### Command\n\n`letitout project2`\n\n### Result\n\n- Creates an `A` DNS record `project.domain2.com` pointing to `222.222.222.222`\n- Tunnels `http://localhost:3000` to `server2`, accessible through `https://project.domain1.com`\n\n## Expose `project1` on `hey.domain2.com`\n\n### Command\n\n`letitout project1 --hostname hey.domain2.com`\n\n### Result\n\n- Creates an `A` DNS record `hey.domain2.com` pointing to `111.111.111.111`\n- Tunnels `http://localhost:3000` to `server1`, accessible through `https://hey.domain2.com`\n\n# Backlog\n\n### Complete\n\n- [x] Backup DNS record into a TXT record\n- [x] Create DNS record pointing to Exit server address\n- [x] Support multiple servers, projects and domains\n\n### Pending\n\n- [ ] Rollback DNS changed based on TXT backups on exit or command\n- [ ] Support more DNS providers\n\n# License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwolfulus%2Fletitout","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwolfulus%2Fletitout","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwolfulus%2Fletitout/lists"}