dns.doh and dns.dot now support serving multiple certificates.lmdbFeed backend as well as connecting to postgres directly. Using lmdbFeed instead of a direct connection benefits security, performance, and availability.api.routesConfig now accepts a maxRpm parameter which decides the amount of requests per minute each pod may handle. This is mostly useful for websocket endpoints, which may be spammed if there is an interruption in network connectivity. These endpoints are set to 600 by default..mobileconfig configurations, and support settings that require a supervised device.app_rules_per_device quota has been introduced. Previously the amount of app rules that could be created was the same as the amount of apps allowed per device (apps_per_device), but now app rules can be created in advance for apps that aren’t installed yet.GET /user/auth has been removed from the API.POST /user/auth has been removed from the API.POST /user/device/auth has been removed from the API.GET /user/subscription/chargebee/redirect/payment-methods has been removed from the API.GET /user/subscription/addons/extradevices has been removed from the API.PUT /user/subscription/addons/extradevices has been removed from the API.GET /user/subscription/name has been removed from the API.POST /user/subscription has been removed from the API.DELETE /user/subscription has been removed from the API.POST /user/subscription/reactivate has been removed from the API.POST /user/ip has been removed from the API.GET /user/ip has been removed from the API.POST /user has been removed from the API.GET /user/is-setup has been removed from the API.GET /categories/names has been removed from the API./usage API endpoints have been removed._reserved.dns.doh.tls and dns.dot.tls now expect an array. Each array element has the same format as the previously expected object.dns.lmdbFeed deployment.dns.dns.sidecarContainers.lmdbManager other than resources, extraEnv, securityContext, image, and logLevel are now located under dns.dns.sidecarContainers.lmdbManager.backend.postgres. Similarly; values under dns.dns.initContainers.initLmdb other than resources, extraEnv, image, logLevel, or mapSize must be moved to dns.dns.initContainers.initLmdb.backend.postgres.1/5*10000*2). This can be adjusted under api.routesConfig.api.sendgrid.commsConsentUnsubscribeGroup.api.devices.appleMobileConfig, it’s best to re-examine the desired settings and add them as named profiles in the new configuration. Then, update the frontend to request the new settings.values.yaml.app_rules_per_device to something greater than 0, also set app_rules_per_device to at least that amount.otp_email_subject, otp_email_title, apple_mobileconfig_display_name, apple_mobileconfig_description, apple_mobileconfig_doh_display_name, apple_mobileconfig_doh_description, apple_mobileconfig_removal_password_description, apple_mobileconfig_restrictions_description, and apple_mobileconfig_filename. They are either new or contain a placeholder.lmdbFeed may take a little while to initialize depending on the size of your database. The new DNS deployment rollout won’t succeed until it has initialized.doh and dot to check the status of these containers.dns.doh.host and dns.dot.host fields now supported comma-seperated values to support serving multiple hosts. Only the first value is used by frontend automatically.api.websocketShutdownRpm parameter to control how quickly this occurs. You can use api.terminationGracePeriodSeconds to determine how long to give this process before forcefully terminating the pod. This prevents the API being spammed during deployment rollouts..mobileconfig files with custom settings for browsers set will now have an extension blocklist automatically populated using the app classifications database from the admin app. There are new app platforms for chromium extensions, edge extensions, and firefox extensions. Edge receives both chromium and edge extensions because it supports both.api.accounts.createAccountRateLimit.max./v2/blocking APIs are the replacement for /v2/categories and /v2/blockinternet, which are now deprecated and will be removed in the next release./v2/devices APIs to replace most under /devices, which are now deprecated and will be removed in the next release.protocolchecker.domains.id can be used to create a unique domain that will only resolve when the user is connected to a particular DNS instance. This can be useful to tell which deployment they are connected to.protocolchecker.domains.tokenMatch can be used to create a domain that will only resolve when the subdomain matches the DNS token being used by the user. This can be useful to tell whether the user is connected as a particular device without having access to the underlying network configuration.api.realIPHeader is not configured correctly. For more details, see the API section below.api.strings.usage_unknown_category_name to api.strings.unknown_category_name to reflect the fact that the string constant may now also be returned in alerts for recently installed apps.api.devices.appleMobileConfig.payloadContentIdentifier and api.devices.appleMobileConfig.payloadIdentifier have been removed in favor of api.devices.appleMobileConfig.identifiers.payload and api.devices.appleMobileConfig.identifiers.dnsSettings respectively.healthChecks deployment now uses a dnsPolicy of Default by default, where before it was using ClusterFirst. This is only a breaking change if you were health-checking anything inside the cluster using kubernetes DNS names, regular DNS should work as expected given DNS on the nodes working..mobileconfig files are now set to apply to the whole system, not just the current user.api.enabled is true, examine the logs of your API pods and ensure that the request logs show a valid source IP. If api.realIPHeader is not configured correctly, an IP from one of the private ranges will be shown. If a private IP range is shown, configure api.realIPHeader to match a header set by your ingress. Requesting the root of the API will dump the headers that the API can see.api.strings.usage_unknown_category_name in your own values, change this to api.strings.unknown_category_name.api.devices.appleMobileConfig.payloadContentIdentifier or api.devices.appleMobileConfig.payloadIdentifier in your values, change these to api.devices.appleMobileConfig.identifiers.payload and api.devices.appleMobileConfig.identifiers.dnsSettings respectively.healthChecks to health-check DNS names inside the cluster, set healthChecks.dnsPolicy back to ClusterFirst in your values.helm repo update safesurfer to get the latest chart version.api.extraQuotas field to define arbitrary quotas. This was possible previously, but required replacing the entire api.quotas object.dns.dot.service.isGCPNEG to easily provision a Google Cloud Network Endpoint Group for DOT.dns.dns.sidecarContainers.lmdbManager.accountFullRebuildWindow and dns.dns.sidecarContainers.lmdbManager.domainFullRebuildWindow to add some randomness around when full rebuilds occur. This helps to reduce database load.api.devices.metadata object to enable it..mobileconfig files. These extra settings are off by default, but force browsers to use the DNS provisioned as part of the profile, so provide a better user experience. This can be configured in api.devices.appleMobileConfig.extraSettings and api.devices.appleMobileConfig.identifiers. To return these for a given request for a mobileconfig file, you must opt in by setting the enable-extra-settings parameter.android role to allow the app to set the app version, retreive its own metadata, and post its location.api.realIPHeader to be configured correctly to find the user’s source IP, or they will fail and return 500: creating a user, signing in with a username/password, using remote authentication, adding a survey result, getting the user’s source IP, setting the IPv6 address for a device, setting the IPv4 address for a device, and chargebee subscription operations that require the user’s source IP. Source IP is required for estimating or creating a chargebee subscription, or getting a chargebee plan, when the full plan ID is not provided and the user’s source IP is used to determine the real plan or plan price ID.dnsPolicy and dnsConfig fields to healthChecks. Using ClusterFirst DNS can result in false positive health check failures if the cluster’s DNS setup can’t handle the amount of requests the health checks require. The new default value, Default, uses the DNS of the nodes, which removes the overhead of matching all DNS names with in-cluster DNS.categorizer.adminApp.realIPHeader was set, unless the realIPHeader header was set manually on the request.categorizer.adminApp.authIpWhitelist and categorizer.adminApp.realIPHeader were both set and requests were made to the admin app from inside the cluster. Previously, this would crash the requested admin app pod unless the realIPHeader header was set manually on the request to an allowed value.newDomainNotifierUser.user may no longer be named Auto-Categorizer, since this is also the default username for addFromDNS, which could result in addFromDNS not working./categories and /sites endpoints from the API, as they have not been used in a long time. Only /categories/names is preserved, as it is still used in the default dashboard and lacks a suitable replacement at this stage.newDomainNotifierUser.user to Auto-Categorizer, rename it something else. A suggested replacement is New-Domain-Notifier.Other than this, no special migration steps are necessary, unless the v1 /categories or /sites API endpoints were being used in some way to change blocking settings. However, no available implementation for any platform was using these.
dns.dns.debugging.categoryDomain, which can be queried to view the current action for a particular category for the requesting device.dns.dns.debugging can now be set to the empty string to disable them individually.GET /v2/blocking/this-device/categories/{id}/resolved to get the resolved category model for a single category for the requesting device.GET /v2/blocking/by-category/{id}/plans to get the blocking plans for a category across the whole account.api.blocking.maxPlanAheadDuration in values.yaml to decide the maximum amount of time users can request to see in the future when requesting blocking plans.10m.dns.dns.sidecarContainers.lmdbManager.resources.domains and dns.dns.sidecarContainers.lmdbManager.resources.accounts have been removed in favor of just dns.dns.sidecarContainers.lmdbManager.resources. Separate resource settings for the lmdb init container have been added under dns.dns.initContainers.initLmdb.resources.clickhoused has been updated to support both the UDP and HTTP frontends at the same time. This makes it easier to support DNS servers hosted both within the same cluster and externally.api.alerts.lookaheadMultiplier in favor of api.alerts.lookaheadMultiplierStart, api.alerts.lookaheadMultiplierEnd, and api.alerts.lookaheadMultiplierFactor. In the old version, there would be occasional timeouts when getting alerts if a large amount of summarizible alerts were found. In the new version, the lookahead increases exponentially according to the parameters above. This reduces resource usage of getting alerts in most cases while reducing the amount of timeouts.GET /categories/{id}/mirror and DELETE /categories/{id}/mirror API endpoints have been removed from the admin app. If you’re calling these externally, you’ll need to switch to using the alternatives GET /categories/mirrors and DELETE /categories/mirrors instead.dns.dns.sidecarContainers.lmdbManager.resources.domains or dns.dns.sidecarContainers.lmdbManager.resources.accounts, you will need to remove and combine (add together) the customized resources and place them directly under dns.dns.sidecarContainers.lmdbManager.resources instead. For example, instead of:
dns:
dns:
sidecarContainers:
lmdbManager:
resources:
accounts:
requests:
memory: "1000Mi"
cpu: "100m"
limits:
memory: "1000Mi"
cpu: "750m"
domains:
requests:
memory: "2000Mi"
cpu: "200m"
limits:
memory: "2000Mi"
cpu: "500m"
You will now need:
dns:
dns:
sidecarContainers:
lmdbManager:
# Adding the previous resources together:
resources:
requests:
memory: "3000Mi"
cpu: "300m"
limits:
memory: "3000Mi"
cpu: "1250m"
You will also need to update the custom resources for the init container. This is generally the same as the sidecar. For example:
dns:
dns:
initContainers:
initLmdb:
# Same as the above is a good starting point
resources:
requests:
memory: "3000Mi"
cpu: "300m"
limits:
memory: "3000Mi"
cpu: "1250m"
Note that since this is a different implementation, the resource usage characteristics will vary slightly - it’s worth monitoring your new resource settings after deployment. The new version has more configuration options to achieve the desired performance characteristics, which you can see in the new values file.
clickhoused, you will now need to enable it explicitly rather than just disabling the udp frontend since it now supports both. Instead of:
dns:
clickhoused:
internal:
frontend:
udp:
enabled: false
You will now need:
dns:
clickhoused:
internal:
frontend:
udp:
enabled: false
http:
enabled: true
monitoring.enabled is true, you may need to upgrade the grafana/loki/prometheus stack for the built-in grafana dashboards to work after upgrading the Safe Surfer chart. Here is an example (run within the monitoring stack repo), but if you are using custom values, make sure to include them instead:
git pull # Monitoring stack repo has been updated
helm repo update prometheus-community
helm repo update grafana
helm -n monitoring upgrade prometheus prometheus-community/prometheus -f prometheus/values.yaml
helm -n monitoring upgrade loki grafana/loki-stack -f values.yaml
helm -n monitoring upgrade grafana grafana/grafana -f values.yaml
api.alerts.lookaheadMultiplier in your values, remove it. In most cases you will not need to edit its replacement values api.alerts.lookaheadMultiplierStart, api.alerts.lookaheadMultiplierEnd, and api.alerts.lookaheadMultiplierFactor, but you can optimize by observing latency for GET /v2/alerts and POST /v2/alerts/with-filter and increasing the multipliers if necessary.healthChecks deployment, which is an optional but useful way to generate prometheus metrics for the health of the services you enable in the rest of the chart. The metrics can be viewed in the new grafana dashboard for healthChecks, or you can use prometheus alerting rules to create alerts for them.api.ingress.tls.secretName field not working.blockpage.svcAnnotations annotations to put arbitrary annotations on the block page service. The default makes the block page work on AWS EKS by default.dns.dns.debugging.maxIdleConns and maxOpenConns parameters to most deployments that connect to the database. The defaults are the go defaults used previously.dns.dns.initContainers.iptablesProvisioner, dns.dns.initContainers.ip6tablesProvisioner, and dns.dns.initContainers.udpOverIpv6AddressRewrite.levels field of restrictions will now live-update rather than requiring a full rebuild.isGlobalWhitelist, logging, and excludeFromUsageData fields of categories will now live-update rather than requiring a full rebuild.dns.dns.localAddress, dns.dns.initContainers.ip6tablesProvisioner, and dns.dns.initContainers.udpOverIpv6AddressRewrite.dns.dns.queryLocalAddress.dns.dns.sysctls.dns.dns.logLevel to 6..dns.dns.anonymousLogging.allowOptOut setting, which controls whether user requests will be logged anonymously instead when they opt out of logging. The default is true, which does not change the current behavior of turning off logging completely when users turn it off.healthCheck.ignoreCert option to dns.doh and dns.dot, which can be useful when deploying behind a load balancer that handles SSL.223. The router or app integrations can use this to automatically provide more accurate information about why a certain site or app is blocked.customDomain was not a valid domain, even if the custom domain was not being used, e.g. enabled was false. This prevented the reference dashboard from setting this setting back to the default.windows auth token role.api.accounts.emailOtpRateLimit, api.accounts.passwordResetRateLimit, and api.accounts.twofactor.rateLimit as separate limits to api.accounts.signonRateLimit with a stricter default config. Before they were shared and it was difficult to find a good compromise between them.api.accounts.signonRateLimit.startDuration and api.accounts.signonRateLimit.endDuration, since they did not change the amount of requests that could potentially be spammed, but did make the user experience worse when enabled. The default value was to disable this system.api.accounts.twofactor.attempts..host as a reserved TLD, since this is a real TLD. Adding .host domains previously resulted in an error.enabledForUsersByDefault, which allows using nxdomain as a blocking response by default while allowing this to be changed by users individually still.ss-config tool..dns.dnscrypt..dns.dns.sidecarContainers.healthCheck.customTargets not working.certSync object from the values file.