From d1899c60058a2ac6e750a56cc15dd7faf7d2f60e Mon Sep 17 00:00:00 2001 From: Joe Martin <84011561+joethreepwood@users.noreply.github.com> Date: Mon, 24 Jul 2023 18:44:44 +0100 Subject: [PATCH] fix: Removing some self-hosted upgrade paths and references (#16711) * Remove self-hosted references * Update messages in tests too * Update query snapshots * Update UI snapshots for `chromium` (2) --------- Co-authored-by: Michael Matloka Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> --- .../performance_issue_report.md | 2 +- CHANGELOG.md | 4 +--- README.md | 2 ++ docker-compose.base.yml | 3 --- docker-compose.dev-full.yml | 4 ++-- docker-compose.dev.yml | 4 ++-- docker-compose.hobby.yml | 3 +++ ee/api/test/base.py | 2 +- ee/api/test/test_event_definition.py | 4 ++-- ee/api/test/test_property_definition.py | 8 ++++---- .../scenes-other-preflight--preflight.png | Bin 24310 -> 24595 bytes .../scenes/PreflightCheck/PreflightCheck.tsx | 4 ++-- posthog/exceptions.py | 2 +- production.Dockerfile | 3 +++ 14 files changed, 24 insertions(+), 21 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/performance_issue_report.md b/.github/ISSUE_TEMPLATE/performance_issue_report.md index 871dc39f15a..8792ec93a35 100644 --- a/.github/ISSUE_TEMPLATE/performance_issue_report.md +++ b/.github/ISSUE_TEMPLATE/performance_issue_report.md @@ -17,7 +17,7 @@ labels: performance ## Environment - [ ] PostHog Cloud -- [ ] self-hosted PostHog, version/commit: _please provide_ +- [ ] PostHog self-hosted with Kubernetes (deprecated, see ["Sunsetting Kubernetes support"](https://posthog.com/blog/sunsetting-helm-support-posthog)), version/commit: [please provide] ## Additional context diff --git a/CHANGELOG.md b/CHANGELOG.md index 889efec1a18..a9ed14cbd01 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,3 @@ # Changelog -Updates to the PostHog project can be found at [https://posthog.com/blog/categories/product-updates](https://posthog.com/blog/categories/product-updates). Each release of PostHog self-hosted is accompanied by an "Array" blog post which details all relevant changes and any deprecation or warning notices. - -Find the latest Array blog post in the [Product updates](https://posthog.com/blog/categories/product-updates) section of our blog. +Updates to the PostHog project can be found on [https://posthog.com/changelog](our changelog). \ No newline at end of file diff --git a/README.md b/README.md index 63bd1cef087..c8200e3c304 100644 --- a/README.md +++ b/README.md @@ -51,6 +51,8 @@ You can deploy a hobby instance in one line on Linux with Docker (recommended 4G Open source deployments should scale to approximately 100k events per month, after which we recommend migrating to a PostHog Cloud instance. See our [docs for more info and limitations](https://posthog.com/docs/self-host/open-source/deployment). +PostHog has [sunset support for self-hosted K8s deployments](https://posthog.com/blog/sunsetting-helm-support-posthog). + ## Features ![ui-demo](https://user-images.githubusercontent.com/85295485/144591577-fe97e4a5-5631-4a60-a684-45caf421507f.gif)

Want to find out more? Request a demo! diff --git a/docker-compose.base.yml b/docker-compose.base.yml index 6956fe02368..a5e3e44396f 100644 --- a/docker-compose.base.yml +++ b/docker-compose.base.yml @@ -1,9 +1,6 @@ # # docker-compose base file used for local development, hobby deploys, and other compose use cases. # -# If you are looking at self-hosted deployment options check -# https://posthog.com/docs/self-host -# services: db: diff --git a/docker-compose.dev-full.yml b/docker-compose.dev-full.yml index da848764533..cc6f5d3fd2a 100644 --- a/docker-compose.dev-full.yml +++ b/docker-compose.dev-full.yml @@ -4,8 +4,8 @@ # For more info, see: # https://posthog.com/handbook/engineering/developing-locally # -# If you are looking at self-hosted deployment options check -# https://posthog.com/docs/self-host +# PostHog has sunset support for self-hosted K8s deployments. +# See: https://posthog.com/blog/sunsetting-helm-support-posthog # services: diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index c9df91f7886..0e7e4a05ea3 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -3,8 +3,8 @@ # For more info, see: # https://posthog.com/handbook/engineering/developing-locally # -# If you are looking at self-hosted deployment options check -# https://posthog.com/docs/self-host +# PostHog has sunset support for self-hosted K8s deployments. +# See: https://posthog.com/blog/sunsetting-helm-support-posthog # services: diff --git a/docker-compose.hobby.yml b/docker-compose.hobby.yml index e1e49773588..da0780c1c8e 100644 --- a/docker-compose.hobby.yml +++ b/docker-compose.hobby.yml @@ -4,6 +4,9 @@ # Please take a look at https://posthog.com/docs/self-host/deploy/hobby # for more info. # +# PostHog has sunset support for self-hosted K8s deployments. +# See: https://posthog.com/blog/sunsetting-helm-support-posthog +# services: db: diff --git a/ee/api/test/base.py b/ee/api/test/base.py index fbd8ea79160..a00ae9f89cc 100644 --- a/ee/api/test/base.py +++ b/ee/api/test/base.py @@ -19,7 +19,7 @@ class LicensedTestMixin: def license_required_response( self, - message: str = "This feature is part of the premium PostHog offering. To use it, get a self-hosted license: https://license.posthog.com", + message: str = "This feature is part of the premium PostHog offering. Self-hosted licenses are no longer available for purchase. Please contact sales@posthog.com to discuss options.", ) -> Dict[str, Optional[str]]: return {"type": "server_error", "code": "payment_required", "detail": message, "attr": None} diff --git a/ee/api/test/test_event_definition.py b/ee/api/test/test_event_definition.py index bd09335741e..7eb807caa33 100644 --- a/ee/api/test/test_event_definition.py +++ b/ee/api/test/test_event_definition.py @@ -211,7 +211,7 @@ class TestEventDefinitionEnterpriseAPI(APIBaseTest): f"/api/projects/@current/event_definitions/{str(event.id)}", data={"description": "test"} ) self.assertEqual(response.status_code, status.HTTP_402_PAYMENT_REQUIRED) - self.assertIn("This feature is part of the premium PostHog offering.", response.json()["detail"]) + self.assertIn("Self-hosted licenses are no longer available for purchase.", response.json()["detail"]) def test_with_expired_license(self): super(LicenseManager, cast(LicenseManager, License.objects)).create( @@ -222,7 +222,7 @@ class TestEventDefinitionEnterpriseAPI(APIBaseTest): f"/api/projects/@current/event_definitions/{str(event.id)}", data={"description": "test"} ) self.assertEqual(response.status_code, status.HTTP_402_PAYMENT_REQUIRED) - self.assertIn("This feature is part of the premium PostHog offering.", response.json()["detail"]) + self.assertIn("Self-hosted licenses are no longer available for purchase.", response.json()["detail"]) def test_can_get_event_verification_data(self): super(LicenseManager, cast(LicenseManager, License.objects)).create( diff --git a/ee/api/test/test_property_definition.py b/ee/api/test/test_property_definition.py index c6c20840bb9..3b1c8479ea1 100644 --- a/ee/api/test/test_property_definition.py +++ b/ee/api/test/test_property_definition.py @@ -213,7 +213,7 @@ class TestPropertyDefinitionEnterpriseAPI(APIBaseTest): f"/api/projects/@current/property_definitions/{str(property.id)}/", data={"description": "test"} ) self.assertEqual(response.status_code, status.HTTP_402_PAYMENT_REQUIRED) - self.assertIn("This feature is part of the premium PostHog offering.", response.json()["detail"]) + self.assertIn("Self-hosted licenses are no longer available for purchase.", response.json()["detail"]) def test_update_property_tags_without_license(self): property = EnterprisePropertyDefinition.objects.create(team=self.team, name="enterprise property") @@ -221,7 +221,7 @@ class TestPropertyDefinitionEnterpriseAPI(APIBaseTest): f"/api/projects/@current/property_definitions/{str(property.id)}/", data={"tags": ["test"]} ) self.assertEqual(response.status_code, status.HTTP_402_PAYMENT_REQUIRED) - self.assertIn("This feature is part of the premium PostHog offering.", response.json()["detail"]) + self.assertIn("Self-hosted licenses are no longer available for purchase.", response.json()["detail"]) def test_can_update_property_type_without_license(self): property = EnterprisePropertyDefinition.objects.create(team=self.team, name="enterprise property") @@ -239,7 +239,7 @@ class TestPropertyDefinitionEnterpriseAPI(APIBaseTest): data={"property_type": "DateTime", "tags": ["test"]}, ) self.assertEqual(response.status_code, status.HTTP_402_PAYMENT_REQUIRED) - self.assertIn("This feature is part of the premium PostHog offering.", response.json()["detail"]) + self.assertIn("Self-hosted licenses are no longer available for purchase.", response.json()["detail"]) def test_with_expired_license(self): super(LicenseManager, cast(LicenseManager, License.objects)).create( @@ -250,7 +250,7 @@ class TestPropertyDefinitionEnterpriseAPI(APIBaseTest): f"/api/projects/@current/property_definitions/{str(property.id)}/", data={"description": "test"} ) self.assertEqual(response.status_code, status.HTTP_402_PAYMENT_REQUIRED) - self.assertIn("This feature is part of the premium PostHog offering.", response.json()["detail"]) + self.assertIn("Self-hosted licenses are no longer available for purchase.", response.json()["detail"]) def test_filter_property_definitions(self): super(LicenseManager, cast(LicenseManager, License.objects)).create( diff --git a/frontend/__snapshots__/scenes-other-preflight--preflight.png b/frontend/__snapshots__/scenes-other-preflight--preflight.png index d882763d4f55a9526e86fa0dd2cdb6f9b91bbdb7..a24463533bef74e8c00f587be077882c1770fcc6 100644 GIT binary patch literal 24595 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 j|JH#2OLJbu{' '} or{' '} - visit support + visit community support .

@@ -133,7 +133,7 @@ export function PreflightCheck(): JSX.Element { {' '} or our{' '} - self host runbook + self-host runbook .

diff --git a/posthog/exceptions.py b/posthog/exceptions.py index 6d93c682f41..1cdcc5f1bf9 100644 --- a/posthog/exceptions.py +++ b/posthog/exceptions.py @@ -27,7 +27,7 @@ class EnterpriseFeatureException(APIException): + ( "To use it, subscribe to PostHog Cloud with a generous free tier: https://app.posthog.com/organization/billing" if is_cloud() - else "To use it, get a self-hosted license: https://license.posthog.com" + else "Self-hosted licenses are no longer available for purchase. Please contact sales@posthog.com to discuss options." ) ) ) diff --git a/production.Dockerfile b/production.Dockerfile index 185d8c15c8f..0c6245675c2 100644 --- a/production.Dockerfile +++ b/production.Dockerfile @@ -1,6 +1,9 @@ # # This Dockerfile is used for self-hosted production builds. # +# PostHog has sunset support for self-hosted K8s deployments. +# See: https://posthog.com/blog/sunsetting-helm-support-posthog +# # Note: for PostHog Cloud remember to update ‘Dockerfile.cloud’ as appropriate. # # The stages are used to: