5 min read

TodoAPP con ArgoCD


En este tutorial te explico de forma muy sencilla cómo desplegar un sistema TodoApp a internet usando ArgoCD.

La idea de ArgoCD (GitOps) es simple: todo lo que quieres tener en Kubernetes está definido en tu repositorio de Git. ArgoCD se encarga de que el cluster siempre tenga exactamente lo que dice Git.

¿Qué vamos a hacer?

  1. Crear un servidor en DigitalOcean usando Terraform.
  2. Instalar Kubernetes ligero (k3s) en ese servidor.
  3. Instalar ArgoCD.
  4. Dejar que ArgoCD lea el repositorio y despliegue toda la aplicación (con dominio real + HTTPS).

Herramientas que necesitas

  • Terraform
  • Cuenta en DigitalOcean (con token de API)
  • ArgoCD CLI (opcional pero recomendado)
  • Un dominio propio (ejemplo: todoapp.store) para usar HTTPS
Antes de continuar, necesitas exportar tu token de DigitalOcean:
export TF_VAR_do_token="dop_v1__token"

1. Clona el repositorio en nuestro equipo

git clone https://github.com/dalthonmh/todoapp
cd todoapp

2. Crea una clave SSH para DigitalOcean

Esta clave permite que Terraform cree el servidor y que después puedas entrar a él por SSH.

ssh-keygen -t ed25519 -C "todoapp" -f ~/.ssh/id_dalthonmh_digitalocean

Cuando te pregunte la passphrase, solo presiona Enter dos veces (sin poner contraseña).

ℹ️

No poner passphrase hace que sea más fácil trabajar de forma automática.


3. Actualiza el nombre de la clave en Terraform (si es necesario)

Abre el archivo infra/terraform/main.tf y revisa esta parte:

resource "digitalocean_ssh_key" "do_key" {
  name       = "do-ssh-key"
  public_key = file("~/.ssh/id_dalthonmh_digitalocean.pub")
}

Cambia la ruta si usaste un nombre diferente para tu clave.


4. Crea el servidor en DigitalOcean

En tu computadora (no dentro del servidor), ejecuta:

cd infra/terraform

terraform init
terraform plan
terraform apply

Cuando termine, Terraform te mostrará la IP pública del servidor (Droplet). Copia esa IP.

Ejemplo:

Apply complete! Resources: 2 added, 0 changed, 0 destroyed.
Outputs:
cp01_ip = "165.22.44.85"

5. Conéctate al servidor por SSH

ssh -i ~/.ssh/id_dalthonmh_digitalocean root@IP_MAQUINA_VIRTUAL

Una vez dentro del servidor, clona el repositorio otra vez:

apt update && apt install git -y
git clone https://github.com/dalthonmh/todoapp
cd todoapp

6. Instala Kubernetes (k3s) y kubectl

Ejecuta estos comandos uno por uno:

# Instalar kubectl
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl

# Instalar k3s (Kubernetes ligero)
curl -sfL https://get.k3s.io | sh -

# Configurar acceso al cluster
mkdir -p ~/.kube
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
sudo chown $USER:$USER ~/.kube/config

# Verificar que funciona
kubectl get nodes

7. Crea alias útiles (opcional pero recomendado)

cat >> ~/.bashrc << 'EOF'
alias k=kubectl
complete -o default -F __start_kubectl k
source <(kubectl completion bash 2>/dev/null || true)
EOF

source ~/.bashrc

Prueba que funcione:

k get pods -A

8. Instala ArgoCD

# Crear el namespace
kubectl create namespace argocd

# Instalar ArgoCD
kubectl apply -n argocd \
  --server-side --force-conflicts \
  -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

9. Obtén la contraseña inicial de ArgoCD

kubectl -n argocd get secret argocd-initial-admin-secret \
  -o jsonpath="{.data.password}" | base64 -d && echo

Copia esta contraseña. La vas a usar para entrar a la interfaz web de ArgoCD.


10. Accede a la interfaz de ArgoCD (port-forward)

Ejecuta este comando en otra terminal (déjalo corriendo):

kubectl port-forward --address 0.0.0.0 svc/argocd-server -n argocd 8080:80

Ahora abre en tu navegador:

http://IP_MAQUINA_VIRTUAL:8080

Usuario: admin

Contraseña: la que copiaste en el paso anterior


11. Crea el proyecto de ArgoCD

Este proyecto define qué cosas puede gestionar ArgoCD.

kubectl apply -f infra/argocd/projects/todoapp-project.yaml

12. Configura tu dominio (para HTTPS)

Para tener un dominio real con certificado HTTPS:

  1. En tu proveedor de dominio (Namecheap, etc.) registra los dns de Digital Ocean: Vamos a Domain List > Nameservers > Custom DNS

    • ns1.digitalocean.com
    • ns2.digitalocean.com
    • ns3.digitalocean.com
  2. En Digital Ocean vamos a Networking > Domains Agregamos el dominio que tenemos y dentro de la configuración del dominio creamos un registro de tipo A donde en value apunte a la IP público.

  3. Espera unos minutos a que el DNS se propague.

  4. Podemos probar con el comando:

    dig +short todoapp.store

    Nos tiene que devolver la ip del droplet.


13. Instala cert-manager (para certificados HTTPS automáticos)

kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.20.2/cert-manager.yaml

Espera 1-2 minutos a que todos los pods estén listos:

k get pods -n cert-manager

14. Despliega la aplicación con ArgoCD (App of Apps)

kubectl apply -f infra/argocd/bootstrap/app-of-apps-prod.yaml

Esto creará automáticamente dos aplicaciones:

  • todoapp-prod → la aplicación completa
  • components-prod → el Ingress + configuración de dominio y TLS

15. Sincroniza la aplicación

Tienes dos formas:

Opción A: Desde la terminal (con ArgoCD CLI)

Primero inicia sesión:

argocd login localhost:8080 --username admin --password TU_CONTRASEÑA --insecure

Luego sincroniza:

argocd app list
argocd app sync todoapp-bootstrap-prod

Opción B: Desde el navegador

En la interfaz de ArgoCD (http://IP_MAQUINA_VIRTUAL:8080) verás las aplicaciones. Haz clic en Sync en cada una.

Espera a que todo quede en verde (Healthy + Synced).


16. ¡Listo!

Abre tu dominio en el navegador (ejemplo: https://todoapp.store). Deberías ver la TodoApp funcionando con HTTPS.


Cómo destruir todo cuando termines

Cuando ya no necesites el servidor:

cd infra/terraform
terraform destroy

Confirma con yes. Esto elimina el Droplet de DigitalOcean.