diff --git a/.github/workflows/pulumi-cloud-resource-chatgpt.yml b/.github/workflows/pulumi-cloud-resource-chatgpt.yml new file mode 100644 index 00000000..a22c35e2 --- /dev/null +++ b/.github/workflows/pulumi-cloud-resource-chatgpt.yml @@ -0,0 +1,67 @@ +name: setup redis + +on: + workflow_dispatch: + branches: [ 'main' ] + +env: + DNS_AK: ${{ secrets.DNS_AK }} + DNS_SK: ${{ secrets.DNS_SK }} + SSH_PUBLIC_KEY: ${{ secrets.SSH_PUBLIC_KEY }} + SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_KEY }} + PULUMI_CONFIG_PASSPHRASE: ${{ secrets.PULUMI_PASS }} + PULUMI_DISABLE_CI_DETECTION: true + AWS_REGION: ap-east-1 + +defaults: + run: + working-directory: ./playbook + +jobs: + redis: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + + - name: run playbook + shell: bash + run: | + export ANSIBLE_HOST_KEY_CHECKING=False + + sudo apt install jq ansible -y + sudo rm -rvf /home/runner/.pulumi/ + curl -o setup.sh https://get.pulumi.com && sh setup.sh --version 3.57.0 + + pulumi login s3://pulumi-aws-dev + pulumi stack select dev + + db_server_public_ip=`pulumi stack output --json | jq '.db_server_public_ip'` + k3s_server_public_ip=`pulumi stack output --json | jq '.k3s_server_public_ip'` + + mkdir -pv ~/.ssh/ + cat > ~/.ssh/id_rsa << EOF + ${SSH_PRIVATE_KEY} + EOF + sudo chmod 0400 ~/.ssh/id_rsa + md5sum ~/.ssh/id_rsa + + cat > hosts/inventory << EOF + [master] + k3s-server ansible_host=$k3s_server_public_ip + + [node] + db-server ansible_host=$db_server_public_ip + + [all:vars] + ansible_port=22 + ansible_ssh_user=ubuntu + ansible_ssh_private_key_file=~/.ssh/id_rsa + ansible_host_key_checking=False + dns_ak=$DNS_AK + dns_sk=$DNS_SK + lb_ip=$k3s_server_public_ip + EOF + ansible-playbook -i hosts/inventory jobs/init_chatgpt -D diff --git a/.github/workflows/pulumi-cloud-resource-create.yml b/.github/workflows/pulumi-cloud-resource-create.yml index 530ba10c..3fcbf904 100644 --- a/.github/workflows/pulumi-cloud-resource-create.yml +++ b/.github/workflows/pulumi-cloud-resource-create.yml @@ -100,6 +100,6 @@ jobs: lb_ip=$k3s_server_public_ip EOF ansible-playbook -i hosts/inventory jobs/init_k3s_cluster -D - ansible-playbook -i hosts/inventory jobs/init_mysql -D - ansible-playbook -i hosts/inventory jobs/init_log_agent -D - ansible-playbook -i hosts/inventory jobs/init_clickhouse -D + #ansible-playbook -i hosts/inventory jobs/init_mysql -D + #ansible-playbook -i hosts/inventory jobs/init_log_agent -D + #ansible-playbook -i hosts/inventory jobs/init_clickhouse -D diff --git a/infrastructure/__main__.py b/infrastructure/__main__.py index a19b4491..d2f9267d 100644 --- a/infrastructure/__main__.py +++ b/infrastructure/__main__.py @@ -15,17 +15,17 @@ ssh_key = config.get_env('SSH_PUBLIC_KEY') key_pair = aws.key_pair(resource_name="my_ssh_key", public_key=ssh_key) k3s_server = aws.ec2( - arch = 'amd64', + arch = 'arm64', + ec2_type = 't4g.xlarge', ec2_name = 'webui.onwalk.net', - ec2_type = 't3.xlarge', key_name = key_pair, subnet_id = subnets[0], security_group_id = sg_id ) db_server = aws.ec2( - arch = 'arm64', + arch = 'amd64', + ec2_type = 't3.small', ec2_name = 'clickhouse.onwalk.net', - ec2_type = 't4g.small', key_name = key_pair, subnet_id = subnets[0], security_group_id = sg_id diff --git a/playbook/jobs/init_chatgpt b/playbook/jobs/init_chatgpt new file mode 100644 index 00000000..2e30b3d2 --- /dev/null +++ b/playbook/jobs/init_chatgpt @@ -0,0 +1,13 @@ +- name: set chatgpt with ec2 nodes + hosts: all + user: root + become: yes + gather_facts: yes + tasks: + - include_role: + name: chatgpt + vars: + group: master + namespace: chatgpt + domain: onwalk.net + secret: chatgpt-tls diff --git a/playbook/roles/chatgpt/meta/main.yml b/playbook/roles/chatgpt/meta/main.yml new file mode 100644 index 00000000..83cef7b5 --- /dev/null +++ b/playbook/roles/chatgpt/meta/main.yml @@ -0,0 +1,2 @@ +dependencies: + - role: cert-manager diff --git a/playbook/roles/chatgpt/tasks/main.yml b/playbook/roles/chatgpt/tasks/main.yml new file mode 100755 index 00000000..71358635 --- /dev/null +++ b/playbook/roles/chatgpt/tasks/main.yml @@ -0,0 +1,11 @@ +- name: Prep NameSpace + shell: "kubectl create namespace chatgpt || echo true" + +- name: sync clickhouse deploy yaml + template: src=templates/{{ item }} dest=/tmp/{{ item }} owner=root group=root mode=0644 force=yes unsafe_writes=yes + with_items: + - chat-with-gpt.yaml + +- name: Setup ChatGPT Server + shell: "kubectl apply -f /tmp/chat-with-gpt.yaml" + when: inventory_hostname in groups[group] diff --git a/playbook/roles/chatgpt/templates/.gitignore b/playbook/roles/chatgpt/templates/.gitignore new file mode 100644 index 00000000..a194b200 --- /dev/null +++ b/playbook/roles/chatgpt/templates/.gitignore @@ -0,0 +1,2 @@ +/clickhouse-keeper-k8s.iml +/.idea/ diff --git a/playbook/roles/chatgpt/templates/chat-with-gpt.yaml b/playbook/roles/chatgpt/templates/chat-with-gpt.yaml new file mode 100644 index 00000000..43c843f7 --- /dev/null +++ b/playbook/roles/chatgpt/templates/chat-with-gpt.yaml @@ -0,0 +1,99 @@ +apiVersion: v1 +kind: Service +metadata: + annotations: + meta.helm.sh/release-name: chatgpt + meta.helm.sh/release-namespace: chatgpt + labels: + app.kubernetes.io/name: chargpt + app.kubernetes.io/version: 0.2.0 + app.kubernetes.io/instance: chatgpt + name: chatgpt + namespace: chatgpt +spec: + internalTrafficPolicy: Cluster + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: http + port: 3000 + protocol: TCP + targetPort: http + selector: + app.kubernetes.io/name: chatgpt + app.kubernetes.io/instance: chatgpt + sessionAffinity: None + type: ClusterIP +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app.kubernetes.io/instance: chatgpt + app.kubernetes.io/name: chatgpt + name: chatgpt + namespace: chatgpt +spec: + progressDeadlineSeconds: 600 + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + app.kubernetes.io/name: chatgpt + app.kubernetes.io/instance: chatgpt + strategy: + rollingUpdate: + maxSurge: 25% + maxUnavailable: 25% + type: RollingUpdate + template: + metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: mirrors + app.kubernetes.io/name: nginx + spec: + containers: + - image: nginx:latest + imagePullPolicy: Always + name: nginx + ports: + - containerPort: 3000 + name: http + protocol: TCP + resources: {} + securityContext: {} + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + dnsPolicy: ClusterFirst + restartPolicy: Always + schedulerName: default-scheduler + securityContext: {} + terminationGracePeriodSeconds: 30 +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + labels: + app.kubernetes.io/instance: chatgpt + app.kubernetes.io/name: chatgpt + name: chatgpt + namespace: chatgpt +spec: + ingressClassName: nginx + rules: + - host: chatgpt.onwalk.net + http: + paths: + - backend: + service: + name: chatgpt + port: + number: 3000 + path: / + pathType: ImplementationSpecific + tls: + - hosts: + - chatgpt.onwalk.net + secretName: chatgpt-tls