This commit is contained in:
parent
f0128d01c0
commit
8e10d9adeb
29
states/headscale/config.sls
Normal file
29
states/headscale/config.sls
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
---
|
||||||
|
headscale-configpath-dir:
|
||||||
|
file.directory:
|
||||||
|
- name: {{ headscale.config_path }}
|
||||||
|
- user: {{ headscale.user.uid }}
|
||||||
|
- group: {{ headscale.group.gid }}
|
||||||
|
- makedirs: true
|
||||||
|
- watch_in:
|
||||||
|
- service: headscale-service
|
||||||
|
|
||||||
|
headscale-config:
|
||||||
|
file.managed:
|
||||||
|
- name: {{ headscale.config_path }}/config.yaml
|
||||||
|
- source: salt://headscale/templates/config.yml.j2
|
||||||
|
- user: {{ headscale.user.uid }}
|
||||||
|
- group: {{ headscale.group.gid }}
|
||||||
|
- template: jinja
|
||||||
|
- watch_in:
|
||||||
|
- service: headscale-service
|
||||||
|
|
||||||
|
headscale-config-derp:
|
||||||
|
file.managed:
|
||||||
|
- name: {{ headscale.config_path }}/derp.yaml
|
||||||
|
- source: salt://headscale/templates/derp.yml.j2
|
||||||
|
- user: {{ headscale.user.uid }}
|
||||||
|
- group: {{ headscale.group.gid }}
|
||||||
|
- template: jinja
|
||||||
|
- watch_in:
|
||||||
|
- service: headscale-service
|
106
states/headscale/defaults.yaml
Normal file
106
states/headscale/defaults.yaml
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
---
|
||||||
|
headscale:
|
||||||
|
enabled: true
|
||||||
|
mirror: "https://github.com/juanfont/headscale/releases/download"
|
||||||
|
install_dir: "/usr/local/apps"
|
||||||
|
release_dir: "/usr/local/apps/releases"
|
||||||
|
config_path: "/etc/headscale"
|
||||||
|
var_dir: "/var/lib/headscale"
|
||||||
|
version: "0.25.1"
|
||||||
|
os: linux
|
||||||
|
arch: amd64
|
||||||
|
user:
|
||||||
|
name: headscale
|
||||||
|
uid: 915
|
||||||
|
group:
|
||||||
|
name: headscale
|
||||||
|
gid: 915
|
||||||
|
config:
|
||||||
|
server_url: http://127.0.0.1:8080
|
||||||
|
listen_addr: 127.0.0.1:8080
|
||||||
|
metrics_listen_addr: 127.0.0.1:9090
|
||||||
|
grpc_listen_addr: 127.0.0.1:50443
|
||||||
|
grpc_allow_insecure: false
|
||||||
|
noise:
|
||||||
|
private_key_path: /var/lib/headscale/noise_private.key
|
||||||
|
prefixes:
|
||||||
|
v4: 100.64.0.0/10
|
||||||
|
v6: fd7a:115c:a1e0::/48
|
||||||
|
allocation: sequential
|
||||||
|
derp:
|
||||||
|
server:
|
||||||
|
enabled: false
|
||||||
|
region_id: 999
|
||||||
|
region_code: "headscale"
|
||||||
|
region_name: "Headscale Embedded DERP"
|
||||||
|
stun_listen_addr: "0.0.0.0:3478"
|
||||||
|
private_key_path: /var/lib/headscale/derp_server_private.key
|
||||||
|
automatically_add_embedded_derp_region: true
|
||||||
|
ipv4: 1.2.3.4
|
||||||
|
ipv6: 2001:db8::1
|
||||||
|
urls:
|
||||||
|
- https://controlplane.tailscale.com/derpmap/default
|
||||||
|
paths: []
|
||||||
|
auto_update_enabled: true
|
||||||
|
update_frequency: 24h
|
||||||
|
disable_check_updates: false
|
||||||
|
ephemeral_node_inactivity_timeout: 30m
|
||||||
|
database:
|
||||||
|
type: sqlite
|
||||||
|
debug: false
|
||||||
|
gorm:
|
||||||
|
prepare_stmt: true
|
||||||
|
parameterized_queries: true
|
||||||
|
skip_err_record_not_found: true
|
||||||
|
slow_threshold: 1000
|
||||||
|
sqlite:
|
||||||
|
path: /var/lib/headscale/db.sqlite
|
||||||
|
write_ahead_log: true
|
||||||
|
wal_autocheckpoint: 1000
|
||||||
|
acme_url: https://acme-v02.api.letsencrypt.org/directory
|
||||||
|
acme_email: ""
|
||||||
|
tls_letsencrypt_hostname: ""
|
||||||
|
tls_letsencrypt_cache_dir: /var/lib/headscale/cache
|
||||||
|
tls_letsencrypt_challenge_type: HTTP-01
|
||||||
|
tls_letsencrypt_listen: ":http"
|
||||||
|
tls_cert_path: ""
|
||||||
|
tls_key_path: ""
|
||||||
|
log:
|
||||||
|
format: text
|
||||||
|
level: info
|
||||||
|
policy:
|
||||||
|
mode: file
|
||||||
|
path: ""
|
||||||
|
dns:
|
||||||
|
magic_dns: true
|
||||||
|
base_domain: example.com
|
||||||
|
nameservers:
|
||||||
|
global:
|
||||||
|
- 1.1.1.1
|
||||||
|
- 1.0.0.1
|
||||||
|
- 2606:4700:4700::1111
|
||||||
|
- 2606:4700:4700::1001
|
||||||
|
split:
|
||||||
|
{}
|
||||||
|
search_domains: []
|
||||||
|
extra_records: []
|
||||||
|
unix_socket: /var/run/headscale/headscale.sock
|
||||||
|
unix_socket_permission: "0770"
|
||||||
|
logtail:
|
||||||
|
enabled: false
|
||||||
|
randomize_client_port: false
|
||||||
|
derp_config:
|
||||||
|
regions:
|
||||||
|
900:
|
||||||
|
regionid: 900
|
||||||
|
regioncode: custom
|
||||||
|
regionname: My Region
|
||||||
|
nodes:
|
||||||
|
- name: 900a
|
||||||
|
regionid: 900
|
||||||
|
hostname: myderp.mydomain.no
|
||||||
|
ipv4: 123.123.123.123
|
||||||
|
ipv6: "2604:a880:400:d1::828:b001"
|
||||||
|
stunport: 0
|
||||||
|
stunonly: false
|
||||||
|
derpport: 0
|
5
states/headscale/init.sls
Normal file
5
states/headscale/init.sls
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
include:
|
||||||
|
- .install
|
||||||
|
- .config
|
||||||
|
- .service
|
50
states/headscale/install.sls
Normal file
50
states/headscale/install.sls
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
---
|
||||||
|
{%- from "headscale/map.jinja" import headscale with context %}
|
||||||
|
headscale-group:
|
||||||
|
group.present:
|
||||||
|
- name: headscale
|
||||||
|
- gid: {{ headscale.group.gid }}
|
||||||
|
- watch_in:
|
||||||
|
- service: headscale-service
|
||||||
|
|
||||||
|
headscale-user:
|
||||||
|
user.present:
|
||||||
|
- name: headscale
|
||||||
|
- uid: {{ headscale.user.uid }}
|
||||||
|
- gid: {{ headscale.group.gid }}
|
||||||
|
- allow_uid_change: true
|
||||||
|
- allow_gid_change: true
|
||||||
|
- home: /var/lib/headscale
|
||||||
|
- watch_in:
|
||||||
|
- service: headscale-service
|
||||||
|
|
||||||
|
headscale-release-dir:
|
||||||
|
file.directory:
|
||||||
|
- name: {{ headscale.release_dir }}/headscale-{{ headscale.version }}
|
||||||
|
|
||||||
|
headscale-install-dir:
|
||||||
|
file.directory:
|
||||||
|
- name: {{ headscale.release_install }}
|
||||||
|
|
||||||
|
headscale-bin-download:
|
||||||
|
file.managed:
|
||||||
|
- name: {{ headscale.release_dir }}/headscale-{{ headscale.version }}/headscale
|
||||||
|
- source: {{ headscale.mirror }}/v{{ headscale.version }}/headscale_{{ headscale.version }}_{{ headscale.os }}_{{ headscale.arch }}
|
||||||
|
- skip_verify: true
|
||||||
|
- user: root
|
||||||
|
- group: root
|
||||||
|
- if_missing: {{ headscale.release_dir }}/headscale-{{ headscale.version }}/headscale
|
||||||
|
- watch_in:
|
||||||
|
- service: headscale-service
|
||||||
|
|
||||||
|
headscale-bin-symlink:
|
||||||
|
file.symlink:
|
||||||
|
- name: {{ headscale.install_dir }}/headscale
|
||||||
|
- target: {{ headscale.release_dir }}/headscale-{{ headscale.version }}/headscale
|
||||||
|
- force: true
|
||||||
|
|
||||||
|
headscale-cleanup:
|
||||||
|
software.cleanup:
|
||||||
|
- name: headscale
|
||||||
|
- path: {{ headscale.release_dir }}
|
||||||
|
- version: "{{ headscale.version }}"
|
3
states/headscale/kernelmap.yaml
Normal file
3
states/headscale/kernelmap.yaml
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
---
|
||||||
|
Linux:
|
||||||
|
os: "linux"
|
14
states/headscale/map.jinja
Normal file
14
states/headscale/map.jinja
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
{%- import_yaml "headscale/defaults.yaml" as default_settings -%}
|
||||||
|
|
||||||
|
{%- import_yaml "headscale/kernelmap.yaml" as kernelmap -%}
|
||||||
|
{%- import_yaml "headscale/osarchmap.yaml" as osarchmap -%}
|
||||||
|
|
||||||
|
{%- set defaults = salt['grains.filter_by'](default_settings,
|
||||||
|
default='headscale',
|
||||||
|
merge=salt['grains.filter_by'](osarchmap, grain='osarch',
|
||||||
|
merge=salt['grains.filter_by'](kernelmap, grain='kernel')
|
||||||
|
)
|
||||||
|
)
|
||||||
|
-%}
|
||||||
|
|
||||||
|
{%- set headscale = salt['pillar.get']('headscale', default=defaults, merge=True) -%}
|
24
states/headscale/osarchmap.yaml
Normal file
24
states/headscale/osarchmap.yaml
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
---
|
||||||
|
amd64:
|
||||||
|
arch: "amd64"
|
||||||
|
|
||||||
|
x86_64:
|
||||||
|
arch: "amd64"
|
||||||
|
|
||||||
|
386:
|
||||||
|
arch: "386"
|
||||||
|
|
||||||
|
arm64:
|
||||||
|
arch: "arm64"
|
||||||
|
|
||||||
|
aarch64:
|
||||||
|
arch: "arm64"
|
||||||
|
|
||||||
|
armv6l:
|
||||||
|
arch: "arm"
|
||||||
|
|
||||||
|
armv7l:
|
||||||
|
arch: "arm"
|
||||||
|
|
||||||
|
armhf:
|
||||||
|
arch: "arm"
|
15
states/headscale/service.sls
Normal file
15
states/headscale/service.sls
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
---
|
||||||
|
{%- from "headscale/map.jinja" import headscale with context %}
|
||||||
|
headscale-service-file:
|
||||||
|
file.managed:
|
||||||
|
- name: /etc/systemd/system/headscale.service
|
||||||
|
- source: salt://headscale/templates/headscale.service.j2
|
||||||
|
- user: root
|
||||||
|
- group: root
|
||||||
|
- mode: 644
|
||||||
|
- template: jinja
|
||||||
|
|
||||||
|
headscale-service:
|
||||||
|
service.{{ 'running' if headscale.enabled else 'dead' }}:
|
||||||
|
- name: headscale
|
||||||
|
- enable: {{ headscale.enabled }}
|
4
states/headscale/templates/config.yaml.j2
Normal file
4
states/headscale/templates/config.yaml.j2
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
{%- from "headscale/map.jinja" import headscale with context -%}
|
||||||
|
## {{ salt['pillar.get']('salt_managed', default='Salt Managed') }}
|
||||||
|
---
|
||||||
|
{{ headscale.config|yaml(False) }}
|
4
states/headscale/templates/derp.yaml.j2
Normal file
4
states/headscale/templates/derp.yaml.j2
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
{%- from "headscale/map.jinja" import headscale with context -%}
|
||||||
|
## {{ salt['pillar.get']('salt_managed', default='Salt Managed') }}
|
||||||
|
---
|
||||||
|
{{ headscale.derp_config|yaml(False) }}
|
51
states/headscale/templates/headscale.service.j2
Normal file
51
states/headscale/templates/headscale.service.j2
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
{%- from "headscale/map.jinja" import headscale with context -%}
|
||||||
|
## {{ salt['pillar.get']('salt_managed', default='Salt Managed') }}
|
||||||
|
[Unit]
|
||||||
|
After=syslog.target
|
||||||
|
After=network.target
|
||||||
|
Description=headscale coordination server for Tailscale
|
||||||
|
X-Restart-Triggers=/etc/headscale/config.yaml
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User={{ headscale.user.name }}
|
||||||
|
Group={{ headscale.group.name }}
|
||||||
|
LimitNOFILE=65536
|
||||||
|
ExecStart={{ headscale.install_dir }}/headscale/headscale serve
|
||||||
|
ExecReload=/usr/bin/kill -HUP $MAINPID
|
||||||
|
Restart=always
|
||||||
|
RestartSec=5
|
||||||
|
AmbientCapabilities=CAP_NET_BIND_SERVICE CAP_CHOWN
|
||||||
|
CapabilityBoundingSet=CAP_NET_BIND_SERVICE CAP_CHOWN
|
||||||
|
LockPersonality=true
|
||||||
|
NoNewPrivileges=true
|
||||||
|
PrivateDevices=true
|
||||||
|
PrivateMounts=true
|
||||||
|
PrivateTmp=true
|
||||||
|
ProcSubset=pid
|
||||||
|
ProtectClock=true
|
||||||
|
ProtectControlGroups=true
|
||||||
|
ProtectHome=true
|
||||||
|
ProtectHostname=true
|
||||||
|
ProtectKernelLogs=true
|
||||||
|
ProtectKernelModules=true
|
||||||
|
ProtectKernelTunables=true
|
||||||
|
ProtectProc=invisible
|
||||||
|
ProtectSystem=strict
|
||||||
|
RemoveIPC=true
|
||||||
|
RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX
|
||||||
|
RestrictNamespaces=true
|
||||||
|
RestrictRealtime=true
|
||||||
|
RestrictSUIDSGID=true
|
||||||
|
RuntimeDirectory=headscale
|
||||||
|
RuntimeDirectoryMode=0750
|
||||||
|
StateDirectory=headscale
|
||||||
|
StateDirectoryMode=0750
|
||||||
|
SystemCallArchitectures=native
|
||||||
|
SystemCallFilter=@chown
|
||||||
|
SystemCallFilter=@system-service
|
||||||
|
SystemCallFilter=~@privileged
|
||||||
|
UMask=0077
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
Loading…
Reference in New Issue
Block a user