Configure public site ingress
This commit is contained in:
@@ -44,3 +44,53 @@ spec:
|
||||
- ops.shengxintui.com
|
||||
- api.shengxintui.com
|
||||
secretName: shengxintui-com-tls
|
||||
---
|
||||
apiVersion: traefik.io/v1alpha1
|
||||
kind: Middleware
|
||||
metadata:
|
||||
name: redirect-to-https
|
||||
spec:
|
||||
redirectScheme:
|
||||
scheme: https
|
||||
permanent: true
|
||||
---
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: geo-rankly-web-http
|
||||
annotations:
|
||||
traefik.ingress.kubernetes.io/router.middlewares: geo-rankly-redirect-to-https@kubernetescrd
|
||||
traefik.ingress.kubernetes.io/router.entrypoints: web
|
||||
spec:
|
||||
ingressClassName: traefik
|
||||
rules:
|
||||
- host: saas.shengxintui.com
|
||||
http:
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
backend:
|
||||
service:
|
||||
name: frontend
|
||||
port:
|
||||
number: 80
|
||||
- host: ops.shengxintui.com
|
||||
http:
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
backend:
|
||||
service:
|
||||
name: ops-web
|
||||
port:
|
||||
number: 80
|
||||
- host: api.shengxintui.com
|
||||
http:
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
backend:
|
||||
service:
|
||||
name: tenant-api
|
||||
port:
|
||||
number: 8080
|
||||
|
||||
@@ -14,6 +14,7 @@ resources:
|
||||
- infra-qdrant-minio.yaml
|
||||
- jobs.yaml
|
||||
- apps.yaml
|
||||
- official-placeholder.yaml
|
||||
- ingress.yaml
|
||||
|
||||
labels:
|
||||
|
||||
@@ -0,0 +1,497 @@
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: official-placeholder-html
|
||||
labels:
|
||||
app.kubernetes.io/name: official-placeholder
|
||||
data:
|
||||
index.html: |
|
||||
<!doctype html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="description" content="省心推,面向企业增长团队的智能内容与获客运营工具。">
|
||||
<title>省心推 - 智能内容与获客运营</title>
|
||||
<style>
|
||||
:root {
|
||||
color-scheme: light;
|
||||
--ink: #111827;
|
||||
--muted: #697386;
|
||||
--line: #d8dee8;
|
||||
--paper: #ffffff;
|
||||
--soft: #f5f7fb;
|
||||
--accent: #126d5a;
|
||||
--accent-dark: #0a4238;
|
||||
--warm: #b28b51;
|
||||
}
|
||||
|
||||
html,
|
||||
body {
|
||||
margin: 0;
|
||||
min-height: 100%;
|
||||
background: var(--paper);
|
||||
}
|
||||
|
||||
body {
|
||||
min-height: 100vh;
|
||||
position: relative;
|
||||
color: var(--ink);
|
||||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC",
|
||||
"Microsoft YaHei", sans-serif;
|
||||
overflow-x: hidden;
|
||||
}
|
||||
|
||||
a {
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
body::before {
|
||||
content: "";
|
||||
position: fixed;
|
||||
inset: 0;
|
||||
pointer-events: none;
|
||||
background:
|
||||
linear-gradient(90deg, rgba(17, 24, 39, 0.045) 1px, transparent 1px),
|
||||
linear-gradient(180deg, rgba(17, 24, 39, 0.035) 1px, transparent 1px),
|
||||
radial-gradient(circle at 78% 14%, rgba(18, 109, 90, 0.12), transparent 28%),
|
||||
radial-gradient(circle at 18% 78%, rgba(178, 139, 81, 0.12), transparent 30%);
|
||||
background-size: 72px 72px, 72px 72px, auto, auto;
|
||||
}
|
||||
|
||||
.page {
|
||||
min-height: 100vh;
|
||||
display: grid;
|
||||
grid-template-rows: auto 1fr auto;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
header,
|
||||
main,
|
||||
footer {
|
||||
width: min(1100px, calc(100% - 40px));
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
gap: 20px;
|
||||
padding: 26px 0 18px;
|
||||
border-bottom: 1px solid var(--line);
|
||||
}
|
||||
|
||||
.brand {
|
||||
display: flex;
|
||||
align-items: baseline;
|
||||
gap: 12px;
|
||||
}
|
||||
|
||||
.brand strong {
|
||||
font-size: 24px;
|
||||
letter-spacing: 0;
|
||||
}
|
||||
|
||||
.brand span,
|
||||
.phone-label {
|
||||
color: var(--muted);
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.phone {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
min-height: 38px;
|
||||
padding: 0 14px;
|
||||
border: 1px solid rgba(18, 109, 90, 0.28);
|
||||
border-radius: 6px;
|
||||
background: rgba(255, 255, 255, 0.78);
|
||||
color: var(--accent-dark);
|
||||
font-weight: 700;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
main {
|
||||
display: grid;
|
||||
grid-template-columns: minmax(0, 1fr) 340px;
|
||||
gap: 64px;
|
||||
align-items: center;
|
||||
padding: 70px 0 54px;
|
||||
}
|
||||
|
||||
.eyebrow {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
margin: 0 0 22px;
|
||||
color: var(--accent);
|
||||
font-size: 13px;
|
||||
font-weight: 700;
|
||||
letter-spacing: 0.08em;
|
||||
}
|
||||
|
||||
.eyebrow::before {
|
||||
content: "";
|
||||
width: 38px;
|
||||
height: 1px;
|
||||
background: var(--accent);
|
||||
}
|
||||
|
||||
h1 {
|
||||
margin: 0;
|
||||
max-width: 760px;
|
||||
font-size: 64px;
|
||||
line-height: 1.04;
|
||||
letter-spacing: 0;
|
||||
}
|
||||
|
||||
.lead {
|
||||
max-width: 680px;
|
||||
margin: 26px 0 0;
|
||||
color: var(--muted);
|
||||
font-size: 19px;
|
||||
line-height: 1.85;
|
||||
}
|
||||
|
||||
.actions {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 14px;
|
||||
margin-top: 36px;
|
||||
}
|
||||
|
||||
.primary {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
min-height: 48px;
|
||||
padding: 0 20px;
|
||||
border-radius: 6px;
|
||||
background: var(--ink);
|
||||
color: #fff;
|
||||
font-weight: 700;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.status {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
min-height: 48px;
|
||||
color: var(--muted);
|
||||
font-size: 15px;
|
||||
}
|
||||
|
||||
.panel {
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
border: 1px solid rgba(216, 222, 232, 0.92);
|
||||
border-radius: 8px;
|
||||
background: rgba(255, 255, 255, 0.82);
|
||||
padding: 26px;
|
||||
box-shadow: 0 24px 60px rgba(17, 24, 39, 0.08);
|
||||
}
|
||||
|
||||
.panel::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
left: 0;
|
||||
height: 3px;
|
||||
background: linear-gradient(90deg, var(--accent), var(--warm));
|
||||
}
|
||||
|
||||
.panel-title {
|
||||
margin: 0;
|
||||
color: var(--muted);
|
||||
font-size: 13px;
|
||||
font-weight: 700;
|
||||
letter-spacing: 0.08em;
|
||||
}
|
||||
|
||||
.launch {
|
||||
margin: 18px 0 0;
|
||||
font-size: 38px;
|
||||
line-height: 1.15;
|
||||
font-weight: 800;
|
||||
}
|
||||
|
||||
.panel-copy {
|
||||
margin: 18px 0 0;
|
||||
color: var(--muted);
|
||||
font-size: 15px;
|
||||
line-height: 1.8;
|
||||
}
|
||||
|
||||
.feature-list {
|
||||
display: grid;
|
||||
gap: 12px;
|
||||
margin: 24px 0 0;
|
||||
padding: 0;
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
.feature-list li {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
color: var(--muted);
|
||||
font-size: 15px;
|
||||
}
|
||||
|
||||
.feature-list li::before {
|
||||
content: "";
|
||||
width: 7px;
|
||||
height: 7px;
|
||||
border-radius: 50%;
|
||||
background: var(--accent);
|
||||
}
|
||||
|
||||
footer {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
gap: 12px;
|
||||
padding: 22px 0;
|
||||
border-top: 1px solid var(--line);
|
||||
color: var(--muted);
|
||||
font-size: 13px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
footer a {
|
||||
color: inherit;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
@media (max-width: 860px) {
|
||||
main {
|
||||
grid-template-columns: 1fr;
|
||||
gap: 30px;
|
||||
padding-top: 40px;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 42px;
|
||||
}
|
||||
|
||||
.lead {
|
||||
font-size: 17px;
|
||||
}
|
||||
|
||||
header {
|
||||
align-items: flex-start;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
footer {
|
||||
justify-content: center;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 560px) {
|
||||
header,
|
||||
main,
|
||||
footer {
|
||||
width: min(100% - 28px, 1120px);
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 36px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="page">
|
||||
<header>
|
||||
<div class="brand">
|
||||
<strong>省心推</strong>
|
||||
<span>智能内容与获客运营</span>
|
||||
</div>
|
||||
<a class="phone" href="tel:17788409108">17788409108</a>
|
||||
</header>
|
||||
<main>
|
||||
<section>
|
||||
<p class="eyebrow">MODERN GROWTH PLATFORM</p>
|
||||
<h1>智能内容运营,让获客增长更省心。</h1>
|
||||
<p class="lead">
|
||||
省心推将为企业提供智能内容、品牌曝光与获客运营能力。
|
||||
从内容策划到发布协同,帮助团队更高效地触达客户、沉淀线索。
|
||||
</p>
|
||||
<div class="actions">
|
||||
<a class="primary" href="tel:17788409108">联系 17788409108</a>
|
||||
<span class="status">企业内容增长服务</span>
|
||||
</div>
|
||||
</section>
|
||||
<aside class="panel">
|
||||
<p class="panel-title">PRODUCT FOCUS</p>
|
||||
<p class="launch">内容运营<br>获客增长</p>
|
||||
<p class="panel-copy">
|
||||
面向企业营销与运营场景,整合智能生成、渠道协同和线索跟进能力。
|
||||
</p>
|
||||
<ul class="feature-list">
|
||||
<li>智能内容运营</li>
|
||||
<li>品牌曝光管理</li>
|
||||
<li>企业获客增长</li>
|
||||
</ul>
|
||||
</aside>
|
||||
</main>
|
||||
<footer>
|
||||
<span>© 2026 省心推</span>
|
||||
<span class="phone-label">咨询电话:17788409108</span>
|
||||
<a href="https://beian.miit.gov.cn/" rel="noopener noreferrer">皖ICP备2026013039号-2</a>
|
||||
</footer>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
default.conf: |
|
||||
server {
|
||||
listen 80;
|
||||
server_name _;
|
||||
root /usr/share/nginx/html;
|
||||
index index.html;
|
||||
|
||||
location / {
|
||||
add_header Cache-Control "no-store, no-cache, must-revalidate" always;
|
||||
try_files $uri /index.html;
|
||||
}
|
||||
}
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: official-placeholder
|
||||
labels:
|
||||
app.kubernetes.io/name: official-placeholder
|
||||
spec:
|
||||
selector:
|
||||
app.kubernetes.io/name: official-placeholder
|
||||
ports:
|
||||
- name: http
|
||||
port: 80
|
||||
targetPort: http
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: official-placeholder
|
||||
labels:
|
||||
app.kubernetes.io/name: official-placeholder
|
||||
spec:
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
app.kubernetes.io/name: official-placeholder
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app.kubernetes.io/name: official-placeholder
|
||||
spec:
|
||||
containers:
|
||||
- name: nginx
|
||||
image: docker.io/geo-rankly/frontend:bb2ad3f6
|
||||
imagePullPolicy: IfNotPresent
|
||||
ports:
|
||||
- name: http
|
||||
containerPort: 80
|
||||
readinessProbe:
|
||||
httpGet:
|
||||
path: /
|
||||
port: http
|
||||
initialDelaySeconds: 3
|
||||
periodSeconds: 10
|
||||
livenessProbe:
|
||||
httpGet:
|
||||
path: /
|
||||
port: http
|
||||
initialDelaySeconds: 15
|
||||
periodSeconds: 20
|
||||
resources:
|
||||
requests:
|
||||
cpu: 10m
|
||||
memory: 16Mi
|
||||
limits:
|
||||
cpu: 100m
|
||||
memory: 64Mi
|
||||
volumeMounts:
|
||||
- name: html
|
||||
mountPath: /usr/share/nginx/html/index.html
|
||||
subPath: index.html
|
||||
readOnly: true
|
||||
- name: html
|
||||
mountPath: /etc/nginx/http.d/default.conf
|
||||
subPath: default.conf
|
||||
readOnly: true
|
||||
volumes:
|
||||
- name: html
|
||||
configMap:
|
||||
name: official-placeholder-html
|
||||
---
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: official-placeholder
|
||||
annotations:
|
||||
cert-manager.io/cluster-issuer: letsencrypt-prod
|
||||
traefik.ingress.kubernetes.io/router.entrypoints: websecure
|
||||
spec:
|
||||
ingressClassName: traefik
|
||||
rules:
|
||||
- host: shengxintui.com
|
||||
http:
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
backend:
|
||||
service:
|
||||
name: official-placeholder
|
||||
port:
|
||||
number: 80
|
||||
- host: www.shengxintui.com
|
||||
http:
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
backend:
|
||||
service:
|
||||
name: official-placeholder
|
||||
port:
|
||||
number: 80
|
||||
tls:
|
||||
- hosts:
|
||||
- shengxintui.com
|
||||
- www.shengxintui.com
|
||||
secretName: official-placeholder-tls
|
||||
---
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: official-placeholder-http
|
||||
annotations:
|
||||
traefik.ingress.kubernetes.io/router.entrypoints: web
|
||||
spec:
|
||||
ingressClassName: traefik
|
||||
rules:
|
||||
- host: shengxintui.com
|
||||
http:
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
backend:
|
||||
service:
|
||||
name: official-placeholder
|
||||
port:
|
||||
number: 80
|
||||
- host: www.shengxintui.com
|
||||
http:
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
backend:
|
||||
service:
|
||||
name: official-placeholder
|
||||
port:
|
||||
number: 80
|
||||
Reference in New Issue
Block a user