diff --git a/.gitmodules b/.gitmodules index 221c38f..ec8adf4 100644 --- a/.gitmodules +++ b/.gitmodules @@ -112,3 +112,12 @@ [submodule "roles/ericomeehan.the-button"] path = roles/ericomeehan.the-button url = git@gitea.eom.dev:DevOps/ansible-role-the-button.git +[submodule "roles/ericomeehan.dex"] + path = roles/ericomeehan.dex + url = git@gitea.eom.dev:DevOps/ansible-role-dex.git +[submodule "roles/ericomeehan.owncast"] + path = roles/ericomeehan.owncast + url = git@gitea.eom.dev:Broadcast/ansible-role-owncast.git +[submodule "roles/ericomeehan.luanti-wasm"] + path = roles/ericomeehan.luanti-wasm + url = git@gitea.eom.dev:Gaming/ansible-role-luanti-wasm.git diff --git a/data.log b/data.log new file mode 100644 index 0000000..0c188ea --- /dev/null +++ b/data.log @@ -0,0 +1,309 @@ +NAME READY STATUS RESTARTS AGE +luanti-wasm-54784f4658-pwcss 1/2 CrashLoopBackOff 9 (3m31s ago) 26m +luanti-wasm-54784f4658-qfvmt 0/2 ContainerStatusUnknown 0 28m +luanti-wasm-7db86bcccf-5dx9q 1/2 ImagePullBackOff 0 28m +Name: luanti-wasm-54784f4658-pwcss +Namespace: luanti-wasm +Priority: 0 +Service Account: default +Node: alpha-worker-14/192.168.1.69 +Start Time: Sun, 25 Oct 2026 18:12:03 -0400 +Labels: app=luanti-wasm + pod-template-hash=54784f4658 +Annotations: checksum/config: b356923e5ed40b59bb67c8d93fb0d7d078e026f9400a99e8ceaa47b3a0b654e9 +Status: Running +SeccompProfile: RuntimeDefault +IP: 10.244.13.247 +IPs: + IP: 10.244.13.247 +Controlled By: ReplicaSet/luanti-wasm-54784f4658 +Containers: + web: + Container ID: containerd://eb68f380d8a8b8a8716ba75b3f40ebfd1b9418a4d56c038434e26746bc8bd5f5 + Image: ericomeehan/luanti-wasm:latest + Image ID: docker.io/ericomeehan/luanti-wasm@sha256:bcb1bc1a18f1262d69a9427e20f6d30ce85ba085dc2d6ed15b1b53503bf1e3bd + Port: 8080/TCP + Host Port: 0/TCP + State: Waiting + Reason: CrashLoopBackOff + Last State: Terminated + Reason: Completed + Exit Code: 0 + Started: Sun, 25 Oct 2026 18:34:42 -0400 + Finished: Sun, 25 Oct 2026 18:34:42 -0400 + Ready: False + Restart Count: 9 + Limits: + cpu: 500m + memory: 256Mi + Requests: + cpu: 100m + memory: 64Mi + Liveness: http-get http://:http/ delay=0s timeout=1s period=20s #success=1 #failure=3 + Readiness: http-get http://:http/ delay=0s timeout=1s period=10s #success=1 #failure=3 + Startup: http-get http://:http/ delay=0s timeout=1s period=2s #success=1 #failure=30 + Environment: + Mounts: + /etc/nginx/nginx.conf from config (ro,path="nginx.conf") + /tmp from tmp (rw) + proxy: + Container ID: containerd://09f94df439663c026b1c5cb10bcc795984d606faee3ee6a9c8f89ae78a6df146 + Image: ericomeehan/luanti-wasm-proxy:latest + Image ID: docker.io/ericomeehan/luanti-wasm-proxy@sha256:e600e3d8b84e4e6b4e4a4c46151e2a364dface82a67d2c97c3b62984677ff5e9 + Port: 7777/TCP + Host Port: 0/TCP + State: Running + Started: Sun, 25 Oct 2026 18:13:31 -0400 + Ready: True + Restart Count: 0 + Limits: + cpu: 500m + memory: 256Mi + Requests: + cpu: 100m + memory: 64Mi + Liveness: tcp-socket :proxy delay=0s timeout=1s period=20s #success=1 #failure=3 + Readiness: tcp-socket :proxy delay=0s timeout=1s period=10s #success=1 #failure=3 + Startup: tcp-socket :proxy delay=0s timeout=1s period=2s #success=1 #failure=30 + Environment: + Mounts: + /etc/lwproxy.toml from config (ro,path="lwproxy.toml") +Conditions: + Type Status + PodReadyToStartContainers True + Initialized True + Ready False + ContainersReady False + PodScheduled True +Volumes: + config: + Type: ConfigMap (a volume populated by a ConfigMap) + Name: luanti-wasm-config + Optional: false + tmp: + Type: EmptyDir (a temporary directory that shares a pod's lifetime) + Medium: Memory + SizeLimit: 64Mi +QoS Class: Burstable +Node-Selectors: +Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s + node.kubernetes.io/unreachable:NoExecute op=Exists for 300s +Events: + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal Scheduled 26m default-scheduler Successfully assigned luanti-wasm/luanti-wasm-54784f4658-pwcss to alpha-worker-14 + Normal Pulling 26m kubelet Pulling image "ericomeehan/luanti-wasm:latest" + Normal Pulled 24m kubelet Successfully pulled image "ericomeehan/luanti-wasm:latest" in 1m23.761s (1m23.761s including waiting). Image size: 1282177336 bytes. + Normal Pulling 24m kubelet Pulling image "ericomeehan/luanti-wasm-proxy:latest" + Normal Pulled 24m kubelet Successfully pulled image "ericomeehan/luanti-wasm-proxy:latest" in 2.919s (2.919s including waiting). Image size: 35770513 bytes. + Normal Created 24m kubelet Created container: proxy + Normal Started 24m kubelet Started container proxy + Normal Created 23m (x4 over 24m) kubelet Created container: web + Normal Started 23m (x4 over 24m) kubelet Started container web + Normal Pulled 23m (x3 over 24m) kubelet Container image "ericomeehan/luanti-wasm:latest" already present on machine + Warning BackOff 62s (x129 over 24m) kubelet Back-off restarting failed container web in pod luanti-wasm-54784f4658-pwcss_luanti-wasm(5b66ac3b-d39c-4b37-8585-4fd25ac77436) + + +Name: luanti-wasm-54784f4658-qfvmt +Namespace: luanti-wasm +Priority: 0 +Service Account: default +Node: alpha-worker-10/192.168.1.90 +Start Time: Sun, 25 Oct 2026 18:09:56 -0400 +Labels: app=luanti-wasm + pod-template-hash=54784f4658 +Annotations: checksum/config: b356923e5ed40b59bb67c8d93fb0d7d078e026f9400a99e8ceaa47b3a0b654e9 +Status: Failed +Reason: Evicted +Message: The node was low on resource: ephemeral-storage. Threshold quantity: 2510076003, available: 0. +SeccompProfile: RuntimeDefault +IP: 10.244.11.89 +IPs: + IP: 10.244.11.89 +Controlled By: ReplicaSet/luanti-wasm-54784f4658 +Containers: + web: + Container ID: + Image: ericomeehan/luanti-wasm:latest + Image ID: + Port: 8080/TCP + Host Port: 0/TCP + State: Terminated + Reason: ContainerStatusUnknown + Message: The container could not be located when the pod was terminated + Exit Code: 137 + Started: Mon, 01 Jan 0001 00:00:00 +0000 + Finished: Mon, 01 Jan 0001 00:00:00 +0000 + Ready: False + Restart Count: 0 + Limits: + cpu: 500m + memory: 256Mi + Requests: + cpu: 100m + memory: 64Mi + Liveness: http-get http://:http/ delay=0s timeout=1s period=20s #success=1 #failure=3 + Readiness: http-get http://:http/ delay=0s timeout=1s period=10s #success=1 #failure=3 + Startup: http-get http://:http/ delay=0s timeout=1s period=2s #success=1 #failure=30 + Environment: + Mounts: + /etc/nginx/nginx.conf from config (ro,path="nginx.conf") + /tmp from tmp (rw) + proxy: + Container ID: + Image: ericomeehan/luanti-wasm-proxy:latest + Image ID: + Port: 7777/TCP + Host Port: 0/TCP + State: Terminated + Reason: ContainerStatusUnknown + Message: The container could not be located when the pod was terminated + Exit Code: 137 + Started: Mon, 01 Jan 0001 00:00:00 +0000 + Finished: Mon, 01 Jan 0001 00:00:00 +0000 + Ready: False + Restart Count: 0 + Limits: + cpu: 500m + memory: 256Mi + Requests: + cpu: 100m + memory: 64Mi + Liveness: tcp-socket :proxy delay=0s timeout=1s period=20s #success=1 #failure=3 + Readiness: tcp-socket :proxy delay=0s timeout=1s period=10s #success=1 #failure=3 + Startup: tcp-socket :proxy delay=0s timeout=1s period=2s #success=1 #failure=30 + Environment: + Mounts: + /etc/lwproxy.toml from config (ro,path="lwproxy.toml") +Conditions: + Type Status + DisruptionTarget True + PodReadyToStartContainers False + Initialized True + Ready False + ContainersReady False + PodScheduled True +Volumes: + config: + Type: ConfigMap (a volume populated by a ConfigMap) + Name: luanti-wasm-config + Optional: false + tmp: + Type: EmptyDir (a temporary directory that shares a pod's lifetime) + Medium: Memory + SizeLimit: 64Mi +QoS Class: Burstable +Node-Selectors: +Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s + node.kubernetes.io/unreachable:NoExecute op=Exists for 300s +Events: + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal Scheduled 28m default-scheduler Successfully assigned luanti-wasm/luanti-wasm-54784f4658-qfvmt to alpha-worker-10 + Normal Pulling 28m kubelet Pulling image "ericomeehan/luanti-wasm:latest" + Warning Evicted 27m kubelet The node was low on resource: ephemeral-storage. Threshold quantity: 2510076003, available: 2435104Ki. + Warning Evicted 27m kubelet The node was low on resource: ephemeral-storage. Threshold quantity: 2510076003, available: 815628Ki. + Warning Evicted 26m kubelet The node was low on resource: ephemeral-storage. Threshold quantity: 2510076003, available: 0. + Warning ExceededGracePeriod 26m (x3 over 27m) kubelet Container runtime did not kill the pod within specified grace period. + Normal Pulled 26m kubelet Successfully pulled image "ericomeehan/luanti-wasm:latest" in 1m56.007s (1m56.007s including waiting). Image size: 1282177336 bytes. + Normal Created 26m kubelet Created container web + Normal Started 26m kubelet Started container web + Normal Pulling 26m kubelet Pulling image "ericomeehan/luanti-wasm-proxy:latest" + Warning Failed 26m kubelet Failed to pull image "ericomeehan/luanti-wasm-proxy:latest": failed to pull and unpack image "docker.io/ericomeehan/luanti-wasm-proxy:latest": failed to copy: write /var/lib/containerd/io.containerd.content.v1.content/ingest/42c720c250d43a6a6a821fd08486d3a519d360eb72da88caf45d20beed21da63/data: no space left on device + Warning Failed 26m kubelet Error: ErrImagePull + + +Name: luanti-wasm-7db86bcccf-5dx9q +Namespace: luanti-wasm +Priority: 0 +Service Account: default +Node: alpha-worker-8/192.168.1.71 +Start Time: Sun, 25 Oct 2026 18:09:20 -0400 +Labels: app=luanti-wasm + pod-template-hash=7db86bcccf +Annotations: checksum/config: b356923e5ed40b59bb67c8d93fb0d7d078e026f9400a99e8ceaa47b3a0b654e9 +Status: Pending +SeccompProfile: RuntimeDefault +IP: 10.244.10.2 +IPs: + IP: 10.244.10.2 +Controlled By: ReplicaSet/luanti-wasm-7db86bcccf +Containers: + web: + Container ID: + Image: ericomeehan/luanti-wasm:bcb1bc1a18f1262d69a9427e20f6d30ce85ba085dc2d6ed15b1b53503bf1e3bd + Image ID: + Port: 8080/TCP + Host Port: 0/TCP + State: Waiting + Reason: ImagePullBackOff + Ready: False + Restart Count: 0 + Limits: + cpu: 500m + memory: 256Mi + Requests: + cpu: 100m + memory: 64Mi + Liveness: http-get http://:http/ delay=0s timeout=1s period=20s #success=1 #failure=3 + Readiness: http-get http://:http/ delay=0s timeout=1s period=10s #success=1 #failure=3 + Startup: http-get http://:http/ delay=0s timeout=1s period=2s #success=1 #failure=30 + Environment: + Mounts: + /etc/nginx/nginx.conf from config (ro,path="nginx.conf") + /tmp from tmp (rw) + proxy: + Container ID: containerd://b312219bbe512bdbb4fc86957bdef3ab0548a7e72869036d5d642bb64ed311b7 + Image: ericomeehan/luanti-wasm-proxy:latest + Image ID: docker.io/ericomeehan/luanti-wasm-proxy@sha256:e600e3d8b84e4e6b4e4a4c46151e2a364dface82a67d2c97c3b62984677ff5e9 + Port: 7777/TCP + Host Port: 0/TCP + State: Running + Started: Sun, 25 Oct 2026 18:09:24 -0400 + Ready: True + Restart Count: 0 + Limits: + cpu: 500m + memory: 256Mi + Requests: + cpu: 100m + memory: 64Mi + Liveness: tcp-socket :proxy delay=0s timeout=1s period=20s #success=1 #failure=3 + Readiness: tcp-socket :proxy delay=0s timeout=1s period=10s #success=1 #failure=3 + Startup: tcp-socket :proxy delay=0s timeout=1s period=2s #success=1 #failure=30 + Environment: + Mounts: + /etc/lwproxy.toml from config (ro,path="lwproxy.toml") +Conditions: + Type Status + PodReadyToStartContainers True + Initialized True + Ready False + ContainersReady False + PodScheduled True +Volumes: + config: + Type: ConfigMap (a volume populated by a ConfigMap) + Name: luanti-wasm-config + Optional: false + tmp: + Type: EmptyDir (a temporary directory that shares a pod's lifetime) + Medium: Memory + SizeLimit: 64Mi +QoS Class: Burstable +Node-Selectors: +Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s + node.kubernetes.io/unreachable:NoExecute op=Exists for 300s +Events: + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal Scheduled 28m default-scheduler Successfully assigned luanti-wasm/luanti-wasm-7db86bcccf-5dx9q to alpha-worker-8 + Normal Pulling 28m kubelet Pulling image "ericomeehan/luanti-wasm-proxy:latest" + Normal Pulled 28m kubelet Successfully pulled image "ericomeehan/luanti-wasm-proxy:latest" in 2.756s (2.756s including waiting). Image size: 35770513 bytes. + Normal Created 28m kubelet Created container proxy + Normal Started 28m kubelet Started container proxy + Normal Pulling 28m (x3 over 28m) kubelet Pulling image "ericomeehan/luanti-wasm:bcb1bc1a18f1262d69a9427e20f6d30ce85ba085dc2d6ed15b1b53503bf1e3bd" + Warning Failed 28m (x3 over 28m) kubelet Failed to pull image "ericomeehan/luanti-wasm:bcb1bc1a18f1262d69a9427e20f6d30ce85ba085dc2d6ed15b1b53503bf1e3bd": rpc error: code = NotFound desc = failed to pull and unpack image "docker.io/ericomeehan/luanti-wasm:bcb1bc1a18f1262d69a9427e20f6d30ce85ba085dc2d6ed15b1b53503bf1e3bd": failed to resolve reference "docker.io/ericomeehan/luanti-wasm:bcb1bc1a18f1262d69a9427e20f6d30ce85ba085dc2d6ed15b1b53503bf1e3bd": docker.io/ericomeehan/luanti-wasm:bcb1bc1a18f1262d69a9427e20f6d30ce85ba085dc2d6ed15b1b53503bf1e3bd: not found + Warning Failed 28m (x3 over 28m) kubelet Error: ErrImagePull + Warning Failed 27m (x6 over 28m) kubelet Error: ImagePullBackOff + Normal BackOff 3m41s (x114 over 28m) kubelet Back-off pulling image "ericomeehan/luanti-wasm:bcb1bc1a18f1262d69a9427e20f6d30ce85ba085dc2d6ed15b1b53503bf1e3bd" diff --git a/dex.yml b/dex.yml new file mode 100755 index 0000000..0d4cbb6 --- /dev/null +++ b/dex.yml @@ -0,0 +1,83 @@ +--- +# Run on the controller with its existing kubeconfig; no SSH target is required. +# Supply credentials via inventory/group_vars or a Vault-encrypted vars file. +- name: Deploy eom.dev Dex with Catppuccin branding + hosts: alpha-control-plane + become: true + vars_files: + - ../secrets.yaml + vars: + dex_namespace: dex + dex_release_name: dex + dex_chart_version: "0.26.0" + dex_issuer: https://dex.eom.dev/ + dex_hostname: dex.eom.dev + dex_ingress_class: nginx + dex_cluster_issuer: ca-issuer + dex_tls_secret_name: dex + dex_theme_enabled: true + dex_brand_name: eom.dev + dex_theme_configmap_name: dex-catppuccin + + # Preserve the existing DB release and data; do not upgrade it by default. + dex_postgres_manage: false + dex_postgres_release_name: postgresql + dex_postgres_host: postgresql + dex_postgres_port: 5432 + dex_postgres_database: dex + dex_postgres_user: dex + dex_postgres_storage_size: 256Gi + dex_postgres_ssl_mode: disable + dex_postgres_password: "{{ dex_admin_password }}" + dex_postgres_admin_password: "{{ postgresql_admin_password | default('') }}" + + # Explicitly preserve internal plaintext LDAP and legacy OIDC subjects. + dex_ldap_host: openldap.openldap.svc.cluster.local + dex_ldap_insecure_no_ssl: true + dex_ldap_start_tls: false + dex_ldap_bind_dn: cn=readonly,dc=eom,dc=dev + dex_ldap_bind_password: "{{ openldap_readonly_password }}" + dex_ldap_connector_id: ldap + dex_ldap_connector_name: eom.dev account + dex_ldap_user_base_dn: dc=eom,dc=dev + dex_ldap_user_filter: "(&(objectClass=posixAccount)(memberOf=cn=Dex Users,ou=Dex,ou=Services,dc=eom,dc=dev))" + dex_ldap_id_attribute: uid + dex_ldap_name_attribute: givenName + dex_ldap_group_base_dn: dc=eom,dc=dev + dex_ldap_group_user_attribute: cn + dex_ldap_group_filter: "(objectClass=groupOfUniqueNames)" + + dex_matrix_client_enabled: true + dex_matrix_redirect_uris: + - https://mas.eom.dev/upstream/callback/01K96AQEZKKABW34PY3R6BVNJ4 + + # Optional website integration. Set www_dex_client_secret in Vault to enable; + # it must equal the membership application's DEX_CLIENT_SECRET. + dex_static_clients: "{{ [{'id': 'www-membership', 'name': 'eom.dev Membership', 'secret': www_dex_client_secret, 'redirectURIs': ['https://www.eom.dev/members/oidc/callback/']}] if (www_dex_client_secret | default('') | length > 0) else [] }}" + dex_additional_connectors: "{{ [_dex_eom_www_connector] if (www_dex_client_secret | default('') | length > 0) else [] }}" + _dex_eom_www_connector: + type: ldap + id: www-ldap + name: eom.dev Membership + config: + host: openldap.openldap.svc.cluster.local + insecureNoSSL: true + bindDN: cn=readonly,dc=eom,dc=dev + bindPW: "{{ openldap_readonly_password }}" + userSearch: + baseDN: ou=people,dc=eom,dc=dev + filter: "(objectClass=inetOrgPerson)" + username: uid + idAttr: entryUUID + emailAttr: mail + nameAttr: cn + preferredUsernameAttr: uid + groupSearch: + baseDN: ou=groups,dc=eom,dc=dev + filter: "(objectClass=groupOfUniqueNames)" + userMatchers: + - userAttr: DN + groupAttr: uniqueMember + nameAttr: cn + roles: + - ericomeehan.dex diff --git a/roles/ericomeehan.dex b/roles/ericomeehan.dex new file mode 160000 index 0000000..6de8385 --- /dev/null +++ b/roles/ericomeehan.dex @@ -0,0 +1 @@ +Subproject commit 6de8385829e4cb2ebb7bffec753df44651a02119 diff --git a/roles/ericomeehan.eom b/roles/ericomeehan.eom index d5bbbd4..816aaea 160000 --- a/roles/ericomeehan.eom +++ b/roles/ericomeehan.eom @@ -1 +1 @@ -Subproject commit d5bbbd4f20647cb120a8574df80eb23ed9a4f498 +Subproject commit 816aaea3e0a03eb45908c97438731235e1f8601c diff --git a/roles/ericomeehan.gitea b/roles/ericomeehan.gitea index a87baf2..9f46e92 160000 --- a/roles/ericomeehan.gitea +++ b/roles/ericomeehan.gitea @@ -1 +1 @@ -Subproject commit a87baf2325593a44940f0b4175c238f93ba3c23b +Subproject commit 9f46e92cd762dd25e1cc23d978a5de669af97b0d diff --git a/roles/ericomeehan.luanti-wasm b/roles/ericomeehan.luanti-wasm new file mode 160000 index 0000000..2c8ab5d --- /dev/null +++ b/roles/ericomeehan.luanti-wasm @@ -0,0 +1 @@ +Subproject commit 2c8ab5db51e69dec55ba914c6440540d517cdf80 diff --git a/roles/ericomeehan.owncast b/roles/ericomeehan.owncast new file mode 160000 index 0000000..f0c46ec --- /dev/null +++ b/roles/ericomeehan.owncast @@ -0,0 +1 @@ +Subproject commit f0c46ec051a36f6179419b2075ec7f41540e6770 diff --git a/roles/ericomeehan.www b/roles/ericomeehan.www index b040ca2..87a97a3 160000 --- a/roles/ericomeehan.www +++ b/roles/ericomeehan.www @@ -1 +1 @@ -Subproject commit b040ca26c3f1131cc9a6bccf815959c58d60bba8 +Subproject commit 87a97a3ae4009a21cedabad2db91f3c9a3e7ad33 diff --git a/www.yaml b/www.yaml index 2c7dd2b..7640754 100644 --- a/www.yaml +++ b/www.yaml @@ -7,3 +7,46 @@ - role: ericomeehan.www vars: www_repo_url: https://gitea.eom.dev/DevOps/www.git + www_hostname: www.eom.dev + www_cluster_issuer: ca-issuer + www_httpd_image: ericomeehan/www:latest + www_onion_enabled: true + www_membership_enabled: true + www_membership_image: ericomeehan/www-members:latest + www_membership_image_pull_policy: Always + www_archive_storage_size: 2Ti + www_membership_postgres_storage_size: 2Ti + www_membership_postgres_storage_class: nfs-client + www_membership_stripe_enabled: true + www_membership_shkeeper_enabled: true + www_membership_environment_overrides: + MEMBERSHIP_PUBLIC_URL: "https://{{ www_hostname }}" + MEMBERSHIP_ALLOW_HTTP: "0" + MEMBERSHIP_TRUST_PROXY: "1" + MEMBERSHIP_TIERS_FILE: /etc/membership/tiers/tiers.json + POSTGRES_HOST: membership-db + POSTGRES_PORT: "5432" + POSTGRES_DB: membership + POSTGRES_USER: membership + POSTGRES_SSLMODE: prefer + DEX_ISSUER: https://dex.eom.dev/ + DEX_CLIENT_ID: www-membership + DEX_CONNECTOR_ID: ldap + LDAP_URL: ldaps://192.168.1.165 + LDAP_BIND_DN: "cn=readwrite,dc=eom,dc=dev" + LDAP_ACCOUNT_BASE_DN: ou=People,dc=example,dc=com + LDAP_SEARCH_BASE_DN: dc=example,dc=com + LDAP_PASSWORD_SCHEME: "{ARGON2}" + LDAP_GROUP_PLACEHOLDER_DN: cn=membership-sentinel,ou=system,dc=example,dc=com + LDAP_CA_CERT_FILE: "" + EMAIL_HOST: "postfix.eom.dev" + EMAIL_PORT: "587" + EMAIL_HOST_USER: "accounts@eom.dev" + EMAIL_USE_TLS: "1" + DEFAULT_FROM_EMAIL: accounts@eom.dev + STRIPE_LIVE_MODE: "0" + STRIPE_PORTAL_CONFIGURATION: "pk_live_51RXqTsC5KPXqTvVLWl5bzCxoaZivWceeLGMNURUmxzQMwaM5pUUl4VabywrjCQvgKopGFvUBqPLxRMF3eALsiDst00tR59vRhN" + SHKEEPER_URL: "https://shkeeper.eom.dev/" + SHKEEPER_CURRENCIES: "BTC" + SHKEEPER_CA_CERT_FILE: "" +