Skip to content

Commit 1246267

Browse files
committed
next/onprem: mostly rewrite the cocalc onprem store page
1 parent 048b61b commit 1246267

File tree

2 files changed

+172
-86
lines changed

2 files changed

+172
-86
lines changed

src/packages/frontend/components/icon.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ import {
159159
PlusSquareOutlined,
160160
PoweroffOutlined,
161161
PrinterOutlined,
162+
ProjectOutlined,
162163
QuestionCircleOutlined,
163164
RedoOutlined,
164165
ReloadOutlined,
@@ -383,6 +384,7 @@ const IconSpec: { [name: string]: any } = {
383384
frown: FrownOutlined,
384385
fx: FunctionOutlined,
385386
slides: FundProjectionScreenOutlined,
387+
"project-outlined": ProjectOutlined,
386388
"gateway-outlined": GatewayOutlined,
387389
gavel: { IconFont: "gavel" },
388390
gears: ControlOutlined,

src/packages/next/pages/pricing/onprem.tsx

Lines changed: 170 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,53 @@
33
* License: MS-RSL – see LICENSE.md for details
44
*/
55

6-
import { Alert, Button, Layout } from "antd";
6+
import { Alert, Button, Layout, List } from "antd";
7+
import { useRouter } from "next/router";
78

8-
import { Icon } from "@cocalc/frontend/components/icon";
9+
import { Icon, IconName } from "@cocalc/frontend/components/icon";
10+
import { money } from "@cocalc/util/licenses/purchase/utils";
11+
import { COLORS } from "@cocalc/util/theme";
912
import Footer from "components/landing/footer";
1013
import Head from "components/landing/head";
1114
import Header from "components/landing/header";
15+
import PricingItem, { Line } from "components/landing/pricing-item";
1216
import { Paragraph, Text, Title } from "components/misc";
1317
import A from "components/misc/A";
1418
import { MAX_WIDTH } from "lib/config";
1519
import { Customize } from "lib/customize";
1620
import withCustomize from "lib/with-customize";
17-
import { useRouter } from "next/router";
21+
22+
const PUBLISH_PRICE = true;
23+
24+
interface Item {
25+
title: string;
26+
icon: IconName;
27+
individuals: string;
28+
price: number | null;
29+
academic?: boolean;
30+
}
31+
32+
const data: Item[] = [
33+
{
34+
title: "Small Business",
35+
icon: "experiment",
36+
individuals: "up to 25",
37+
price: 5000,
38+
},
39+
{
40+
title: "Academic Research",
41+
icon: "graduation-cap",
42+
individuals: "up to 25",
43+
price: 3000,
44+
academic: true,
45+
},
46+
{
47+
title: "Large institution",
48+
icon: "project-outlined",
49+
individuals: "more than 25",
50+
price: null,
51+
},
52+
];
1853

1954
export default function OnPrem({ customize }) {
2055
const { siteName } = customize;
@@ -39,68 +74,160 @@ export default function OnPrem({ customize }) {
3974
function Body() {
4075
const router = useRouter();
4176

42-
function cloud(): JSX.Element {
43-
const body = encodeURIComponent(
44-
"PLEASE EXPLAIN YOUR EXPECTED USE CASE TO HELP US GUIDE YOU:\n\nWE WOULD LOVE TO SETUP A VIDEO CALL WITH YOU! WHEN ARE YOU AVAILABLE?",
77+
const body = encodeURIComponent(
78+
"PLEASE EXPLAIN YOUR EXPECTED USE CASE TO HELP US GUIDE YOU:\n\nWE WOULD LOVE TO SETUP A VIDEO CALL WITH YOU! WHEN ARE YOU AVAILABLE?",
79+
);
80+
81+
const contactURL = `/support/new?hideExtra=true&type=purchase&subject=CoCalc%20On-prem&body=${body}&title=Purchase%20CoCalc%20On-prem`;
82+
83+
function renderContact(): JSX.Element {
84+
return (
85+
<Alert
86+
type="info"
87+
banner={true}
88+
showIcon={false}
89+
style={{
90+
textAlign: "center",
91+
fontSize: "125%",
92+
marginTop: "30px",
93+
marginBottom: "30px",
94+
}}
95+
message={
96+
<>
97+
Please <A href={contactURL}>contact us</A> for questions, licensing
98+
details, and purchasing.
99+
</>
100+
}
101+
/>
45102
);
103+
}
104+
105+
function renderPriceInfo(): JSX.Element {
106+
if (PUBLISH_PRICE) {
107+
return (
108+
<>
109+
<List
110+
grid={{ gutter: 30, column: 3, xs: 1, sm: 1 }}
111+
dataSource={data}
112+
renderItem={({ price, individuals, icon, title, academic }) => {
113+
return (
114+
<PricingItem title={title} icon={icon}>
115+
<Line amount={individuals} desc={"Users"} />
116+
{academic ? (
117+
<Line amount={1} desc="Academic discount" />
118+
) : undefined}
119+
<br />
120+
<br />
121+
<div>
122+
<span
123+
style={{
124+
fontWeight: "bold",
125+
fontSize: "18pt",
126+
color: COLORS.GRAY_DD,
127+
}}
128+
>
129+
{typeof price === "number" ? (
130+
<>
131+
{money(price, true)}
132+
<span style={{ color: COLORS.GRAY_L }}>/year</span>
133+
</>
134+
) : (
135+
<Button onClick={() => router.push(contactURL)}>
136+
Contact us
137+
</Button>
138+
)}
139+
</span>
140+
</div>
141+
</PricingItem>
142+
);
143+
}}
144+
/>
145+
<Paragraph>
146+
Discounts for: academic institutions, multi-year committments,
147+
first-year discounts, ...
148+
</Paragraph>
149+
{renderContact()}
150+
</>
151+
);
152+
} else {
153+
return (
154+
<>
155+
<Paragraph>
156+
CoCalc OnPrem is a scalable solution and the license price depends
157+
on the use case, expected number of users, level of support, and
158+
amount of customization and training involved.
159+
</Paragraph>
160+
{renderContact()}
161+
</>
162+
);
163+
}
164+
}
46165

166+
function cloud(): JSX.Element {
47167
return (
48168
<>
49169
<Title level={2}>
50170
CoCalc OnPrem <Icon name="network-wired" style={{ float: "right" }} />
51171
</Title>
172+
52173
<Paragraph>
53174
<Text strong>
54-
<A href="https://onprem.cocalc.com/">CoCalc OnPrem</A>
175+
<A href="https://onprem.cocalc.com/">CoCalc OnPrem</A>{" "}
55176
</Text>{" "}
56-
is an on-prem version of CoCalc that runs on a full-fledged{" "}
57-
<A href={"https://kubernetes.io"}>Kubernetes Cluster</A>. The
58-
underlying services and their architecture are the same, as the ones
59-
that power the main service at cocalc.com. This means you get the same
60-
overall performance, scalability and reliability as the{" "}
61-
<A href="https://cocalc.com">main cocalc.com website</A>.
62-
</Paragraph>
63-
<Paragraph>
64-
<Text strong>Features</Text>
177+
is a <Text strong>self-hosted version of CoCalc</Text> designed to run
178+
on your own infrastructure. Built on the same robust architecture that
179+
powers the main CoCalc platform, OnPrem delivers exceptional
180+
performance, scalability, and reliability. This enterprise-grade
181+
solution offers:
65182
<ul>
183+
<li>Complete control over your data and computing environment;</li>
66184
<li>
67-
Jupyter Notebooks, a recent version of Sage, Python 3, R, Octave
68-
and LaTeX. Editing code and text-files, Linux terminal, compiling
69-
code, and virtual X11 desktop are included as well. Beyond the
70-
standard set of included software, it's also possible to define
71-
and build customized software environments.
185+
Enhanced privacy and security for sensitive research and
186+
educational content;
72187
</li>
73188
<li>
74-
Support for <Text strong>single sign-on</Text>, in particular,
75-
includes SAML.
189+
Seamless integration with your existing IT infrastructure – for
190+
example SAML based SSO authentication;
76191
</li>
192+
<li>Customizable features to meet specific institutional needs;</li>
77193
<li>
78-
The networking is defined by standard{" "}
79-
<A href={"https://kubernetes.github.io/ingress-nginx/"}>
80-
NGINX ingress rules
81-
</A>
82-
. It's possible to run within a VPN as well.
194+
The full suite of collaborative tools available on cocalc.com:{" "}
195+
<Text strong>
196+
Jupyter Notebooks, Python, SageMath, R, Octave and LaTeX
197+
</Text>
198+
. Editing code- and text-files, Linux terminal, compiling code,
199+
and a virtual X11 desktop are included as well. Beyond the
200+
standard set of included software, it's also possible to define{" "}
201+
<Text strong>customized software environments</Text>.
83202
</li>
84203
<li>
85-
You can <Text strong>deploy</Text> this solution on your own
86-
bare-metal cluster or managed kubernetes clusters like{" "}
87-
<A href={"https://aws.amazon.com/eks/"}>Amazon's EKS</A> or{" "}
88-
<A href={"https://cloud.google.com/kubernetes-engine"}>
89-
Google's GKE
90-
</A>
91-
. Other options should work as well.
204+
We'll guide you through the setup process and give you enough
205+
information to be able to manage the service, react to issues,
206+
plan resource requirements, and know how to scale the various
207+
services to your expected usage.
92208
</li>
93209
</ul>
210+
Experience the cutting-edge capabilities of CoCalc within your own
211+
secure ecosystem, providing your team or institution with a tailored,
212+
high-performance platform for scientific computing, mathematics, and
213+
data science collaboration.
94214
</Paragraph>
215+
95216
<Paragraph>
96217
<Text strong>Prerequisites</Text>
97218
<ul>
98219
<li>
99-
A <Text strong>Kubernetes cluster</Text> and some experience
100-
managing it. We'll guide you through the setup and give you enough
101-
information to be able to manage the service, react to issues,
102-
plan resource requirements, and know how to scale the various
103-
services to your expected usage.
220+
A{" "}
221+
<Text strong>
222+
<A href={"https://kubernetes.io"}>Kubernetes Cluster</A>
223+
</Text>{" "}
224+
and some experience managing it. OnPrem should run on your own
225+
bare-metal cluster or a managed kubernetes clusters like{" "}
226+
<A href={"https://aws.amazon.com/eks/"}>Amazon's EKS</A> or{" "}
227+
<A href={"https://cloud.google.com/kubernetes-engine"}>
228+
Google's GKE
229+
</A>
230+
.
104231
</li>
105232
<li>
106233
Some experience working with{" "}
@@ -114,7 +241,7 @@ function Body() {
114241
<A href={"https://letsencrypt.org/"}>letsencrypt</A>).
115242
</li>
116243
<li>
117-
A standard{" "}
244+
A common{" "}
118245
<A href={"https://www.postgresql.org/"}>
119246
<Text strong>PostgreSQL</Text>
120247
</A>{" "}
@@ -140,21 +267,7 @@ function Body() {
140267
<A href="https://onprem.cocalc.com/">CoCalc OnPrem documentation</A>.
141268
</Paragraph>
142269
<Title level={3}>Purchasing CoCalc OnPrem</Title>
143-
<Paragraph>
144-
CoCalc OnPrem is a scalable solution and the license price depends on
145-
the use case, expected number of users, level of support, and amount
146-
of customization and training involved.
147-
<Button
148-
type="link"
149-
onClick={() =>
150-
router.push(
151-
`/support/new?hideExtra=true&type=purchase&subject=CoCalc%20OnPrem%20Quote&body=${body}&title=Purchase%20CoCalc-OnPrem`,
152-
)
153-
}
154-
>
155-
Contact us for a quote.
156-
</Button>
157-
</Paragraph>
270+
{renderPriceInfo()}
158271
</>
159272
);
160273
}
@@ -173,36 +286,7 @@ function Body() {
173286
Premises
174287
</Title>
175288

176-
<Paragraph>
177-
CoCalc's on-premises offering allow you to run CoCalc on your own
178-
machine or cluster in order to keep your data on-site and use compute
179-
resources that you already have.
180-
</Paragraph>
181-
<div>
182-
<Alert
183-
type="info"
184-
banner={true}
185-
showIcon={false}
186-
style={{
187-
textAlign: "center",
188-
fontSize: "125%",
189-
marginTop: "30px",
190-
marginBottom: "30px",
191-
}}
192-
message={
193-
<>
194-
Please{" "}
195-
<A
196-
href={`/support/new?hideExtra=true&type=purchase&subject=CoCalc%20On-prem&body=&title=Purchase%20CoCalc%20On-prem`}
197-
>
198-
contact us
199-
</A>{" "}
200-
for questions, licensing details, and purchasing.
201-
</>
202-
}
203-
/>
204-
{cloud()}
205-
</div>
289+
<div>{cloud()}</div>
206290
</div>
207291
);
208292
}

0 commit comments

Comments
 (0)