apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:
  creationTimestamp: null
  name: community-search-django-v4
  namespace: default
spec:
  encryptedData:
    DEFAULT_DB_HOST: AgCA3nL8KR7MrYdDSRPfMB43s69mIkqdEczeGNDE2XilelIt2aRNLJbzg4Ad/vl0jmcVZH3hRgJQmpDuel+7mFtGZo2ZnfF2khL6lTDkzKY2cTBAPvsGpVwKjdmQnsL+/SUf9IN/rAJjmZ9aMyE3w1j1Fzo2NqBvyvqKHqu8heUNBvD+Vq4RbUQKVw7e+hpoyLxO6tLcsZN3AJlnsqvGtkafj1VzbbO/4I7NxLjHR7LKVMjOiqSUA2B7WXlwXQmqxDLR3FwlcHKn8KCqQm/LaLIfnvmCdH145BiasYkonu6ddo4W0O1XKKsIuz5LemEUM6PnNO/ZLjzLjVyRYOpLPw2NI+R6XmwIQ1iUEyiVIwMaW/FCuqMMQKVVaqfdHC5TBX/fM8B9fyePUD4bfMDhIdvfgaS+7cR+EQ5ImMpBeETblug1SbGiZy7M7TAn+dzERvT+C9Gx7jYOAJTwjSXxAIVhbczWU4yhV6L95ZqFqejFp2/UMMGaetqQ2xnNGcFDlN1gcynYoRkt/SD+unx/SphttSX6LwDu233aU8i0ESOzWEAZC5lwoz35SDfuRNj2qngTI1NGCQic/Wt8Xo8cR4JRRNIUIuzBtOhbM4/5xDFQ33NinzrEsOweGLsLK+zh8r74C/v+Mb8LK6CY9OtpJzdeRVjat5v35a2xaeNl4Rdh777++jJN1M+Rdc3QR96TRvC2CR5QFN/WAsFWqUk=
    DEFAULT_DB_NAME: AgAb5Q5xe6mFdtUl7lB+ybh07Kxrr8Z3mnzcTXC4OhmzeTmdDUbPhpl4MjV3zDJMMC+44/jslQuZ7PFrrybGYmK6iyBHWCJNqWU8DWVyDxCQu9u6wrd0tGDl7hi9O1QEoqDft8NjTbiuLO3tbiTUO56fJsT96IRP90NP1sfcHcWhcfmEOQiWpG9UxSnULb2pyBgI3JEqutGoOZ8ohtmym8iQKWrV6NskBJoXN/VppS1ZOXjX+G54EzhqZUm/fU5sgGIAXJ9q1P2IkkHi7BNHHgtJr6iG6nWK1qiZyU+QuG0594fqp58vrPqfBelVLe5c2/14+9LnM2TPmmuPVuX/eepD3Kj8xkcUituKZzfeX5Q/7ZkLolBrKdzMclfPZ3W9V9dnZ4AhKX50t1aZmH9e/D30J7j0iwrgr9/TWFj1JUPcauVHdaEeqdAHqCRhAj0jZRfUnoe3YxBw3Be9DyCNV5QiUnbQYI1+MXrgjeeqvWHbCOJCtyG+5eWFvOd3lN+Xv5nPN72Gtdw9Dr1Lxmf4W179MaZ6awVWJjayBYnrY+wR7TJfX6agfJTSOREV3Km4dTvGsHfB3Pg91MxPDQw+HzC9eIOEj86W2PGNKyp2VRjGn8rF3X0yMbzJjLtJgDahoQKiajjUUQznZ8fGs67J4sCAq38njeF3Ug++/+PYxGPHc58smieRIGA1hSUvcirM4Xvny9kbfSYdt9Izls/+UZrZ
    DEFAULT_DB_PASSWORD: AgCEuhmxD+nPG2SQHQAsjN723D+DyQBYKxb3WNfwzSBzrObjainG4+OrAi1WNd5SE8FuAgxdENQ+5TJkA56X46eSv4Xyp2/PBcVjXw27OFk9Q9Kvsi4sl3uMNB1ORP9A/m9jtKmxlrRMb9y/lAs7djHVyckmNjZ7NQJBOIUtb1rjlE/pjySCBusi9QndrD8tF9juCdWrudD5QsSKFohS0ErEx+uFpmLok5TNB8TghLoS5zdcSMynAVISRSaO1C/3IiajVy24228I/eVKByUGg3z7sV6rdCi2TymFbuQDe0dtKg9Zeee5WDKnFw3GB8ZIAlFMIXJ6a36ZiOwli53d7y/OW8skoXNJkU3wJY0XtRHN1ZHh8Nunhu3oeTtLhaiKggdV8Wn1eYhxirFwT6U8CkcmJREBnPk6YP4FzRFXSSuA4MIWq6E8BgMicDA5KOB5pAuXVrVpawtyC5OCWH+7D3iU0u61pVFDxGpWX9vcyIlBzsgzsdBivzvm31C+FzrzGug9TDJFyxXUN+TN61ro4NhTZmw1o5kheB8pyJzJ48H4oh6btQhwIXJz6P2J89Z7aww48VJrDd2Uqig8QGsu5Ly4MkqAhiMRRJOwIP9MGsocVO26hI3p63FSYNfEzal5iPezqLSWf3V48U3S+62ahcLpRr0naEtfhAcn84MsD7eNAGDJNivNyDCpNk9ycmcH2u8AOtpgv/JDdd8Lhcg=
    DEFAULT_DB_USER: AgCKNQuqE+JbtH7yKqrheSFEdg1DHpmWrO5YLpIY3BzsjrKWfiqboTHaTgHIHwjkLcz2B0PBrzrSgtae333LXPyfUj0K8NgaCfQIurSw8Dw75wprtB1dwj/aHfr1lKh0ZjbHMd76sfMigISB73S+js+fW8e9tkHMf7W4uS2y+7JDW5qgAvpq0dm9XR2sdNytaRQ0O5F6XnSNEQFT70tOz3QaOWE7hgKhs6oyckhKu5VtWf0ysT7Cbx4cHTVB3gFn0kdQZzVagQNnONyzD25SUVhGWBEZWTzJZBOTzajm7qbg1l4wJ3ZX9gKQpgLjl7ZJcJuAWHjAs2797GtKTuaPe2pbMxttel7sroVVZiOeYqb8UzmWnCCD8Vn9tHskEYt8LlgNtXEjUqXh8yyuJLhQkkBxSscGAJeYCKLeKtG8L4cpSSl905yhzsd3hk1vr96HD/QI9ZZyoJDC+94g9qZsvFJ+akGGeUoRPYj5FFgtqHKSqfiU7CPMZOISfV8Y5iUj3YFBrRWyHf3qw1XG+TxfpVFXNM9llJ6kxRh1oP4T06GS7N3nmGU1/7nrY2PRxqipt34T3K2OsO5SH575VaHL8DQYnM03AXAqwRFfpg/AaCtauHoN8rwsmOSgBz3dy3F8yPe9tpwCxQkNhLQKG5xEyVDpI8K2AyTJLIFz7qnusxbUwDIv2wT8XnPQIpI9UjI7+31zDpjqneqQv5Eg6pjAvEDB
    DISCOURSE_DB_HOST: AgAzx9kAXVpI7Sqmoko1OFlUv+h3geviZgvmO6T3cGS6ZzLsJqQdCWPZ0KII2+6UjCCYhmHTRcZ9mHUrUpDQ/b0opQNHIJyEZeTGGrCUvm8pt6OXc2NuseILQ5f0Dr3CYXmaNtVGeeFy7Au+AlSAKaKT2Yv2UjReabP8/FlWxeF+j50OZM+nAXOth4nwN6ppy4hdBY49FYMLlT+hpSqW4WkHCzw/aJZwiKnsCPJ30eOGxWVb2AqgIBTSafX9F1BEVo3gUZ71W9rIBq4tZJU+ZqHjYHVw9oICjvWHzN73nKktuFgVIMNEOMo8O+pq+Hiyy/5cdODQCvIpiB7ZMMLMp7FK1DlC7OFAD5jFNQSOVC5cbMV6ISD2tpbpA/TXMDvfnCHHytMv0iD1zz54P03tFynl2jzqwjId1ygp5Zs6kjDzzXIJXhrzpS0/O1W5hb+L9Cm5PnZVHSP9vq5ooZ7vcy0Vf4/aqEkp34Lji/8de5X4WwqtWuiqENF8r7tLs5zQUiT+8IvD/FGj5M/TNsinqSnjldL8bx1RGUKE3z+t+S366B16ZzQP0OLtuLqSZQxC5zWE70t7U7qyyWmX7IwcyckrQ89JwhvSX3zQUCu/O+FIiJ14sjUyyfQmPgnziBTmXCDozRq0nXcr3Ud8hiZoeXRzi1voycznwdZ2NhMkCCzdQw1TRYF80+ioyxZMGdEZUeyNtF+Xlf1KjCiunf0=
    DISCOURSE_DB_NAME: AgAf2mc4t4SyS7GzBa3nq92fUuH+2w63yqPVRnLuA/B5hEd8kniFKXQEDRZ3ZUSs+WL96fAUGXe3EgQYEkGMxQhpEo9AtLmTq3kMT1asROcTewyjd47s5fuwJmRdxPWFPZxVeQrRjP4FV7tOSm2IL1EBsEHy6SLdfefFK1bol+qinKDD0A8EQL2O6ejltydmf3GQ99Rfciu3MbKd9X6wrMCk64Zt359jwqX5pJqyklmVxeey9NR8zjVwNFWnMP0VVAnyp8rImDHLDGJ6mYV39ud8/d5ih7ZQz+zQI1zuVPjiaMqnFCu1Hzel5/zHqzeJvWEuKaoD6tKzxgoiL0xTOlcXJWW2h8Tc+sNtEeaEXu5lJdiRyeipHhpnqi/1emDWfy6sPUsdUKEa2jgd5F7X8+5ByVXVHBeSkEf/bs1ZMVdPwp48lR9uF3RTYSIIOD9d27NbhjND3sZCfS5o93EvTyts+Usl7xNJIGrvioCBw9FGQuzz6g3dBDWxBslJYYqfGGMRT4I8NzrR6ce4SgkR7gYkJhCXmFTcPKbSTsuXVEhAX+64S+chv0HYA8pybwDhvnikUrt8iVpavZ/q7gaw99ZKMt8KBLJETvnMBLCHT3N9ae8pmpAw+C9fh43549HZJ9Vc+KYZUHWu0iVp1RiVt2uzg0XCtaxTTpnTK6I48eA/3Wteysz7uXNwz6CXeBPtN3NRbTyQRqdD+WY=
    DISCOURSE_DB_PASSWORD: AgDJpqcTpQ5ypu4MRS8Bj356S5d6sxapKUeCxIEROiWqn+IMsGXmAIVCPasE5POl2ifUD1w3uLaSVSnibZmYeXfbpVaVQQ/fFbnFNsFFzAe2YEygVpED+X4BBsL3TmddHHqXtxfZzdV38J9khjEhhl4RClChity0kYSMgUN9sfaKXq9lzL1f93+TJ1e0kmBTSsgM1Oy2RMZyjl/gw7CIOA7eONBRPR853VI9j+0HFQO+HZYWQHbYFDFi7Vx/tRWz/2hpW2aSb0m6ib59Z38n2pNjNKPXG8Lg9DLUnJcJnP8VIvbaoLwcR0N0xLbmtRMScF22rkP85omkJH/cRYslht7PD6Bin4E0AIS6xCgh6/Fiqagc8hyaSSMRdHazdndJ456NxeuYpXOPMIntWvkbVpsT6y/E+b7PndqkH/RZ2UHxLzf1L9ok5L/HN7m9/8mP2sU/f/fHY6CxfmIP4KJxgIQmvZhRdRtV0IZWdgf/sh90WOoVnpwHqaeR9kehwU6TcmLfgaSNMH1PJWvVH9Iqo8npX23iLxvBbhKHRItcsypeiszlj6ybMSNuJHZDJ7PLX4axY01KX5biGoLp6j9B2N4e52cFBhvOvr6864epBQZfU7HWt4YdHlbzXYj1i04YVipYFWvAP9p/FRLGbHzZsQfiG91WMWGeIv52GJbK5VyLOhqgrgCJOdwLqZ28esMPZUeuY37fwTrH+SpzPy8=
    DISCOURSE_DB_USER: AgBQKvezs4PDfWJ+Lwgf8TvlxUfOlUY8vudqw1UQXro1/mvGDW7fWOIF1wgY0icOWhQklgA1gWZXGRwcwZUsdtsycHdi+mCrCyZ8gXajkkdTVGNc1JhEXlkbNTiQgvj/WNQYtYbZQxv6JN8NoQ9XwsuXxndMOOhknl7GEQdVDZKk3wndFtZ+W396e4KijhH/m/6ZYlTqCVhaS60tb+sS5NxqukNJ/BT5aTLggZNyCNOi2lma7fAz8qbIir/f8v7zTPXZ0n95eB425mZNF+X3FTEX0nTCdH5PIzDfKrnPcLrhckGth5MAqTodaRpHTcRcYyfvaU64wqWlid85HfCgHzV+ASKDGFoRpk+wWBKLCXxEqjr7k3KMsc+mbshzh1zD6kBdkbvuKRZt5oPoCyIepdJiBMyQdrdt+4bYvJ2spC3GhlVnOi3B1lRTxjIKRBaf50hrEdaXglh13ifm9i8CrxfDubjFSnjKVU67EodXnTpu6WQZymctsdIUYiQaDp3prbND3oGxdzkfCKj6NF+aB8ptr8vvafKs3g/INU2tNmrOXxTcvKvO5QWHfj8S9zmuWlolh+2lWorRC/6XOAWIIPEKTx8i/lU42eQIzoxrOM2uX72dTVVf3V1YdBEWHr/YWOQ61KfATUUr+NANW8iIy4LdwOGZVndJuLy3RqCdSj55Oxa48xSsI05dVF7qdYEDPcxrPQ==
    SSO_API_TOKEN: AgBD0JMl/bkq7QYPWDba7GIts9kKBBNkDYhQ8mOkI+m4/Hkb1OyFFrpHxgXoIuAACuH5Fj23n/5tGM13h8UZ61X6QuXYKBBF8sVRnbsYspSxZSrJa3A4VMmuba9Kdxuo1DT7Nz2kDi3hGs008SNa8KnMimKbMjFFftURGATasZcDYRVTgM4LKzspSlbTrrWxTe54E2yWxN6W6uUqso/Qjjd9Mf6SdcnHMk6Ozo3fd/suVuDcA1iEbyArmGMeln/HOeEtuL0rP8FXHWCVO+QxCC1Nfi8BcphYuHgWvmILoNxpj7fpre4r6PizKf17WvSjx0IIk2uEq1lmxkf4sQCmQY0D8IwtBhXepBx4uJWZ2eYz0fJ6miD1qSAbM5zWbmI4HH6q99HrtnOiPp4hg31uZAqJqAQNGADssbSN43Y+C+E6+bo9Q3buv9nY06OXgbsMlcLp4XFZInAdLO/b6memPerzxXCIWVTZnaxxsxPumW9IsK4Oqp0hoiInzYIlLa3/LDsUenLQqaLJ8BC0pCcBDmU84uspQ6pjG2Zo8WBzbt0UFwdql5Od1ER8ZXKzbkdUhf4Ocy9Sd0EoDq8Cd5u31nxXhkfM4SNMJlovun4StcpcwE0lm1LegGIjylUsNvgnXMVt5/jVOvPMc8txeeAZr+21mkLMVmCcvU6niSQn/fwmUquv81rIYwxfZ+sXRwGf1V92PXsWH/qDz8hqovwZekWF2qLrzOYVTAUAdxgxPTblJA7wht79stSaRWh4TughESOYft0PLR+HLC6XvKAZrcKV
  template:
    data: null
    metadata:
      creationTimestamp: null
      name: community-search-django-v4
      namespace: default
    type: Opaque

---

apiVersion: v1
kind: ConfigMap
metadata:
  name: community-search-django-v9
  namespace: default
data:
  DEBUG: 'false'
  ALLOWED_HOSTS: search.asktug.com
  BEHIND_PROXY: 'true'
  ELASTICSEARCH_HOSTS: http://community-search-es-v2:9200
  SSO_SESSION_DETAIL_ENDPOINT: https://accounts.pingcap.cn/api/_/sso/session
  SSO_SESSION_COOKIE_NAME: ssid
  SSO_USER_BEHAVIOR_REPORT_ENDPOINT: https://accounts.pingcap.cn/api/user-track/events
  SENTRY_DSN: https://b52a7ce21c964dc8b59adb3ebb19bda2@o226447.ingest.sentry.io/4504806593527808
  TIDBAI_API_TOKEN: ta-dUSD81yTuXlleTBKKTpt8M93OM03la8L0qoXI1Bin3LIyeaEO2
  TIDBAI_CHAT_ENGINE: tidb-bot-with-labs
  BIGMODEL_API_KEY: "ada15059349946fc45d189852433dc25.lDxs4uXJGYKVS5Lr"
  DEEPSEEK_API_KEY: "sk-7432af452c934779becfb717d23583c7"

---

apiVersion: v1
kind: ConfigMap
metadata:
  name: community-search-nginx-v1
  namespace: default
data:
  nginx.conf: |
    user  nginx;
    worker_processes  1;
    error_log  /var/log/nginx/error.log warn;
    pid        /var/run/nginx.pid;

    events {
        worker_connections  1024;
    }

    http {
        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;

        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';

        access_log  /var/log/nginx/access.log  main;

        sendfile        on;
        #tcp_nopush     on;
        gzip on;
        gzip_disable "msie6";
        gzip_min_length 1k;
        gzip_buffers 16 64k;
        gzip_http_version 1.1;
        gzip_comp_level 6;
        gzip_vary on;
        gzip_types text/plain application/x-javascript application/javascript application/css  text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;

        keepalive_timeout  65;

        server {
            listen 80 default_server;
            listen [::]:80 default_server;
            return 444;
        }

        server {
            listen 80;
            server_name search.asktug.com;

            if ($http_x_forwarded_proto = "http") {
                return 301 https://$server_name$request_uri;
            }
            absolute_redirect off;

            location / {
                proxy_set_header Host $host;
                proxy_set_header X-Forwarded-Host $host;
                proxy_set_header X-Forwarded-Server $host;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_buffering off;
                proxy_read_timeout 600;
                proxy_pass http://127.0.0.1:8201;
            }
        }
    }

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: community-search-deployment
  namespace: default
spec:
  replicas: 2
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
  selector:
    matchLabels:
      app: community-search
  template:
    metadata:
      labels:
        app: community-search
    spec:
      topologySpreadConstraints:
      - maxSkew: 1
        topologyKey: kubernetes.io/hostname
        whenUnsatisfiable: ScheduleAnyway
        labelSelector:
          matchLabels:
            app: community-search
      containers:
      - name: community-search-django
        image: registry.cn-hangzhou.aliyuncs.com/pingcap-ee/community-search:v2025-12-24-21-36-01
        envFrom:
        - configMapRef:
            name: community-search-django-v9
        - secretRef:
            name: community-search-django-v4
        resources:
          limits:
            cpu: "2"
            memory: 4Gi
          requests:
            cpu: 200m
            memory: 128Mi
      - name: community-search-nginx
        image: uhub.service.ucloud.cn/library/nginx:1.18.0
        livenessProbe:
          httpGet:
            path: /
            port: 80
            httpHeaders:
            - name: Host
              value: search.asktug.com
            - name: Cookie
              value: ssid=fakeid;
          periodSeconds: 10
          initialDelaySeconds: 3
        volumeMounts:
        - name: nginx-config-volume
          mountPath: /etc/nginx/nginx.conf
          subPath: nginx.conf
        ports:
        - containerPort: 80
        resources:
          limits:
            cpu: "4"
            memory: 4Gi
          requests:
            cpu: 1000m
            memory: 512Mi
      volumes:
      - name: nginx-config-volume
        configMap:
          name: community-search-nginx-v1
      imagePullSecrets:
      - name: aliyun-hangzhou-registry

---

apiVersion: v1
kind: Service
metadata:
  labels:
    app: community-search
  name: community-search
  namespace: default
spec:
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: community-search

---

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/proxy-body-size: 20m
    nginx.ingress.kubernetes.io/proxy-buffering: "off"
    nginx.ingress.kubernetes.io/proxy-read-timeout: "600"
  name: community-search
  namespace: default
spec:
  ingressClassName: nginx
  rules:
  - host: search.asktug.com
    http:
      paths:
      - backend:
          service:
            name: community-search
            port:
              number: 80
        path: /
        pathType: Prefix
  tls:
  - hosts:
    - search.asktug.com
    secretName: star-asktug-com-2025-tls

---

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: community-search-asktug-index
  namespace: default
spec:
  schedule: '30 23 */2 * *'
  concurrencyPolicy: Forbid
  jobTemplate:
    metadata:
      labels:
        app: community-search
    spec:
      template:
        spec:
          imagePullSecrets:
          - name: aliyun-hangzhou-registry
          containers:
          - name: community-search-asktug-index
            image: registry.cn-hangzhou.aliyuncs.com/pingcap-ee/community-search:v2025-07-18-17-29-44
            imagePullPolicy: IfNotPresent
            command:
            - python
            - manage.py
            - reindex_asktug_posts
            envFrom:
            - configMapRef:
                name: community-search-django-v9
            - secretRef:
                name: community-search-django-v4
          restartPolicy: OnFailure
