{"id":27185255,"url":"https://github.com/slchris/derp-server","last_synced_at":"2025-04-09T17:14:31.225Z","repository":{"id":62215983,"uuid":"558885337","full_name":"slchris/derp-server","owner":"slchris","description":"Tailscale/Headscale derp server","archived":false,"fork":false,"pushed_at":"2024-11-07T10:27:47.000Z","size":11,"stargazers_count":45,"open_issues_count":2,"forks_count":6,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-09T17:14:25.117Z","etag":null,"topics":["ansible-playbook","derp","headscale","tailscale"],"latest_commit_sha":null,"homepage":"","language":"Dockerfile","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/slchris.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":null,"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":"2022-10-28T14:16:46.000Z","updated_at":"2025-02-13T23:54:35.000Z","dependencies_parsed_at":"2024-08-16T16:57:41.503Z","dependency_job_id":"bc343408-263c-4b09-9173-3215f691591b","html_url":"https://github.com/slchris/derp-server","commit_stats":null,"previous_names":["slchris/drep-server","slchris/derp-server"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/slchris%2Fderp-server","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/slchris%2Fderp-server/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/slchris%2Fderp-server/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/slchris%2Fderp-server/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/slchris","download_url":"https://codeload.github.com/slchris/derp-server/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248074924,"owners_count":21043490,"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":["ansible-playbook","derp","headscale","tailscale"],"created_at":"2025-04-09T17:14:30.621Z","updated_at":"2025-04-09T17:14:31.189Z","avatar_url":"https://github.com/slchris.png","language":"Dockerfile","funding_links":[],"categories":[],"sub_categories":[],"readme":"# tailscale/headscale derp server\n\nFor fast deployment of derp servers\n\n\n# easy to deploy\n\nPreparatory\n\n- domain DNS record (A、AAAA or CNAME) e.g example.com\n- certificate\n- docker\n\n\nBefore you start you need to generate a certificate, which can be used certbot:\n\n```shell\n docker run -it --rm --name certbot \\\n  -p 80:80 \\\n  -v \"/etc/letsencrypt:/etc/letsencrypt\"  \\\n  -v \"/var/lib/letsencrypt:/var/lib/letsencrypt\" \\\n  certbot/certbot certonly\n```\n\nFollow the prompts to generate the corresponding certificate.\n\n\ndeploy derp server:\n\n```shell\ndocker run --restart always \\\n  --name derper -p 12345:443 -p 3478:3478/udp \\\n  -v /etc/letsencrypt/live/example.com/fullchain.pem:/app/certs/example.com.crt \\\n  -v /etc/letsencrypt/live/example.com/privkey.pem:/app/certs/example.com.key \\  \n  -e derp_CERT_MODE=manual \\\n  -e derp_DOMAIN=example.com \\\n  -d ghcr.io/slchris/derp-server:v1 \n```\n\n\n## easy to use\n\n\n### headscale \n\n\nFor headscale we need to modify the configuration to create a derp and then have headscale read that configuration.\n\n```shell\nvi /etc/headscale/derp.yaml\n```\n\nThe contents:\n\n```yaml\nregions:\n  900:\n    regionid: 900\n    regioncode: lv \n    regionname: Las Vegas, Nevada\n    nodes:\n      - name: 900a\n        regionid: 900\n        hostname: example.com\n        stunport: 3478\n        derpport: 12345\n```\n\nModify the headscale main configuration as follows:\n\n```yaml\n# vi /etc/headscale/config.yaml\nderp:\n  # List of externally available derp maps encoded in JSON\n  #urls:\n  #  - https://controlplane.tailscale.com/derpmap/default\n\n  # Locally available derp map files encoded in YAML\n  #\n  # This option is mostly interesting for people hosting\n  # their own derp servers:\n  # https://tailscale.com/kb/1118/custom-derp-servers/\n  #\n  # paths:\n  #   - /etc/headscale/derp-example.yaml\n  paths:\n    - /etc/headscale/derp.yaml\n\n  # If enabled, a worker will be set up to periodically\n  # refresh the given sources and update the derpmap\n  # will be set up.\n  auto_update_enabled: true\n\n  # How often should we check for derp updates?\n  update_frequency: 24h\n```\n\nfor test, we can comment out the following two lines:\n\n```yaml\n  #urls:\n  #  - https://controlplane.tailscale.com/derpmap/default\n``` \n\nRestart the headscale service:\n\n```shell\nsystemctl restart headscale\n```\n\nCheck the link status on the client:\n\n```shell\ntailscale netcheck\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fslchris%2Fderp-server","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fslchris%2Fderp-server","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fslchris%2Fderp-server/lists"}