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 d882763d4f5..a24463533be 100644 Binary files a/frontend/__snapshots__/scenes-other-preflight--preflight.png and b/frontend/__snapshots__/scenes-other-preflight--preflight.png differ diff --git a/frontend/src/scenes/PreflightCheck/PreflightCheck.tsx b/frontend/src/scenes/PreflightCheck/PreflightCheck.tsx index 1a99ec387f7..e99edfa13a9 100644 --- a/frontend/src/scenes/PreflightCheck/PreflightCheck.tsx +++ b/frontend/src/scenes/PreflightCheck/PreflightCheck.tsx @@ -78,7 +78,7 @@ export function PreflightCheck(): JSX.Element { {' '} 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: