{"id":23962828,"url":"https://github.com/dellabeneta/project-argocd","last_synced_at":"2025-08-05T10:20:26.207Z","repository":{"id":271287612,"uuid":"912596248","full_name":"dellabeneta/project-argocd","owner":"dellabeneta","description":"Um projeto simples, mas completo, de implantação de um cluster K8S gerenciado, integrando Github Workflows, Docker e ArgoCD.","archived":false,"fork":false,"pushed_at":"2025-02-04T20:06:01.000Z","size":986,"stargazers_count":45,"open_issues_count":0,"forks_count":11,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-04-23T08:08:41.601Z","etag":null,"topics":["argocd","ci","docker","github-actions","gitops","kubernetes","terraform"],"latest_commit_sha":null,"homepage":"https://linktr.ee/dellabeneta","language":"HCL","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dellabeneta.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-01-06T01:59:05.000Z","updated_at":"2025-04-02T14:15:43.000Z","dependencies_parsed_at":null,"dependency_job_id":"ec86e827-09a1-493d-aad8-4dc4d33310e5","html_url":"https://github.com/dellabeneta/project-argocd","commit_stats":null,"previous_names":["dellabeneta/project-argocd"],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dellabeneta%2Fproject-argocd","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dellabeneta%2Fproject-argocd/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dellabeneta%2Fproject-argocd/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dellabeneta%2Fproject-argocd/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dellabeneta","download_url":"https://codeload.github.com/dellabeneta/project-argocd/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250395288,"owners_count":21423400,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["argocd","ci","docker","github-actions","gitops","kubernetes","terraform"],"created_at":"2025-01-06T20:57:25.844Z","updated_at":"2025-04-23T08:08:49.111Z","avatar_url":"https://github.com/dellabeneta.png","language":"HCL","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003eProjeto de fluxo contínuo com Argo CD\u003c/h1\u003e\n\n\u003cbr\u003e\n\n\u003cdiv align=\"center\"\u003e\n\u003cimg src=\"assets/banner.png\"/\u003e\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n\n[![Workflow](https://img.shields.io/github/actions/workflow/status/dellabeneta/project-argocd/build-deploy.yaml?color=success\u0026label=Workflow\u0026logo=githubactions)](https://github.com/dellabeneta/project-argocd/actions)\n[![Version](https://img.shields.io/badge/Version-1.1.0-blue?logo=github)](https://github.com/dellabeneta/project-argocd/releases) [![License](https://img.shields.io/github/license/dellabeneta/project-argocd?label=License\u0026color=blue\u0026logo=opensourceinitiative)](https://github.com/dellabeneta/project-argocd/blob/main/LICENSE) [![Infrastructure](https://img.shields.io/badge/Infrastructure-Terraform-blue?logo=terraform)](https://github.com/dellabeneta/project-argocd/tree/main/infra/terraform) \n[![Kubernetes](https://img.shields.io/badge/Kubernetes-ready-brightgreen?logo=kubernetes)](https://kubernetes.io/docs/) [![Argo CD](https://img.shields.io/badge/Argo--CD-ready-brightgreen?logo=argo)](https://argo-cd.readthedocs.io/)\n\u003c/div\u003e\n\n\u003cbr\u003e\n\n\u003cdiv align=\"justify\"\u003e\nCom um repositório GitHub bem estruturado, contendo pastas específicas para a aplicação, arquivos Terraform para provisionamento de infraestrutura e manifests Kubernetes, é possível implementar um fluxo totalmente automatizado: do commit no código-fonte ao deploy da aplicação em um cluster Kubernetes.\n\u003cp\u003e\u003cp\u003e\nO processo funciona conectando diferentes tecnologias. Sempre que houver alterações no código-fonte, um workflow gera automaticamente uma nova imagem Docker da aplicação. Em seguida, esse mesmo workflow atualiza o manifesto Kubernetes correspondente, armazenado na pasta designada. O ArgoCD, por sua vez, detecta essa atualização no manifesto e sincroniza a nova versão da aplicação no cluster, criando um fluxo contínuo e confiável de deploy automatizado.\n\u003c/div\u003e\n\n\u003cp align=\"right\"\u003e\n  \u003ca href=\"https://www.digitalocean.com/?refcode=c231bd46146c\u0026utm_campaign=Referral_Invite\u0026utm_medium=Referral_Program\u0026utm_source=badge\"\u003e\n    \u003cimg src=\"https://web-platforms.sfo2.cdn.digitaloceanspaces.com/WWW/Badge%202.svg\" alt=\"DigitalOcean Referral Badge\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n\u003cbr\u003e\n\n\u003cdiv align=\"center\"\u003e\n\t\n\u003ch2\u003eDesenho da arquitetura\u003c/h2\u003e\t\n\n\u003cbr\u003e\n\n\u003cimg src=\"assets/diagram.svg\"/\u003e\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n\u003ch2\u003eVamos à prática\u003c/h2\u003e\t\n\u003c/div\u003e\n\n\u003cbr\u003e\n\n#### Pré-requisitos:\n\n- Terraform instalado\n- Kubectl instalado\n- Conta na Digital Ocean e Token de acesso\n- Um domínio válido com zona de DNS ativa\n\n#### Observações importantes:\n\n- É necessário um arquivo `terraform.tfvars` seu, em `/infra/terraform`. [Clique aqui para copiar um modelo!](https://github.com/dellabeneta/project-argocd/blob/main/assets/tfvars-model)\n- Eu usei o State do Terraform de maneira remota. É opcional mas, [clique aqui se quiser seguir essa boa prática!](https://github.com/dellabeneta/project-argocd/blob/main/assets/backend-model)\n\u003cbr\u003e\n\n#### 1. Configure o Cluster Kubernetes\n\nAbra seu terminal no path raiz do `projeto-argocd` e execute esses dois comandos para o terraform provisionar o DOKS (serviço gerenciado de Kubernetes da Digital Ocean):\n\n```\nterraform -chdir=infra/terraform init\n```\n```\nterraform -chdir=infra/terraform apply --auto-approve\n```\nApós uma considerável espera, vamos checar o estado do componentes: \n```\nkubectl get all -A\n```\n\u003cbr\u003e\n\n#### 2. Instalar o Ingress Controller (Nginx)\n\nSeguindo em nosso terminal, vamos aos passos para criarmos nosso Nginx Ingress Controller:\n```\nkubectl apply \\\n  -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml\n```\nCheque o estado de tudo com: \n```\nkubectl get all -A\n```\nO nosso IP Público estará como `pending` por uns 3 minutos. Após isso, já crie os subdomínios para seu ArgoCD e a aplicação. Eu tenho feito o meu dessa forma:\n- argocd.seudominio.com ---\u003e IP_DO_LOADBALANCER\n- app.seudominio.com ---\u003e IP_DO_LOADBALANCER\n\nAguarde as propagações. Monitore com https://www.whatsmydns.net/ ou `nslookup` e `dig` no terminal.\n\n\u003cbr\u003e\n\n#### 3. Instale o Cert-Manager\n\nVamos preparar o Cert-Manager que será o principal elemento, responsável pelos nossos certificados de forma geral dentro do nosso Cluster K8S:\n```\nkubectl apply \\\n-f https://github.com/cert-manager/cert-manager/releases/download/v1.16.2/cert-manager.yaml\n```\nAguarde os pods ficarem prontos:\n```\nkubectl wait --for=condition=Ready pods --all -n cert-manager --timeout=300s\n```\nVerifique se os CRDs foram aplicados corretamente:\n```\nkubectl get crds | grep cert-manager\n```\n\n\u003cbr\u003e\n\n#### 4. Crie um Cluster-Issuer para Let's Encrypt\n\nSalve este YAML como `cluster-issuer.yaml` e aplique-o com `kubectl apply -f k8s/setup/cluster-issuer.yaml`.\n```\n# cluster-issuer.yaml\napiVersion: cert-manager.io/v1\nkind: ClusterIssuer\nmetadata:\n  name: letsencrypt-prod\nspec:\n  acme:\n\tserver: https://acme-v02.api.letsencrypt.org/directory\n    email: email@dominio.com\n    privateKeySecretRef:\n      name: letsencrypt-prod\n    server: https://acme-v02.api.letsencrypt.org/directory\n    solvers:\n      - http01:\n          ingress:\n            class: nginx\n```\n\n\u003cbr\u003e\n\n#### 5. Ingress para o ArgoCD\n\nCrie o namespace `argocd`:\n```\nkubectl create namespace argocd\n```\nConfira com:\n```\nkubectl get namespaces\n```\nMesmo processo, salve o YAML como `argo-ingress.yaml` e aplique com `kubectl apply -f k8s/setup/argo-ingress.yaml`.\n```\napiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n  name: argocd-ingress\n  annotations:\n\tnginx.ingress.kubernetes.io/force-ssl-redirect: \"true\"\n\tnginx.ingress.kubernetes.io/ssl-passthrough: \"true\"\n\tnginx.ingress.kubernetes.io/backend-protocol: \"HTTPS\"\n\tcert-manager.io/cluster-issuer: \"letsencrypt-prod\"  \nspec:\n\tingressClassName: nginx\n\ttls:\n\t- hosts:\n\t  - argocd.seudominio.com\n\t  secretName: argocd-server-tls\n  rules:\n  - host: argocd.seudominio.com\n    http:\n      paths:\n      - path: /\n        pathType: Prefix\n        backend:\n          service:\n            name: argocd-server\n            port:\n              name: 443\n```\n\n\u003cbr\u003e\n\n#### 6. Setup do ArgoCD\n\nAplique o manifesto OFICIAL para o ArgoCD, nós já temos uma namespace com nome `argocd` e vamos utilizá-lo:\n```\nkubectl apply \\\n-n argocd \\\n-f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml\n```\nApós alguns poucos minutos, ele estará no ar com seu certificado já emito pelo Cert-Manager + Ingress que criamos.\n\nVocê agora pode acessar pelo https://argocd.dominio.com.\n\nBusque sua senha do `admin`, gerada automaticamente durante o provisionamento, com o comando:\n```\nkubectl get secret argocd-initial-admin-secret \\\n-n argocd \\\n-o jsonpath=\"{.data.password}\" | base64 -d; echo\n```\n\n\u003cbr\u003e\n\n#### 7. Exemplo de YAML para \"Application\". Afinal de contas, agora você vai usar repositórios Git como fonte única de verdade.\n\nEste projeto, que é um REPOSITÓRIO PÚBLICO, já possui uma aplicação de exemplo em `/app`, inclusive com Github Actions, que vai sempre fazer o CI da aplicação, ajustando a versão da imagem Docker no arquivo `deployment.yaml`, na linha 19 em `/k8s/app/`, que será consumido pelo ArgoCD. Ajuste conforme sua demanda.\n\nSegue exemplo de YAML baseado **neste projeto**:\n```\napiVersion: argoproj.io/v1alpha1\nkind: Application\nmetadata:\n  name: project-argocd\n  namespace: argocd\nspec:\n  project: default\n  source:\n    repoURL: https://github.com/dellabeneta/project-argocd.git\n    targetRevision: HEAD\n    path: k8s/app\n  destination:\n    server: https://kubernetes.default.svc\n    namespace: default\n  syncPolicy:\n    automated:\n      prune: true\n      selfHeal: true\n    syncOptions:\n      - CreateNamespace=true\n```\nSalve-o e aplique com, é claro, `kubectl apply -f k8s/argocd/application.yaml`\n\n\u003cbr\u003e\n\n\u003cdiv align=\"center\"\u003e\n\u003ch2\u003eReferências\u003c/h2\u003e\t\n\u003c/div\u003e\n\n\u003cbr\u003e\n\n- https://argo-cd.readthedocs.io/en/stable/\n- https://kubernetes.io/docs/\n- https://kubernetes.io/docs/setup/\n- https://kubernetes.io/docs/concepts/\n- https://docs.docker.com/\n- https://docs.docker.com/get-started/\n- https://docs.docker.com/engine/reference/commandline/\n- https://www.terraform.io/docs\n- https://www.terraform.io/docs/providers/\n- https://learn.hashicorp.com/collections/terraform/aws-get-started\n- https://docs.github.com/en/actions\n- https://docs.github.com/en/actions/using-workflows\n- https://docs.github.com/en/actions/learn-github-actions\n  \u003cbr\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdellabeneta%2Fproject-argocd","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdellabeneta%2Fproject-argocd","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdellabeneta%2Fproject-argocd/lists"}