mirror of
				https://github.com/juanfont/headscale.git
				synced 2025-10-28 10:51:44 +01:00 
			
		
		
		
	Add k8s deployment, standalone app Dockerfile.
Tested with Rancher k3s. See k8s/README.md for site configuration and deployment instructions. Add cert-manager, tls, remote headscale script.
This commit is contained in:
		
							parent
							
								
									a63fb6b007
								
							
						
					
					
						commit
						c64d756ea7
					
				
							
								
								
									
										12
									
								
								Dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								Dockerfile
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,12 @@ | ||||
| FROM golang:latest AS build | ||||
| ENV GOPATH /go | ||||
| COPY . /go/src/headscale | ||||
| WORKDIR /go/src/headscale | ||||
| RUN go install -a -ldflags="-extldflags=-static" -tags netgo,sqlite_omit_load_extension ./cmd/headscale | ||||
| RUN test -e /go/bin/headscale | ||||
| 
 | ||||
| FROM scratch | ||||
| COPY --from=build /go/bin/headscale /go/bin/headscale | ||||
| ENV TZ UTC | ||||
| EXPOSE 8080/tcp | ||||
| ENTRYPOINT ["/go/bin/headscale"] | ||||
							
								
								
									
										2
									
								
								k8s/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								k8s/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,2 @@ | ||||
| /**/site | ||||
| /**/secrets | ||||
							
								
								
									
										99
									
								
								k8s/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								k8s/README.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,99 @@ | ||||
| # Deploying Headscale on Kubernetes | ||||
| 
 | ||||
| This directory contains [Kustomize](https://kustomize.io) templates that deploy | ||||
| Headscale in various configurations. | ||||
| 
 | ||||
| These templates currently support Rancher k3s. Other clusters may require | ||||
| adaptation, especially around volume claims and ingress. | ||||
| 
 | ||||
| Commands below assume this directory is your current working directory. | ||||
| 
 | ||||
| # Generate secrets and site configuration | ||||
| 
 | ||||
| Run `./init.bash` to generate keys, passwords, and site configuration files. | ||||
| 
 | ||||
| Edit `base/site/public.env`, changing `public-hostname` to the public DNS name | ||||
| that will be used for your headscale deployment. | ||||
| 
 | ||||
| Set `public-proto` to "https" if you're planning to use TLS & Let's Encrypt. | ||||
| 
 | ||||
| Configure DERP servers by editing `base/site/derp.yaml` if needed. | ||||
| 
 | ||||
| # Add the image to the registry | ||||
| 
 | ||||
| You'll somehow need to get `headscale:latest` into your cluster image registry. | ||||
| 
 | ||||
| An easy way to do this with k3s: | ||||
| - Reconfigure k3s to use docker instead of containerd (`k3s server --docker`) | ||||
| - `docker build -t headscale:latest ..` from here | ||||
| 
 | ||||
| # Create the namespace | ||||
| 
 | ||||
| If it doesn't already exist, `kubectl create ns headscale`. | ||||
| 
 | ||||
| # Deploy headscale | ||||
| 
 | ||||
| ## sqlite | ||||
| 
 | ||||
| `kubectl -n headscale apply -k ./sqlite` | ||||
| 
 | ||||
| ## postgres | ||||
| 
 | ||||
| `kubectl -n headscale apply -k ./postgres` | ||||
| 
 | ||||
| # TLS & Let's Encrypt | ||||
| 
 | ||||
| Test a staging certificate with your configured DNS name and Let's Encrypt. | ||||
| 
 | ||||
| `kubectl -n headscale apply -k ./staging-tls` | ||||
| 
 | ||||
| Replace with a production certificate. | ||||
| 
 | ||||
| `kubectl -n headscale apply -k ./production-tls` | ||||
| 
 | ||||
| ## Static / custom TLS certificates | ||||
| 
 | ||||
| Only Let's Encrypt is supported. If you need other TLS settings, modify or patch the ingress. | ||||
| 
 | ||||
| # Administration | ||||
| 
 | ||||
| Use the wrapper script to remotely operate headscale to perform administrative | ||||
| tasks like creating namespaces, authkeys, etc. | ||||
| 
 | ||||
| ``` | ||||
| [c@nix-slate:~/Projects/headscale/k8s]$ ./headscale.bash  | ||||
| 
 | ||||
| headscale is an open source implementation of the Tailscale control server | ||||
| 
 | ||||
| Juan Font Alonso <juanfontalonso@gmail.com> - 2021 | ||||
| https://gitlab.com/juanfont/headscale | ||||
| 
 | ||||
| Usage: | ||||
|   headscale [command] | ||||
| 
 | ||||
| Available Commands: | ||||
|   help        Help about any command | ||||
|   namespace   Manage the namespaces of Headscale | ||||
|   node        Manage the nodes of Headscale | ||||
|   preauthkey  Handle the preauthkeys in Headscale | ||||
|   routes      Manage the routes of Headscale | ||||
|   serve       Launches the headscale server | ||||
|   version     Print the version. | ||||
| 
 | ||||
| Flags: | ||||
|   -h, --help            help for headscale | ||||
|   -o, --output string   Output format. Empty for human-readable, 'json' or 'json-line' | ||||
| 
 | ||||
| Use "headscale [command] --help" for more information about a command. | ||||
| 
 | ||||
| ``` | ||||
| 
 | ||||
| # TODO / Ideas | ||||
| 
 | ||||
| - Github action to publish the docker image | ||||
| - Interpolate `email:` option to the ClusterIssuer from site configuration. | ||||
|   This probably needs to be done with a transformer, kustomize vars don't seem to work. | ||||
| - Add kustomize examples for cloud-native ingress, load balancer | ||||
| - CockroachDB for the backend | ||||
| - DERP server deployment | ||||
| - Tor hidden service | ||||
							
								
								
									
										8
									
								
								k8s/base/configmap.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								k8s/base/configmap.yaml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,8 @@ | ||||
| apiVersion: v1 | ||||
| kind: ConfigMap | ||||
| metadata: | ||||
|   name: headscale-config | ||||
| data: | ||||
|   server_url: $(PUBLIC_PROTO)://$(PUBLIC_HOSTNAME) | ||||
|   listen_addr: "0.0.0.0:8080" | ||||
|   ephemeral_node_inactivity_timeout: "30m" | ||||
							
								
								
									
										18
									
								
								k8s/base/ingress.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								k8s/base/ingress.yaml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,18 @@ | ||||
| apiVersion: networking.k8s.io/v1 | ||||
| kind: Ingress | ||||
| metadata: | ||||
|   name: headscale | ||||
|   annotations: | ||||
|     kubernetes.io/ingress.class: traefik | ||||
| spec: | ||||
|   rules: | ||||
|   - host: $(PUBLIC_HOSTNAME) | ||||
|     http: | ||||
|       paths: | ||||
|       - backend: | ||||
|           service: | ||||
|             name: headscale | ||||
|             port: | ||||
|               number: 8080 | ||||
|         path: / | ||||
|         pathType: Prefix | ||||
							
								
								
									
										42
									
								
								k8s/base/kustomization.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								k8s/base/kustomization.yaml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,42 @@ | ||||
| namespace: headscale | ||||
| resources: | ||||
| - configmap.yaml | ||||
| - ingress.yaml | ||||
| - service.yaml | ||||
| generatorOptions: | ||||
|   disableNameSuffixHash: true | ||||
| configMapGenerator: | ||||
| - name: headscale-site | ||||
|   files: | ||||
|   - derp.yaml=site/derp.yaml | ||||
|   envs: | ||||
|   - site/public.env | ||||
| - name: headscale-etc | ||||
|   literals: | ||||
|   - config.json={} | ||||
| secretGenerator: | ||||
| - name: headscale | ||||
|   files: | ||||
|   - secrets/private-key | ||||
| vars: | ||||
| - name: PUBLIC_PROTO | ||||
|   objRef: | ||||
|     kind: ConfigMap | ||||
|     name: headscale-site | ||||
|     apiVersion: v1 | ||||
|   fieldRef: | ||||
|     fieldPath: data.public-proto | ||||
| - name: PUBLIC_HOSTNAME | ||||
|   objRef: | ||||
|     kind: ConfigMap | ||||
|     name: headscale-site | ||||
|     apiVersion: v1 | ||||
|   fieldRef: | ||||
|     fieldPath: data.public-hostname | ||||
| - name: CONTACT_EMAIL | ||||
|   objRef: | ||||
|     kind: ConfigMap | ||||
|     name: headscale-site | ||||
|     apiVersion: v1 | ||||
|   fieldRef: | ||||
|     fieldPath: data.contact-email | ||||
							
								
								
									
										13
									
								
								k8s/base/service.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								k8s/base/service.yaml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,13 @@ | ||||
| apiVersion: v1 | ||||
| kind: Service | ||||
| metadata: | ||||
|   name: headscale | ||||
|   labels: | ||||
|     app: headscale | ||||
| spec: | ||||
|   selector: | ||||
|     app: headscale | ||||
|   ports: | ||||
|   - name: http | ||||
|     targetPort: http | ||||
|     port: 8080 | ||||
							
								
								
									
										3
									
								
								k8s/headscale.bash
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										3
									
								
								k8s/headscale.bash
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,3 @@ | ||||
| #!/usr/bin/env bash | ||||
| set -eu | ||||
| exec kubectl -n headscale exec -ti pod/headscale-0 -- /go/bin/headscale "$@" | ||||
							
								
								
									
										22
									
								
								k8s/init.bash
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										22
									
								
								k8s/init.bash
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,22 @@ | ||||
| #!/usr/bin/env bash | ||||
| set -eux | ||||
| cd $(dirname $0) | ||||
| 
 | ||||
| umask 022 | ||||
| mkdir -p base/site/ | ||||
| [ ! -e base/site/public.env ] && ( | ||||
|     cat >base/site/public.env <<EOF | ||||
| public-hostname=localhost | ||||
| public-proto=http | ||||
| contact-email=headscale@example.com | ||||
| EOF | ||||
| ) | ||||
| [ ! -e base/site/derp.yaml ] && cp ../derp.yaml base/site/derp.yaml | ||||
| 
 | ||||
| umask 077 | ||||
| mkdir -p base/secrets/ | ||||
| [ ! -e base/secrets/private-key ] && ( | ||||
|     wg genkey > base/secrets/private-key | ||||
| ) | ||||
| mkdir -p postgres/secrets/ | ||||
| [ ! -e postgres/secrets/password ] && (head -c 32 /dev/urandom | base64 -w0 > postgres/secrets/password) | ||||
							
								
								
									
										3
									
								
								k8s/install-cert-manager.bash
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										3
									
								
								k8s/install-cert-manager.bash
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,3 @@ | ||||
| #!/usr/bin/env bash | ||||
| set -eux | ||||
| kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.4.0/cert-manager.yaml | ||||
							
								
								
									
										78
									
								
								k8s/postgres/deployment.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								k8s/postgres/deployment.yaml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,78 @@ | ||||
| apiVersion: apps/v1 | ||||
| kind: Deployment | ||||
| metadata: | ||||
|   name: headscale | ||||
| spec: | ||||
|   replicas: 2 | ||||
|   selector: | ||||
|     matchLabels: | ||||
|       app: headscale | ||||
|   template: | ||||
|     metadata: | ||||
|       labels: | ||||
|         app: headscale | ||||
|     spec: | ||||
|       containers: | ||||
|       - name: headscale | ||||
|         image: "headscale:latest" | ||||
|         imagePullPolicy: IfNotPresent | ||||
|         command: ["/go/bin/headscale", "serve"] | ||||
|         env: | ||||
|         - name: SERVER_URL | ||||
|           value: $(PUBLIC_PROTO)://$(PUBLIC_HOSTNAME) | ||||
|         - name: LISTEN_ADDR | ||||
|           valueFrom: | ||||
|             configMapKeyRef: | ||||
|               name: headscale-config | ||||
|               key: listen_addr | ||||
|         - name: PRIVATE_KEY_PATH | ||||
|           value: /vol/secret/private-key | ||||
|         - name: DERP_MAP_PATH | ||||
|           value: /vol/config/derp.yaml | ||||
|         - name: EPHEMERAL_NODE_INACTIVITY_TIMEOUT | ||||
|           valueFrom: | ||||
|             configMapKeyRef: | ||||
|               name: headscale-config | ||||
|               key: ephemeral_node_inactivity_timeout | ||||
|         - name: DB_TYPE | ||||
|           value: postgres | ||||
|         - name: DB_HOST | ||||
|           value: postgres.headscale.svc.cluster.local | ||||
|         - name: DB_PORT | ||||
|           value: "5432" | ||||
|         - name: DB_USER | ||||
|           value: headscale | ||||
|         - name: DB_PASS | ||||
|           valueFrom: | ||||
|             secretKeyRef: | ||||
|               name: postgresql | ||||
|               key: password | ||||
|         - name: DB_NAME | ||||
|           value: headscale | ||||
|         ports: | ||||
|         - name: http | ||||
|           protocol: TCP | ||||
|           containerPort: 8080 | ||||
|         livenessProbe: | ||||
|           tcpSocket: | ||||
|             port: http | ||||
|           initialDelaySeconds: 30 | ||||
|           timeoutSeconds: 5 | ||||
|           periodSeconds: 15 | ||||
|         volumeMounts: | ||||
|         - name: config | ||||
|           mountPath: /vol/config | ||||
|         - name: secret | ||||
|           mountPath: /vol/secret | ||||
|         - name: etc | ||||
|           mountPath: /etc/headscale | ||||
|       volumes: | ||||
|       - name: config | ||||
|         configMap: | ||||
|           name: headscale-site | ||||
|       - name: etc | ||||
|         configMap: | ||||
|           name: headscale-etc | ||||
|       - name: secret | ||||
|         secret: | ||||
|           secretName: headscale | ||||
							
								
								
									
										13
									
								
								k8s/postgres/kustomization.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								k8s/postgres/kustomization.yaml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,13 @@ | ||||
| namespace: headscale | ||||
| bases: | ||||
| - ../base | ||||
| resources: | ||||
| - deployment.yaml | ||||
| - postgres-service.yaml | ||||
| - postgres-statefulset.yaml | ||||
| generatorOptions: | ||||
|   disableNameSuffixHash: true | ||||
| secretGenerator: | ||||
| - name: postgresql | ||||
|   files: | ||||
|   - secrets/password | ||||
							
								
								
									
										13
									
								
								k8s/postgres/postgres-service.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								k8s/postgres/postgres-service.yaml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,13 @@ | ||||
| apiVersion: v1 | ||||
| kind: Service | ||||
| metadata: | ||||
|   name: postgres | ||||
|   labels: | ||||
|     app: postgres | ||||
| spec: | ||||
|   selector: | ||||
|     app: postgres | ||||
|   ports: | ||||
|   - name: postgres | ||||
|     targetPort: postgres | ||||
|     port: 5432 | ||||
							
								
								
									
										49
									
								
								k8s/postgres/postgres-statefulset.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								k8s/postgres/postgres-statefulset.yaml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,49 @@ | ||||
| apiVersion: apps/v1 | ||||
| kind: StatefulSet | ||||
| metadata: | ||||
|   name: postgres | ||||
| spec: | ||||
|   serviceName: postgres | ||||
|   replicas: 1 | ||||
|   selector: | ||||
|     matchLabels: | ||||
|       app: postgres | ||||
|   template: | ||||
|     metadata: | ||||
|       labels: | ||||
|         app: postgres | ||||
|     spec: | ||||
|       containers: | ||||
|       - name: postgres | ||||
|         image: "postgres:13" | ||||
|         imagePullPolicy: IfNotPresent | ||||
|         env: | ||||
|         - name: POSTGRES_PASSWORD | ||||
|           valueFrom: | ||||
|             secretKeyRef: | ||||
|               name: postgresql | ||||
|               key: password | ||||
|         - name: POSTGRES_USER | ||||
|           value: headscale | ||||
|         ports: | ||||
|         - name: postgres | ||||
|           protocol: TCP | ||||
|           containerPort: 5432 | ||||
|         livenessProbe: | ||||
|           tcpSocket: | ||||
|             port: 5432 | ||||
|           initialDelaySeconds: 30 | ||||
|           timeoutSeconds: 5 | ||||
|           periodSeconds: 15 | ||||
|         volumeMounts: | ||||
|         - name: pgdata | ||||
|           mountPath: /var/lib/postgresql/data | ||||
|   volumeClaimTemplates: | ||||
|   - metadata: | ||||
|       name: pgdata | ||||
|     spec: | ||||
|       storageClassName: local-path | ||||
|       accessModes: ["ReadWriteOnce"] | ||||
|       resources: | ||||
|         requests: | ||||
|           storage: 1Gi | ||||
							
								
								
									
										11
									
								
								k8s/production-tls/ingress-patch.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								k8s/production-tls/ingress-patch.yaml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,11 @@ | ||||
| kind: Ingress | ||||
| metadata: | ||||
|   name: headscale | ||||
|   annotations: | ||||
|     cert-manager.io/cluster-issuer: letsencrypt-production | ||||
|     traefik.ingress.kubernetes.io/router.tls: "true" | ||||
| spec: | ||||
|   tls: | ||||
|   - hosts: | ||||
|     - $(PUBLIC_HOSTNAME) | ||||
|     secretName: production-cert | ||||
							
								
								
									
										9
									
								
								k8s/production-tls/kustomization.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								k8s/production-tls/kustomization.yaml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,9 @@ | ||||
| namespace: headscale | ||||
| bases: | ||||
| - ../base | ||||
| resources: | ||||
| - production-issuer.yaml | ||||
| patches: | ||||
| - path: ingress-patch.yaml | ||||
|   target: | ||||
|     kind: Ingress | ||||
							
								
								
									
										16
									
								
								k8s/production-tls/production-issuer.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								k8s/production-tls/production-issuer.yaml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,16 @@ | ||||
| apiVersion: cert-manager.io/v1 | ||||
| kind: ClusterIssuer | ||||
| metadata: | ||||
|   name: letsencrypt-production | ||||
| spec: | ||||
|   acme: | ||||
|     # TODO: figure out how to get kustomize to interpolate this, or use a transformer | ||||
|     #email: $(CONTACT_EMAIL) | ||||
|     server: https://acme-v02.api.letsencrypt.org/directory | ||||
|     privateKeySecretRef: | ||||
|       # Secret resource used to store the account's private key. | ||||
|       name: letsencrypt-production-acc-key | ||||
|     solvers: | ||||
|     - http01: | ||||
|         ingress: | ||||
|           class: traefik | ||||
							
								
								
									
										5
									
								
								k8s/sqlite/kustomization.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								k8s/sqlite/kustomization.yaml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,5 @@ | ||||
| namespace: headscale | ||||
| bases: | ||||
| - ../base | ||||
| resources: | ||||
| - statefulset.yaml | ||||
							
								
								
									
										79
									
								
								k8s/sqlite/statefulset.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								k8s/sqlite/statefulset.yaml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,79 @@ | ||||
| apiVersion: apps/v1 | ||||
| kind: StatefulSet | ||||
| metadata: | ||||
|   name: headscale | ||||
| spec: | ||||
|   serviceName: headscale | ||||
|   replicas: 1 | ||||
|   selector: | ||||
|     matchLabels: | ||||
|       app: headscale | ||||
|   template: | ||||
|     metadata: | ||||
|       labels: | ||||
|         app: headscale | ||||
|     spec: | ||||
|       containers: | ||||
|       - name: headscale | ||||
|         image: "headscale:latest" | ||||
|         imagePullPolicy: IfNotPresent | ||||
|         command: ["/go/bin/headscale", "serve"] | ||||
|         env: | ||||
|         - name: SERVER_URL | ||||
|           value: $(PUBLIC_PROTO)://$(PUBLIC_HOSTNAME) | ||||
|         - name: LISTEN_ADDR | ||||
|           valueFrom: | ||||
|             configMapKeyRef: | ||||
|               name: headscale-config | ||||
|               key: listen_addr | ||||
|         - name: PRIVATE_KEY_PATH | ||||
|           value: /vol/secret/private-key | ||||
|         - name: DERP_MAP_PATH | ||||
|           value: /vol/config/derp.yaml | ||||
|         - name: EPHEMERAL_NODE_INACTIVITY_TIMEOUT | ||||
|           valueFrom: | ||||
|             configMapKeyRef: | ||||
|               name: headscale-config | ||||
|               key: ephemeral_node_inactivity_timeout | ||||
|         - name: DB_TYPE | ||||
|           value: sqlite3 | ||||
|         - name: DB_PATH | ||||
|           value: /vol/data/db.sqlite | ||||
|         ports: | ||||
|         - name: http | ||||
|           protocol: TCP | ||||
|           containerPort: 8080 | ||||
|         livenessProbe: | ||||
|           tcpSocket: | ||||
|             port: http | ||||
|           initialDelaySeconds: 30 | ||||
|           timeoutSeconds: 5 | ||||
|           periodSeconds: 15 | ||||
|         volumeMounts: | ||||
|         - name: config | ||||
|           mountPath: /vol/config | ||||
|         - name: data | ||||
|           mountPath: /vol/data | ||||
|         - name: secret | ||||
|           mountPath: /vol/secret | ||||
|         - name: etc | ||||
|           mountPath: /etc/headscale | ||||
|       volumes: | ||||
|       - name: config | ||||
|         configMap: | ||||
|           name: headscale-site | ||||
|       - name: etc | ||||
|         configMap: | ||||
|           name: headscale-etc | ||||
|       - name: secret | ||||
|         secret: | ||||
|           secretName: headscale | ||||
|   volumeClaimTemplates: | ||||
|   - metadata: | ||||
|       name: data | ||||
|     spec: | ||||
|       storageClassName: local-path | ||||
|       accessModes: ["ReadWriteOnce"] | ||||
|       resources: | ||||
|         requests: | ||||
|           storage: 1Gi | ||||
							
								
								
									
										11
									
								
								k8s/staging-tls/ingress-patch.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								k8s/staging-tls/ingress-patch.yaml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,11 @@ | ||||
| kind: Ingress | ||||
| metadata: | ||||
|   name: headscale | ||||
|   annotations: | ||||
|     cert-manager.io/cluster-issuer: letsencrypt-staging | ||||
|     traefik.ingress.kubernetes.io/router.tls: "true" | ||||
| spec: | ||||
|   tls: | ||||
|   - hosts: | ||||
|     - $(PUBLIC_HOSTNAME) | ||||
|     secretName: staging-cert | ||||
							
								
								
									
										9
									
								
								k8s/staging-tls/kustomization.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								k8s/staging-tls/kustomization.yaml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,9 @@ | ||||
| namespace: headscale | ||||
| bases: | ||||
| - ../base | ||||
| resources: | ||||
| - staging-issuer.yaml | ||||
| patches: | ||||
| - path: ingress-patch.yaml | ||||
|   target: | ||||
|     kind: Ingress | ||||
							
								
								
									
										16
									
								
								k8s/staging-tls/staging-issuer.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								k8s/staging-tls/staging-issuer.yaml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,16 @@ | ||||
| apiVersion: cert-manager.io/v1 | ||||
| kind: ClusterIssuer | ||||
| metadata: | ||||
|   name: letsencrypt-staging | ||||
| spec: | ||||
|   acme: | ||||
|     # TODO: figure out how to get kustomize to interpolate this, or use a transformer | ||||
|     #email: $(CONTACT_EMAIL) | ||||
|     server: https://acme-staging-v02.api.letsencrypt.org/directory | ||||
|     privateKeySecretRef: | ||||
|       # Secret resource used to store the account's private key. | ||||
|       name: letsencrypt-staging-acc-key | ||||
|     solvers: | ||||
|     - http01: | ||||
|         ingress: | ||||
|           class: traefik | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user