From bdb6a6bc48b9c504895968abaa5d1220979a5fd5 Mon Sep 17 00:00:00 2001 From: sljeff Date: Thu, 29 Sep 2022 17:38:35 +0800 Subject: [PATCH 1/6] feat: dev deploy --- .github/workflows/docker-build-push.yml | 52 ++++++------ deploy/dev/cm.yaml | 76 +++++++++++++++++ deploy/dev/deploy.yaml | 104 ++++++++++++++++++++++++ deploy/dev/secrets.yaml | 30 +++++++ deploy/dev/svc.yaml | 21 +++++ 5 files changed, 256 insertions(+), 27 deletions(-) create mode 100644 deploy/dev/cm.yaml create mode 100644 deploy/dev/deploy.yaml create mode 100644 deploy/dev/secrets.yaml create mode 100644 deploy/dev/svc.yaml diff --git a/.github/workflows/docker-build-push.yml b/.github/workflows/docker-build-push.yml index ce9716dc..3a5fdab5 100644 --- a/.github/workflows/docker-build-push.yml +++ b/.github/workflows/docker-build-push.yml @@ -4,10 +4,8 @@ name: Build & Deploy on: push: branches: + - "dev" - "main" - - "master" - tags: - - "v*.*.*" env: IMAGE_NAME: rss3/xlog @@ -47,33 +45,33 @@ jobs: tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} - # deploy-dev: - # runs-on: ubuntu-latest - # needs: build - # steps: - # - name: Checkout - # uses: actions/checkout@v2 - # - name: Set K8s context - # uses: aliyun/ack-set-context@v1 - # with: - # access-key-id: "${{ secrets.ACCESS_KEY_ID }}" - # access-key-secret: "${{ secrets.ACCESS_KEY_SECRET }}" - # cluster-id: "${{ env.DEV_ACK_CLUSTER_ID }}" - # - run: | - # wget https://github.com/mikefarah/yq/releases/download/v4.25.1/yq_linux_amd64.tar.gz -O - | tar xz && mv yq_linux_amd64 /usr/local/bin/yq - # curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.22.10/bin/linux/amd64/kubectl && chmod +x kubectl && mv kubectl /usr/local/bin/kubectl - # - uses: sljeff/secrets2env@main - # with: - # secrets-json: ${{ toJson(secrets) }} - # - env: - # IMAGE_TAG_RELEASE: ${{ env.IMAGE_NAME }}:${{ needs.build.outputs.version }} - # run: | - # sh apply.sh deploy/dev/* + deploy-dev: + runs-on: ubuntu-latest + needs: build + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Set K8s context + uses: aliyun/ack-set-context@v1 + with: + access-key-id: "${{ secrets.ACCESS_KEY_ID }}" + access-key-secret: "${{ secrets.ACCESS_KEY_SECRET }}" + cluster-id: "${{ env.DEV_ACK_CLUSTER_ID }}" + - run: | + wget https://github.com/mikefarah/yq/releases/download/v4.25.1/yq_linux_amd64.tar.gz -O - | tar xz && mv yq_linux_amd64 /usr/local/bin/yq + curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.22.10/bin/linux/amd64/kubectl && chmod +x kubectl && mv kubectl /usr/local/bin/kubectl + - uses: sljeff/secrets2env@main + with: + secrets-json: ${{ toJson(secrets) }} + - env: + IMAGE_TAG_RELEASE: ${{ env.IMAGE_NAME }}:${{ needs.build.outputs.version }} + run: | + sh apply.sh deploy/dev/* deploy-prod: - # if: startsWith(github.ref, 'refs/tags/v') + if: github.ref == 'refs/heads/main' runs-on: ubuntu-latest - needs: [build] + needs: [build, deploy-dev] steps: - name: Checkout uses: actions/checkout@v2 diff --git a/deploy/dev/cm.yaml b/deploy/dev/cm.yaml new file mode 100644 index 00000000..289f34b4 --- /dev/null +++ b/deploy/dev/cm.yaml @@ -0,0 +1,76 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: xlog-caddy + namespace: crossbell +data: + Caddyfile: | + { + storage redis { + } + + on_demand_tls { + ask http://localhost:5000/ + } + } + + xlog.cf, *.xlog.cf { + tls jeff@rss3.io { + dns cloudflare {env.CF_API_TOKEN} + } + + reverse_proxy 127.0.0.1:3000 + } + + :80, :443 { + tls jeff@rss3.io { + on_demand + } + + reverse_proxy 127.0.0.1:3000 + } +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: xlog-caddy-validator + namespace: crossbell +data: + app.py: | + import requests + from flask import Flask, request, Response + + app = Flask(__name__) + + + @app.route("/") + def check_domain(): + domain = request.args.get("domain") + if not domain: + return Response(status=404) + if domain.endswith('.xlog.cf') or domain == "xlog.cf": + return Response(status=200) + + # get TXT + res = requests.get("https://cloudflare-dns.com/dns-query", params={ + "name": f"_xlog-challenge.{domain}", + "type": "TXT", + }, headers={"Accept": "application/dns-json"}) + if res.status_code != 200: + return Response(status=res.status_code) + answer = res.json().get("Answer") or [{}] + tenant = answer[0].get("data", "").replace('"', "") + if not tenant: + return Response(status=404) + + # check crossbell + res = requests.get(f"https://indexer.crossbell.io/v1/handles/{tenant}/character") + if res.status_code != 200: + return Response(status=404) + attributes = res.json().get("metadata", {}).get("content", {}).get("attributes", []) + for d in attributes: + print(d) + if d.get("trait_type") == "xlog_custom_domain" and d.get("value") == domain: + return Response(status=200) + + return Response(status=404) diff --git a/deploy/dev/deploy.yaml b/deploy/dev/deploy.yaml new file mode 100644 index 00000000..942c1455 --- /dev/null +++ b/deploy/dev/deploy.yaml @@ -0,0 +1,104 @@ +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: xlog + namespace: crossbell +spec: + progressDeadlineSeconds: 600 + serviceName: "xlog-lb" + replicas: 1 + revisionHistoryLimit: 5 + selector: + matchLabels: + app: xlog + strategy: + rollingUpdate: + maxSurge: 25% + maxUnavailable: 25% + type: RollingUpdate + template: + metadata: + labels: + app: xlog + spec: + enableServiceLinks: false + containers: + - image: $IMAGE_TAG_RELEASE + imagePullPolicy: Always + name: xlog + envFrom: + - secretRef: + name: xlog + ports: + - containerPort: 3000 + protocol: TCP + resources: + requests: + memory: "200Mi" + cpu: "150m" + limits: + memory: "500Mi" + cpu: "500m" + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + readinessProbe: + tcpSocket: + port: 3000 + initialDelaySeconds: 40 + periodSeconds: 10 + livenessProbe: + tcpSocket: + port: 3000 + initialDelaySeconds: 40 + periodSeconds: 20 + volumeMounts: + - name: data + mountPath: "/app/.next/cache/images" + subPath: images + - name: caddy + image: kindjeff/caddy-tlsredis-docker + imagePullPolicy: Always + command: ["caddy", "run", "-config", "/app/Caddyfile"] + envFrom: + - secretRef: + name: xlog-caddy + ports: + - containerPort: 80 + name: http + - containerPort: 443 + name: https + volumeMounts: + - name: caddyfile + mountPath: /app + - name: caddy-validator + image: python + command: ["/bin/sh", "-c"] + args: ["pip install flask requests; flask --app=app run"] + ports: + - containerPort: 5000 + name: http + volumeMounts: + - name: validator + mountPath: /app.py + subPath: app.py + dnsPolicy: ClusterFirst + restartPolicy: Always + schedulerName: default-scheduler + securityContext: {} + terminationGracePeriodSeconds: 30 + volumes: + - name: caddyfile + configMap: + name: xlog-caddy + - name: validator + configMap: + name: xlog-caddy-validator + volumeClaimTemplates: + - metadata: + name: data + spec: + accessModes: ["ReadWriteOnce"] + storageClassName: "alicloud-disk-ssd" + resources: + requests: + storage: 20Gi diff --git a/deploy/dev/secrets.yaml b/deploy/dev/secrets.yaml new file mode 100644 index 00000000..fb3f988a --- /dev/null +++ b/deploy/dev/secrets.yaml @@ -0,0 +1,30 @@ +# Remember to add it in env.production because it is the nextjs project +apiVersion: v1 +stringData: + NEXT_PUBLIC_APP_NAME: xlog + NEXT_PUBLIC_OUR_DOMAIN: xlog.cf + NEXT_PUBLIC_DISCORD_LINK: "https://discord.gg/9XscSqJEq4" + NEXT_PUBLIC_GITHUB_LINK: "https://github.com/Crossbell-Box/xlog" + NEXT_PUBLIC_CSB_IO: "" + NEXT_PUBLIC_CSB_SCAN: "https://scan.crossbell.io" + NEXT_PUBLIC_IPFS_GATEWAY: "https://cf-ipfs.com/ipfs/" + REDIS_URL: ${REDIS_URL_DEV} +kind: Secret +metadata: + name: xlog + namespace: crossbell +type: Opaque +--- +apiVersion: v1 +stringData: + CADDY_CLUSTERING_REDIS_HOST: ${CADDY_CLUSTERING_REDIS_HOST_DEV} + CADDY_CLUSTERING_REDIS_PORT: "6379" + CADDY_CLUSTERING_REDIS_USERNAME: "" + CADDY_CLUSTERING_REDIS_PASSWORD: ${CADDY_CLUSTERING_REDIS_PASSWORD_DEV} + CADDY_CLUSTERING_REDIS_DB: "6" + CF_API_TOKEN: ${CF_API_TOKEN} +kind: Secret +metadata: + name: xlog-caddy + namespace: crossbell +type: Opaque diff --git a/deploy/dev/svc.yaml b/deploy/dev/svc.yaml new file mode 100644 index 00000000..1bd63140 --- /dev/null +++ b/deploy/dev/svc.yaml @@ -0,0 +1,21 @@ +apiVersion: v1 +kind: Service +metadata: + name: xlog-lb + namespace: crossbell + annotations: + service.beta.kubernetes.io/alibaba-cloud-loadbalancer-name: "xlog-dev" + service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec: "slb.s1.small" +spec: + type: LoadBalancer + selector: + app: xlog + ports: + - name: http + protocol: TCP + port: 80 + targetPort: 80 + - name: https + protocol: TCP + port: 443 + targetPort: 443 From 511716ecb2e17b61b8f89b49cd95141b67230ae0 Mon Sep 17 00:00:00 2001 From: sljeff Date: Thu, 29 Sep 2022 18:05:48 +0800 Subject: [PATCH 2/6] fix: dev sts --- deploy/dev/{deploy.yaml => sts.yaml} | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) rename deploy/dev/{deploy.yaml => sts.yaml} (97%) diff --git a/deploy/dev/deploy.yaml b/deploy/dev/sts.yaml similarity index 97% rename from deploy/dev/deploy.yaml rename to deploy/dev/sts.yaml index 942c1455..dca484a8 100644 --- a/deploy/dev/deploy.yaml +++ b/deploy/dev/sts.yaml @@ -4,10 +4,8 @@ metadata: name: xlog namespace: crossbell spec: - progressDeadlineSeconds: 600 - serviceName: "xlog-lb" replicas: 1 - revisionHistoryLimit: 5 + serviceName: "xlog-lb" selector: matchLabels: app: xlog From da4796ff67dad7c2b3ea236e9ee17e8010aa9f78 Mon Sep 17 00:00:00 2001 From: sljeff Date: Thu, 29 Sep 2022 18:12:54 +0800 Subject: [PATCH 3/6] fix: sts strategy --- deploy/dev/sts.yaml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/deploy/dev/sts.yaml b/deploy/dev/sts.yaml index dca484a8..c7a01cc1 100644 --- a/deploy/dev/sts.yaml +++ b/deploy/dev/sts.yaml @@ -9,11 +9,6 @@ spec: selector: matchLabels: app: xlog - strategy: - rollingUpdate: - maxSurge: 25% - maxUnavailable: 25% - type: RollingUpdate template: metadata: labels: From e8f2615781ac4355448f1691c88a3b548413278f Mon Sep 17 00:00:00 2001 From: sljeff Date: Thu, 29 Sep 2022 19:37:40 +0800 Subject: [PATCH 4/6] feat: dev domain --- deploy/dev/cm.yaml | 4 ++-- deploy/dev/secrets.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/deploy/dev/cm.yaml b/deploy/dev/cm.yaml index 289f34b4..1bcb3b11 100644 --- a/deploy/dev/cm.yaml +++ b/deploy/dev/cm.yaml @@ -14,7 +14,7 @@ data: } } - xlog.cf, *.xlog.cf { + xlog.page, *.xlog.page { tls jeff@rss3.io { dns cloudflare {env.CF_API_TOKEN} } @@ -48,7 +48,7 @@ data: domain = request.args.get("domain") if not domain: return Response(status=404) - if domain.endswith('.xlog.cf') or domain == "xlog.cf": + if domain.endswith('.xlog.page') or domain == "xlog.page": return Response(status=200) # get TXT diff --git a/deploy/dev/secrets.yaml b/deploy/dev/secrets.yaml index fb3f988a..b0e3314f 100644 --- a/deploy/dev/secrets.yaml +++ b/deploy/dev/secrets.yaml @@ -2,7 +2,7 @@ apiVersion: v1 stringData: NEXT_PUBLIC_APP_NAME: xlog - NEXT_PUBLIC_OUR_DOMAIN: xlog.cf + NEXT_PUBLIC_OUR_DOMAIN: xlog.page NEXT_PUBLIC_DISCORD_LINK: "https://discord.gg/9XscSqJEq4" NEXT_PUBLIC_GITHUB_LINK: "https://github.com/Crossbell-Box/xlog" NEXT_PUBLIC_CSB_IO: "" From cd29947633251efd9303f0203754cd475ec2dd0f Mon Sep 17 00:00:00 2001 From: sljeff Date: Thu, 29 Sep 2022 19:57:25 +0800 Subject: [PATCH 5/6] feat: prod oss pvc --- deploy/prod/deploy.yaml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/deploy/prod/deploy.yaml b/deploy/prod/deploy.yaml index f691b1d8..1918d420 100644 --- a/deploy/prod/deploy.yaml +++ b/deploy/prod/deploy.yaml @@ -40,6 +40,9 @@ spec: cpu: "500m" terminationMessagePath: /dev/termination-log terminationMessagePolicy: File + volumeMounts: + - name: xlog-image + mountPath: /app/.next/cache/images readinessProbe: tcpSocket: port: 3000 @@ -88,3 +91,6 @@ spec: - name: validator configMap: name: xlog-caddy-validator + - name: xlog-image + persistentVolumeClaim: + claimName: xlog-image # OSS PVC created manually in the ACK console From 94ac45d160851ff645d6bde431814fb960a79fef Mon Sep 17 00:00:00 2001 From: sljeff Date: Fri, 30 Sep 2022 08:53:09 +0800 Subject: [PATCH 6/6] feat: increase mem limit --- deploy/dev/sts.yaml | 4 ++-- deploy/prod/deploy.yaml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/deploy/dev/sts.yaml b/deploy/dev/sts.yaml index c7a01cc1..4ea238f3 100644 --- a/deploy/dev/sts.yaml +++ b/deploy/dev/sts.yaml @@ -27,10 +27,10 @@ spec: protocol: TCP resources: requests: - memory: "200Mi" + memory: "400Mi" cpu: "150m" limits: - memory: "500Mi" + memory: "1000Mi" cpu: "500m" terminationMessagePath: /dev/termination-log terminationMessagePolicy: File diff --git a/deploy/prod/deploy.yaml b/deploy/prod/deploy.yaml index 1918d420..1fb58dcb 100644 --- a/deploy/prod/deploy.yaml +++ b/deploy/prod/deploy.yaml @@ -33,10 +33,10 @@ spec: protocol: TCP resources: requests: - memory: "200Mi" + memory: "500Mi" cpu: "150m" limits: - memory: "500Mi" + memory: "1500Mi" cpu: "500m" terminationMessagePath: /dev/termination-log terminationMessagePolicy: File