Saltar al contenido principal

Variables definidas en Terraform

Objetivo: describir de forma detallada todas las variables definidas en variables.tf, sus usos dentro de la infraestructura, implicaciones de seguridad y buenas prácticas.


1) Rol del archivo

El archivo variables.tf centraliza todas las variables de configuración que parametrizan la infraestructura de MediaWiki y servicios relacionados.
Estas variables permiten reutilizar módulos, controlar entornos (dev, production), y manejar credenciales/secretos sin hardcodearlos en los recursos.

Terraform las obtiene de:

  • Valores por defecto (cuando existen en la definición).
  • Variables de entorno (TF_VAR_nombre).
  • Spacelift / CI/CD: asignadas como secretos y parámetros.
  • terraform.tfvars o -var en CLI.

2) Variables principales

🔹 Entorno y namespaces

  • environment_name

    • Nombre del entorno actual (ej: dev, staging, prod).
    • Default: "dev".
    • Se usa para identificar despliegues y diferenciar stacks.
  • kubeconfig_path

    • Ruta del archivo kubeconfig que Terraform usará para conectarse al cluster.
    • Default: ~/.kube/config.
    • ⚠️ En CI/Spacelift debe configurarse con ruta absoluta o mediante KUBECONFIG.
  • infra_namespace

    • Namespace donde viven recursos de infraestructura compartida (ej. cert-manager, monitoring).
    • Default: "infra".
  • mw_namespace

    • Namespace dedicado a MediaWiki.
    • Default: "mediawiki-dev".
    • En producción debería ajustarse a "mediawiki-production".
  • analytics_namespace

    • Namespace para recursos de analítica (ej. Plausible, bases de datos).
    • Default: "analytics".

🔹 Configuración de MariaDB (MediaWiki DB)

  • mw_mariadb_name → nombre de la instancia MariaDB (default "mariadb").
  • mw_mariadb_user → usuario principal de MediaWiki DB (default "mediawiki").
  • mw_mariadb_password → contraseña de usuario MediaWiki (default "mediawiki").
  • mw_mariadb_readonly_user → usuario de solo lectura (default "mediawiki-ro").
  • mw_mariadb_readonly_password → contraseña del usuario readonly (default "mediawiki-ro").
  • mw_mariadb_database → nombre de la base de datos a crear (default "mediawiki").
  • mw_mariadb_root_password → contraseña root de MariaDB (default "r00t").

⚠️ Riesgo alto: nunca usar los valores por defecto en producción. Deben sobreescribirse con secretos en Spacelift.


🔹 Cache y frontend

  • mw_keydb_name → nombre de la instancia KeyDB (default "mediawiki-cache").
  • mw_varnish_name → nombre de la instancia Varnish (default "varnish").
  • mw_secret_key → clave secreta de MediaWiki para firmar cookies/tokens. Default "secret".
    ⚠️ Debe configurarse con un valor fuerte y seguro en producción.

🔹 Ingress y dominios

  • cluster_domain → dominio interno del cluster. Default "cluster.local".
  • base_ingress_domain → dominio base público (ej. "wikimysite.org"). Obligatorio en despliegues productivos.
  • letsencrypt_email → correo para certificados Let's Encrypt. Obligatorio.

🔹 Cloudflare

  • cf_account_id → ID de la cuenta Cloudflare.
  • cf_api_token → API Token con permisos para R2 y DNS.
  • cf_zone_name → zona DNS (ej. "wikimysite.org").

⚠️ Guardar estos valores como secretos en Spacelift. El token debe tener permisos mínimos (Buckets R2 + Zone DNS).


🔹 Grafana (OAuth GitHub)

  • grafana_github_client_id → ID del cliente OAuth.
  • grafana_github_client_secret → secreto OAuth.
  • Permiten que Grafana use autenticación GitHub.

🔹 AWS / R2

Aunque el proyecto usa Cloudflare R2, la API es compatible con S3, por eso existen estas variables:

  • aws_endpoint → endpoint (ej. https://<accountid>.r2.cloudflarestorage.com).
  • aws_region → región S3/R2. Default "us-east-1".
  • aws_access_key_id y aws_secret_access_key → credenciales de acceso R2.

⚠️ Nunca usar las credenciales por defecto en código. Guardarlas como secretos.


🔹 hCaptcha

  • hcaptcha_site_key → clave pública del captcha.
  • hcaptcha_secret → clave privada para validar.

🔹 SMTP (correo saliente)

  • smtp_host → host del servidor SMTP.
  • smtp_port → puerto.
  • smtp_user → usuario autenticado.
  • smtp_password → contraseña.
    Se usa para notificaciones de MediaWiki y otros servicios.

🔹 Plausible (Analytics)

  • plausible_postgres_user → usuario Postgres (default "plausible").
  • plausible_postgres_password → contraseña Postgres.
  • plausible_secret_key → clave interna de Plausible.

🔹 Better Stack (Logging/Monitoring externo)

  • better_stack_token → token de la API de Better Stack. Default de ejemplo: "better-stack-token-example".
    ⚠️ Reemplazar por secreto real en producción.

3) Riesgos de seguridad en los defaults

El archivo define contraseñas por defecto inseguras (r00t, mediawiki, secret, etc.).

  • Nunca desplegar en producción con defaults.
  • Obligatorio sobreescribirlas en Spacelift (variables seguras) o en terraform.tfvars.
  • Auditar que en el state de Terraform no queden secretos expuestos en texto plano.

4) Buenas prácticas aplicadas a este repo

  • Guardar todas las credenciales en Spacelift → Environment Variables (Secret).
  • Usar nombres distintos por entorno (mw_namespace, environment_name) para evitar colisiones.
  • Rotar periódicamente contraseñas y tokens (mw_mariadb_password, cf_api_token, aws_secret_access_key).
  • Usar sops o vault si en algún momento se guardan .tfvars locales.

5) Checklist de seguridad antes de despliegues

  • [] Todas las contraseñas (mariadb, smtp, grafana, plausible) definidas como secrets.
  • [] Token de Cloudflare (cf_api_token) actualizado y con permisos mínimos.
  • [] letsencrypt_email válido (evita fallas de certificados).
  • [] base_ingress_domain definido correctamente en producción.
  • [] aws_access_key_id y aws_secret_access_key válidos.