feat: DynamicDNS | add to utility-services stack
This commit is contained in:
110
utility-services/dynamic-dns/index.ts
Normal file
110
utility-services/dynamic-dns/index.ts
Normal file
@@ -0,0 +1,110 @@
|
||||
import { Construct } from "constructs";
|
||||
import { KubernetesProvider } from "@cdktf/provider-kubernetes/lib/provider";
|
||||
|
||||
import { OnePasswordSecret } from "../../utils";
|
||||
import { ConfigMapV1 } from "@cdktf/provider-kubernetes/lib/config-map-v1";
|
||||
import { DeploymentV1 } from "@cdktf/provider-kubernetes/lib/deployment-v1";
|
||||
|
||||
type DynamicDNSOptions = {
|
||||
provider: KubernetesProvider;
|
||||
name: string;
|
||||
namespace: string;
|
||||
records: string[];
|
||||
};
|
||||
|
||||
export class DynamicDNS extends Construct {
|
||||
constructor(scope: Construct, id: string, options: DynamicDNSOptions) {
|
||||
super(scope, id);
|
||||
|
||||
const { provider, name, namespace, records } = options;
|
||||
|
||||
new OnePasswordSecret(this, "cloudflare-token", {
|
||||
provider,
|
||||
name: "ddns-cloudflare-token",
|
||||
namespace: options.namespace,
|
||||
itemPath: "vaults/Lab/items/cloudflare",
|
||||
});
|
||||
|
||||
new ConfigMapV1(this, "ddns-configmap", {
|
||||
provider,
|
||||
metadata: {
|
||||
name,
|
||||
namespace,
|
||||
},
|
||||
data: {
|
||||
DOMAINS: records.join(","),
|
||||
PROXIED: "false",
|
||||
},
|
||||
});
|
||||
|
||||
new DeploymentV1(this, "ddns-deployment", {
|
||||
provider,
|
||||
metadata: {
|
||||
name,
|
||||
namespace,
|
||||
},
|
||||
spec: {
|
||||
selector: {
|
||||
matchLabels: {
|
||||
app: name,
|
||||
},
|
||||
},
|
||||
template: {
|
||||
metadata: {
|
||||
labels: {
|
||||
app: name,
|
||||
},
|
||||
},
|
||||
spec: {
|
||||
nodeSelector: {
|
||||
nodepool: "worker",
|
||||
},
|
||||
container: [
|
||||
{
|
||||
name: "ddns-updater",
|
||||
image: "favonia/cloudflare-ddns:latest",
|
||||
env: [
|
||||
{
|
||||
name: "CLOUDFLARE_API_TOKEN",
|
||||
valueFrom: {
|
||||
secretKeyRef: {
|
||||
name: "ddns-cloudflare-token",
|
||||
key: "token",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "DOMAINS",
|
||||
valueFrom: {
|
||||
configMapKeyRef: {
|
||||
name,
|
||||
key: "DOMAINS",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "PROXIED",
|
||||
valueFrom: {
|
||||
configMapKeyRef: {
|
||||
name,
|
||||
key: "PROXIED",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "UPDATE_TIMEOUT",
|
||||
value: "30s",
|
||||
},
|
||||
{
|
||||
name: "IP6_PROVIDER",
|
||||
value: "none",
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user