Windows31 de agosto de 2026 29 vistas

Chocolatey en un VPS Windows Server: instalar y mantener el software desde la línea de comandos

Chocolatey en un VPS Windows Server: instalar y mantener el software desde la línea de comandos

En un VPS Windows nuevo, instalar manualmente Git, 7-Zip, las herramientas Sysinternals y cada dependencia lleva tiempo y produce servidores ligeramente distintos entre sí. Chocolatey permite describir esos programas, instalarlos de forma silenciosa, detectar los obsoletos y reproducir la misma base en otro VPS.

El interés no está, por tanto, en memorizar diez comandos choco. El verdadero tema es la explotación:

  • cómo instalar Chocolatey sin ejecutar a ciegas un script descargado;
  • cómo definir un estado de software reproducible;
  • cómo controlar las actualizaciones y los reinicios;
  • cómo saber quién creó el paquete que ejecutará PowerShell como administrador;
  • cuándo sustituir el repositorio comunitario por uno interno;
  • qué aportan realmente las ediciones de pago.

Método, alcance y límites

Los procedimientos se verificaron el 31 de agosto de 2026 en la documentación oficial de Chocolatey CLI, del repositorio comunitario de Chocolatey, de Chocolatey Software y de Microsoft PowerShell.

Chocolatey CLI 2.x requiere .NET Framework 4.8. El instalador intenta instalarlo si falta, pero esa operación puede exigir un reinicio. Esta guía se dirige a versiones mantenidas de Windows Server y a una consola de PowerShell abierta como administrador.

Un paquete comunitario, su mantenedor, su script o la URL del software subyacente pueden cambiar después de la publicación. Para un uso profesional, valide la versión exacta en un entorno de prueba y publíquela después en una fuente que usted controle. Los precios y funciones citados también cambian: compruébelos en las páginas oficiales en el momento de decidir.

Esta guía no sustituye a las licencias del software instalado, a una política de gestión de vulnerabilidades, a Windows Update, a una copia de seguridad o un procedimiento de reconstrucción, a la cualificación aplicativa antes de actualizar, ni a los controles de EDR, antivirus, proxy y cortafuegos de su organización.

1. Qué gestiona Chocolatey y qué no

Chocolatey es un gestor de paquetes para Windows. Un paquete .nupkg es un archivo basado en el formato NuGet. Contiene metadatos .nuspec y puede contener scripts de PowerShell como chocolateyInstall.ps1, chocolateyBeforeModify.ps1 o chocolateyUninstall.ps1.

Un paquete puede incorporar el software si los derechos de redistribución lo permiten, descargar un MSI, un EXE o un archivo comprimido desde el sitio del editor, verificar su suma de comprobación, lanzar la instalación silenciosa, crear accesos directos de comando llamados shims, declarar dependencias y ejecutar operaciones de configuración.

Esta distinción es esencial:

ElementoResponsable
el software en síel editor del software
el paquete comunitario de Chocolateyuno o varios mantenedores, a veces ajenos al editor
repositorio comunitario y moderaciónChocolatey Software y sus servicios de validación
decisión de autorizar el paquetesu organización
repositorio interno y promoción de versionessu equipo de explotación

Chocolatey gestiona ante todo el estado de sus propios paquetes. Con la edición Open Source, un software actualizado o eliminado fuera de Chocolatey puede provocar una divergencia entre el estado de Windows y el del paquete. Las ediciones con licencia ofrecen una sincronización con Programas y características, pero esa función no exime de vigilar el estado real del servidor.

Chocolatey no sustituye a Windows Update

Use Windows Update para el sistema, los componentes de Microsoft y los parches del sistema operativo. Use Chocolatey para el software y las herramientas que haya decidido gestionar como paquetes. Un paquete comunitario con el nombre de una actualización de Windows no debe convertirse en un sustituto automático de su política de parches de Microsoft.

2. Modelo de confianza en un servidor

Una instalación de Chocolatey combina varios eslabones:

  1. el script de instalación de Chocolatey;
  2. el cliente choco instalado;
  3. el repositorio configurado;
  4. el paquete y sus scripts;
  5. el servidor desde el que el paquete descarga eventualmente el software;
  6. el instalador del editor;
  7. las dependencias del paquete.

Una conexión HTTPS protege el transporte y autentica el servidor remoto según la cadena de certificados. No demuestra que un script cumpla su política ni que su comportamiento siga siendo adecuado para su entorno.

En un VPS, los scripts se ejecutan por lo general con derechos de administrador. Un paquete puede, por tanto, modificar servicios, el registro, variables de entorno, tareas programadas y archivos del sistema. Trate cada fuente como un proveedor de código privilegiado.

Tres niveles de uso

NivelFuenteGestión recomendada
prueba personalrepositorio comunitariorevisión del paquete e instalación puntual
parque profesional pequeñorepositorio interno, importación manualversiones aprobadas, manifiesto y registro de cambios
parque industrializadorepositorios de prueba y producción, automatizacióninternalización, CI, pruebas, aprobación, auditoría y despliegue central

3. Preparar el VPS

Conéctese por RDP o por su canal de administración habitual. Si el VPS acaba de entregarse, empiece por nuestra guía de primeros pasos con su VPS Windows.

Antes de Chocolatey: instale las actualizaciones de Windows, reinicie si hace falta, compruebe la hora y la resolución DNS, compruebe el acceso HTTPS saliente, abra PowerShell como administrador y cree una instantánea de precaución si la plataforma lo permite.

Recogida inicial:

Get-ComputerInfo |
    Select-Object WindowsProductName, WindowsVersion,
        OsBuildNumber, OsArchitecture

$PSVersionTable |
    Format-List PSVersion, PSEdition, CLRVersion

Get-ExecutionPolicy -List

[System.Net.ServicePointManager]::SecurityProtocol

Test-NetConnection community.chocolatey.org -Port 443

La instantánea facilita deshacer una modificación del sistema, pero no sustituye a una copia externa. Una actualización de software también puede modificar datos aplicativos que la vuelta a la instantánea haría retroceder.

4. Instalar Chocolatey con el método oficial

La página de instalación oficial propone este comando de PowerShell:

Set-ExecutionPolicy Bypass -Scope Process -Force

[System.Net.ServicePointManager]::SecurityProtocol =
    [System.Net.ServicePointManager]::SecurityProtocol -bor 3072

iex ((New-Object System.Net.WebClient).DownloadString(
    "https://community.chocolatey.org/install.ps1"
))

El ámbito Process limita el cambio de la directiva de ejecución a la consola actual. El número 3072 corresponde a TLS 1.2 en las versiones de .NET implicadas.

Este comando es oficial, pero descarga y ejecuta código de inmediato. Chocolatey pide él mismo inspeccionar install.ps1 antes de usarlo. Para una práctica coherente con nuestra guía de fortalecimiento, que desaconseja ejecutar un script descargado sin leerlo, prefiera el procedimiento siguiente.

5. Descargar el script, leerlo y después ejecutarlo

Cree un directorio de trabajo y descargue el script sin ejecutarlo:

$BootstrapDirectory = "C:\Windows\Temp\Chocolatey-Bootstrap"
$InstallScript = Join-Path $BootstrapDirectory "install.ps1"
$InstallUri = "https://community.chocolatey.org/install.ps1"

New-Item -Path $BootstrapDirectory -ItemType Directory -Force |
    Out-Null

[System.Net.ServicePointManager]::SecurityProtocol =
    [System.Net.ServicePointManager]::SecurityProtocol -bor 3072

$DownloadParameters = @{
    Uri             = $InstallUri
    UseBasicParsing = $true
    OutFile         = $InstallScript
}

Invoke-WebRequest @DownloadParameters

Compruebe el archivo:

Get-Item $InstallScript |
    Format-List FullName, Length, CreationTimeUtc,
        LastWriteTimeUtc

Get-FileHash -Path $InstallScript -Algorithm SHA256

Get-Content -Path $InstallScript

También puede abrirlo en el Bloc de notas:

notepad.exe $InstallScript

Qué buscar durante la revisión

Compruebe en particular la URL desde la que se descarga el paquete de Chocolatey, las variables de entorno consultadas, las rutas creadas, las modificaciones de PATH, las descargas o ejecutables secundarios, las llamadas dinámicas de PowerShell, y la ausencia de destinos o comandos inesperados.

La suma SHA-256 registrada demuestra que se revisó y ejecutó el mismo archivo. No autentica el script por sí sola mientras no se compare con un valor publicado por un canal independiente. La verificación HTTPS y la revisión del contenido siguen siendo necesarias.

Tras la validación interna, ejecute el archivo local:

Set-ExecutionPolicy Bypass -Scope Process -Force
& $InstallScript

if (-not (Get-Command choco -ErrorAction SilentlyContinue)) {
    $env:Path += ";$env:ProgramData\chocolatey\bin"
}

choco --version

No se ha rebajado la directiva de ejecución permanente de la máquina. Cerrar la consola elimina el Bypass definido en el ámbito Process.

Para una automatización profesional

No vuelva a descargar en silencio la versión actual de install.ps1 cada vez que cree un servidor. Tras la validación:

  1. archive el script aprobado o el MSI oficial en su repositorio de artefactos;
  2. registre su SHA-256 y la versión de Chocolatey;
  3. apunte el bootstrap hacia esa copia interna;
  4. valide una versión nueva antes de reemplazar la anterior;
  5. retire la fuente comunitaria de los servidores de producción si no es necesaria.

Chocolatey ofrece también un MSI desde la versión 2.0.0. La documentación precisa que ese MSI sirve para el bootstrap: instala Chocolatey, pero no actualiza ni desinstala el cliente.

6. Comprobar la instalación

La ruta predeterminada es C:\ProgramData\chocolatey. Chocolatey indica que allí los permisos están endurecidos para los administradores. Si elige otra ubicación con ChocolateyInstall, la documentación le pide gestionar usted mismo las ACL.

choco --version
choco source list
choco config list
choco feature list

Get-Command choco |
    Format-List Name, Source, Version

Get-ChildItem $env:ChocolateyInstall

Get-Acl $env:ChocolateyInstall |
    Format-List Owner, AccessToString

Compruebe como mínimo:

ControlResultado esperado
choco --versionun número de versión, sin error
comando resueltobinario dentro del directorio de Chocolatey
carpeta de instalacióncon escritura solo para las identidades previstas
fuente comunitariapresente solo si su política lo permite
registroC:\ProgramData\chocolatey\logs\chocolatey.log

No haga C:\ProgramData\chocolatey modificable por un usuario estándar: podría reemplazar un shim, un script o un paquete que después se ejecute con privilegios elevados. Nuestra guía para configurar el firewall de Windows Server en un VPS completa este endurecimiento por el lado de la red.

7. Entender quién publica los paquetes comunitarios

El repositorio community.chocolatey.org contiene paquetes creados por miembros de la comunidad. El mantenedor del paquete no es necesariamente el editor del software. La FAQ del repositorio comunitario distingue explícitamente el soporte del paquete, a cargo de sus mantenedores, del soporte del software, a cargo de su editor.

Desde octubre de 2014, cada versión de cada paquete enviado pasa por un proceso de moderación antes de publicarse. Según la documentación de seguridad de Chocolatey y la documentación de moderación, ese proceso puede incluir una validación automática de calidad, una verificación de instalación y desinstalación, un análisis con VirusTotal, una revisión humana para los paquetes sin estado de confianza, y controles de procedencia y suma de comprobación de los binarios.

Un paquete «trusted» puede aprobarse tras los controles automáticos sin una nueva revisión humana si nada se señala. La moderación reduce el riesgo; no convierte un repositorio comunitario en una fuente bajo su control.

Chocolatey indica además que su escáner de paquetes solo prueba por defecto los instaladores en-US. Un paquete puede funcionar en el entorno de verificación y fallar con otro idioma, otra arquitectura, un proxy, un reinicio pendiente o una configuración de servidor particular.

Verificar un paquete antes de instalarlo

Empiece por los metadatos:

choco info 7zip
choco info git
choco info sysinternals

En la página del paquete, compruebe la identidad de los mantenedores, el enlace al código fuente del paquete, el estado de validación, verificación y análisis, el historial de versiones, la sección Files, el archivo chocolateyInstall.ps1, las URL descargadas, las sumas declaradas, las dependencias, y los parámetros y argumentos silenciosos.

La FAQ oficial explica que el archivo .nupkg puede descargarse, renombrarse a .zip y extraerse para inspeccionarlo. Examine el paquete exacto, no solo la rama principal de su repositorio de origen: la rama puede haber cambiado desde la publicación de la versión.

Lo que VirusTotal no garantiza

Un resultado sin detecciones no es prueba de inocuidad. No valida la lógica de PowerShell, la intención del mantenedor, el cumplimiento de licencias ni el comportamiento futuro de una URL remota. La protección antimalware en tiempo de ejecución de las ediciones Pro y Business afecta a los archivos descargados desde una fuente externa durante la instalación; Chocolatey precisa que los binarios incrustados directamente en un paquete no son analizados por esa función en ese momento.

8. Instalar herramientas sin convertir el servidor en un puesto de trabajo

En un servidor, cada software aumenta la superficie de mantenimiento. Instale solo las herramientas necesarias para el papel del VPS.

Ejemplo de instalación explícita con control de cada resultado:

$PackageIds = @(
    "7zip",
    "git",
    "sysinternals"
)

foreach ($PackageId in $PackageIds) {
    & choco install $PackageId --yes --no-progress
    $InstallCode = $LASTEXITCODE

    if ($InstallCode -notin @(0, 1641, 3010)) {
        throw "Instalacion de $PackageId fallida: codigo $InstallCode"
    }

    if ($InstallCode -in @(1641, 3010)) {
        Write-Warning "$PackageId instalado; se requiere reinicio."
    }
}

choco list

Los códigos 1641 y 3010 significan respectivamente éxito con reinicio iniciado y éxito con reinicio requerido. De hecho, Chocolatey define 0, 1605, 1614, 1641 y 3010 como códigos de salida válidos. Un script que trate todo código distinto de cero como un fallo declararía erróneamente algunas instalaciones como erróneas.

No use --force por defecto. La documentación de comandos de Chocolatey explica que esa opción esquiva comportamientos de protección y la desaconseja en los scripts ordinarios.

9. Hacer reproducible la instalación

Una serie de comandos copiada del historial de PowerShell todavía no es una configuración reproducible. Hay que conservar el identificador exacto del paquete, la versión validada, la fuente autorizada, los parámetros del paquete, los argumentos pasados al instalador, el código de retorno, la necesidad de reinicio y una prueba funcional tras la instalación.

Exportar el estado de un VPS de referencia

El comando choco export crea un archivo packages.config. En una máquina de referencia ya validada:

$ManifestDirectory = "C:\Ops\Chocolatey"
$ManifestPath = Join-Path $ManifestDirectory "packages.config"

New-Item -Path $ManifestDirectory -ItemType Directory -Force |
    Out-Null

choco export $ManifestPath --include-version-numbers

Get-Content $ManifestPath

Coloque ese manifiesto en su repositorio de configuración con una revisión de código, un número de cambio, la fecha de validación, el entorno de prueba y la fuente interna correspondiente.

No considere la exportación una copia de seguridad completa. No captura necesariamente los parámetros de cada instalación, los ajustes aplicativos, los secretos, los datos ni el software instalado fuera de Chocolatey.

Reproducir el manifiesto

En un VPS nuevo:

$ManifestPath = "C:\Ops\Chocolatey\packages.config"
$ApprovedSource = "internal-production"

if (-not (Test-Path $ManifestPath)) {
    throw "Manifiesto Chocolatey no encontrado: $ManifestPath"
}

$Arguments = @(
    "install",
    $ManifestPath,
    "--source=$ApprovedSource",
    "--yes",
    "--no-progress"
)

& choco @Arguments
$InstallCode = $LASTEXITCODE

if ($InstallCode -notin @(0, 1641, 3010)) {
    throw "Bootstrap de software fallido: codigo $InstallCode"
}

No confundir versiones fijadas con mantenimiento

Una versión fijada hace previsible una reconstrucción, pero también puede conservar una vulnerabilidad. El ciclo correcto es:

  1. detectar una versión nueva;
  2. importar el paquete y sus recursos;
  3. revisar los cambios;
  4. probar la instalación, la actualización y el reinicio;
  5. promover la versión;
  6. modificar el manifiesto;
  7. desplegar por oleadas;
  8. conservar la versión anterior durante la ventana de vuelta atrás.

10. Actualizar el software sin un «upgrade all» a ciegas

Mostrar los paquetes obsoletos:

choco outdated

Actualizar un paquete concreto tras la validación:

choco upgrade git -y --no-progress
$UpgradeCode = $LASTEXITCODE

if ($UpgradeCode -notin @(0, 1641, 3010)) {
    throw "Actualizacion de Git fallida: codigo $UpgradeCode"
}

Actualizar a una versión aprobada:

$ApprovedVersion = "VERSION_VALIDADA"
$UpgradeArguments = @(
    "upgrade",
    "git",
    "--version=$ApprovedVersion",
    "--source=internal-production",
    "--yes",
    "--no-progress"
)

& choco @UpgradeArguments

El valor VERSION_VALIDADA es deliberadamente un marcador: sustitúyalo por la versión realmente cualificada y disponible en su repositorio.

Por qué evitar una actualización global automática en producción

El comando siguiente existe:

choco upgrade all -y

Puede ser aceptable en una máquina de prueba o en un puesto no crítico. En un VPS de producción, puede actualizar a la vez un entorno de ejecución, una herramienta usada por un servicio, una dependencia y el propio Chocolatey. Si algo falla, aislar el origen de la regresión resulta más difícil.

Prefiera una ventana de mantenimiento, una instantánea de precaución, una lista de versiones aprobadas, actualizaciones por lotes coherentes, pruebas aplicativas, un reinicio controlado y un despliegue progresivo en varios servidores.

La documentación de Chocolatey señala además que una actualización global puede dejar dependencias en un estado incoherente si parte de la cadena falla. Empiece entonces por el paquete o la dependencia citados explícitamente en el error.

Fijar temporalmente un paquete

choco pin add --name=git
choco pin list
choco pin remove --name=git

Un pin es una medida temporal, no una estrategia de seguridad. Asócielo a un motivo, un ticket, un responsable y una fecha de revisión.

11. Generar un informe de actualización sin modificar el servidor

Para una supervisión sencilla, active los códigos de salida enriquecidos:

choco feature enable --name=useEnhancedExitCodes

Con esa función, choco outdated devuelve:

CódigoSignificado
0ningún paquete obsoleto
2al menos un paquete obsoleto
1 o -1se ha producido un error

Script de auditoría, sin instalación:

$AuditDirectory = "C:\Ops\Chocolatey\Reports"
$Timestamp = Get-Date -Format "yyyyMMdd-HHmmss"
$ReportPath = Join-Path $AuditDirectory "outdated-$Timestamp.txt"

New-Item -Path $AuditDirectory -ItemType Directory -Force |
    Out-Null

$Output = & choco outdated --limit-output 2>&1
$ExitCode = $LASTEXITCODE

$Output | Set-Content -Path $ReportPath -Encoding UTF8

switch ($ExitCode) {
    0 {
        Write-Output "No se detectaron actualizaciones de Chocolatey."
    }
    2 {
        Write-Warning "Hay actualizaciones disponibles: $ReportPath"
    }
    default {
        throw "Auditoria de Chocolatey fallida: codigo $ExitCode"
    }
}

Programe esta comprobación con su herramienta de supervisión, una GPO, un planificador o una tarea de Windows. No convierta automáticamente ese informe en un upgrade all sin validación.

12. Por qué una empresa debería usar su propio repositorio

Chocolatey Software escribe explícitamente que una organización no debería usar directamente el repositorio comunitario como fuente de producción. Su guía de internalización automatizada da tres razones:

  • confianza: los creadores y mantenedores externos no están bajo el control de la organización;
  • estabilidad: los paquetes y las descargas deben seguir disponibles durante las operaciones;
  • control: las pruebas, la aprobación y la publicación deben pertenecer a la organización.

Un repositorio privado permite además conservar las versiones realmente desplegadas, dejar de depender de una URL de editor modificada o suprimida, reducir los dominios de Internet autorizados desde los VPS, cualificar un binario antes de difundirlo, crear sus propios paquetes de configuración, funcionar en una red aislada, separar importación, prueba y producción, y asociar cada promoción a una revisión y un cambio.

Arquitectura recomendada

EtapaFunción
repositorio comunitario o del editororigen externo, nunca consumido directamente por producción
internalizaciónobtención del paquete y sus recursos
repositorio Gitscripts, manifiestos, sumas y historial de revisión
repositorio Chocolatey de pruebainstalación en un servidor representativo
controlesantivirus, firmas, sumas, pruebas funcionales y reinicio
repositorio Chocolatey de producciónúnicamente versiones aprobadas
VPSacceso de lectura al repositorio de producción

Para los clientes, use una identidad de solo lectura. Reserve el derecho de publicar a la CI o a una identidad distinta. No coloque nunca un token de publicación en el script de bootstrap de un VPS.

Repositorios compatibles

La documentación de Chocolatey cita Inedo ProGet, Sonatype Nexus Repository, JFrog Artifactory, una fuente NuGet compatible y, en algunos casos, un recurso compartido interno.

El antiguo producto Chocolatey.Server está obsoleto. Chocolatey recomienda migrar a una solución de terceros y cita ProGet, Nexus o Artifactory. No inicie, por tanto, un proyecto nuevo en torno a Chocolatey.Server.

¿Open Source o Business para el repositorio interno?

La edición Open Source sabe consumir varias fuentes, crear paquetes y usar un repositorio privado. También permite una internalización manual: descarga del paquete, obtención de los recursos, modificación de los scripts, nueva compilación y publicación.

Chocolatey for Business automatiza ese trabajo con Package Internalizer: el cliente descarga el paquete y sus recursos externos, reescribe las referencias y recompila un paquete utilizable sin acceso a Internet. La función ahorra tiempo, pero la decisión de aprobar y probar sigue siendo suya.

13. Configurar una fuente interna

Ejemplo con una fuente HTTPS ficticia:

$SourceArguments = @(
    "source",
    "add",
    "--name=internal-production",
    "--source=https://packages.example.net/nuget/chocolatey/v2",
    "--priority=1"
)

& choco @SourceArguments
choco source list

Una prioridad numérica más baja se evalúa antes que una más alta. Compruebe siempre el resultado con choco source list.

Tras confirmar que el repositorio interno contiene Chocolatey y todos los paquetes necesarios, desactive el repositorio comunitario:

choco source disable --name=chocolatey
choco source list

Para un entorno totalmente aislado, la documentación de Chocolatey recomienda eliminar la fuente comunitaria:

choco source remove --name=chocolatey

La desactivación es más fácilmente reversible; la eliminación evita que una reactivación no controlada reintroduzca la fuente. Elija según su gestión de configuración.

Autenticación y secretos

Chocolatey admite la autenticación por usuario y contraseña, así como certificados de cliente X.509. El comando source add cifra la contraseña en el archivo de configuración, pero un secreto transmitido en una línea de comandos puede ser visible por otros mecanismos de registro o inventario.

Buenas prácticas: use una cuenta técnica de solo lectura en los VPS, prefiera un token corto o un certificado de cliente si el repositorio lo permite, obtenga el secreto de una bóveda en el momento del despliegue, no lo coloque ni en Git, ni en packages.config, ni en la imagen plantilla, separe las identidades de lectura y publicación, y renueve los secretos probando su revocación.

14. Comparar las ediciones sin sobrevenderlas

Las funciones y los precios pueden cambiar. La tabla siguiente refleja las páginas oficiales Compare Chocolatey Editions y Pricing consultadas el 31 de agosto de 2026.

EdiciónPúblico destinatarioQué aporta en esta guíaLímite que conviene conocer
Open Sourceparticulares y organizacionesgestión de paquetes, creación de paquetes, varias fuentes, repositorio privado, actualización globalinternalización y gobernanza avanzada por construir manualmente
Prouna persona física, licencia nominativafunciones Open Source más caché CDN, protección antimalware en ejecución, sincronización y funciones de comodidadlicencia personal y nominativa; hasta 8 máquinas personales
Business (C4B)organizacionesPackage Internalizer, Central Management, auditoría, autoservicio, sincronización completa y funciones de desplieguecoste por nodo, infraestructura y procesos que explotar

Precios mostrados el 31 de agosto de 2026

  • Open Source: gratuita, sin límite de máquinas;
  • Pro: 96 dólares al año, licencia personal nominativa, hasta 8 máquinas personales;
  • Business: desde 18 dólares por licencia y año;
  • la página de precios indica una suscripción anual Business desde 1 800 dólares al año, correspondiente a un mínimo de 100 nodos a 18 dólares por nodo y año, con descuentos por volumen a partir de 500 nodos.

Compruebe la página oficial en el momento de la compra. Impuestos, presupuestos, descuentos, soporte premium y condiciones contractuales pueden modificar el coste real.

Una elección razonable según el tamaño

SituaciónElección a menudo suficiente
uno o pocos VPS, equipo capaz de mantener sus paquetesOpen Source con repositorio privado e importación manual
uso estrictamente personalOpen Source o Pro según las funciones deseadas
parque de empresa con importación frecuente de paquetes externosBusiness, a evaluar por el Internalizer y la auditoría
necesidad de autoservicio para usuarios sin permisos de administradorBusiness
necesidad de un panel central de conformidadBusiness o una herramienta de gestión ya implantada

Business no hace que los paquetes sean seguros por sí mismo. Facilita la internalización, el control central y la auditoría. Si la organización ya dispone de un repositorio NuGet, una CI, un EDR y una herramienta de configuración, la edición Open Source puede bastar para un ámbito pequeño correctamente explotado.

15. Script de bootstrap reproducible

El script siguiente no elige el software por usted. Exige un manifiesto existente, una fuente Chocolatey ya configurada, una URL de bootstrap aprobada y la suma SHA-256 esperada del script de instalación.

En una producción madura, BootstrapUri debe apuntar a su copia interna validada.

param(
    [Parameter(Mandatory = $true)]
    [string]$ManifestPath,

    [Parameter(Mandatory = $true)]
    [string]$SourceName,

    [Parameter(Mandatory = $true)]
    [string]$BootstrapUri,

    [Parameter(Mandatory = $true)]
    [ValidatePattern("^[A-Fa-f0-9]{64}$")]
    [string]$ExpectedBootstrapSha256
)

$ErrorActionPreference = "Stop"
$BootstrapDirectory = "C:\Windows\Temp\Chocolatey-Bootstrap"
$BootstrapPath = Join-Path $BootstrapDirectory "install.ps1"

if (-not (Test-Path $ManifestPath)) {
    throw "Manifiesto no encontrado: $ManifestPath"
}

if (-not (Get-Command choco -ErrorAction SilentlyContinue)) {
    New-Item -Path $BootstrapDirectory -ItemType Directory -Force |
        Out-Null

    [System.Net.ServicePointManager]::SecurityProtocol =
        [System.Net.ServicePointManager]::SecurityProtocol -bor 3072

    $DownloadParameters = @{
        Uri             = $BootstrapUri
        UseBasicParsing = $true
        OutFile         = $BootstrapPath
    }

    Invoke-WebRequest @DownloadParameters

    $ActualHash = (
        Get-FileHash -Path $BootstrapPath -Algorithm SHA256
    ).Hash

    if ($ActualHash -ne $ExpectedBootstrapSha256) {
        throw "Suma de comprobacion del bootstrap invalida."
    }

    Set-ExecutionPolicy Bypass -Scope Process -Force
    & $BootstrapPath

    $env:Path += ";$env:ProgramData\chocolatey\bin"
}

$ConfiguredSources = & choco source list --limit-output
$SourcePattern = [regex]::Escape($SourceName)
$SourceFound = $ConfiguredSources |
    Where-Object { $_ -match $SourcePattern }

if (-not $SourceFound) {
    throw "Fuente Chocolatey ausente: $SourceName"
}

$InstallArguments = @(
    "install",
    $ManifestPath,
    "--source=$SourceName",
    "--yes",
    "--no-progress"
)

& choco @InstallArguments
$InstallCode = $LASTEXITCODE

if ($InstallCode -notin @(0, 1641, 3010)) {
    throw "Instalacion del manifiesto fallida: codigo $InstallCode"
}

& choco list

if ($InstallCode -in @(1641, 3010)) {
    Write-Warning "Bootstrap terminado; se requiere reinicio."
}

El script es idempotente para la instalación del cliente: no reinstala Chocolatey si el comando ya existe. El carácter reproducible procede sobre todo del manifiesto versionado, de la fuente interna inmutable y de las pruebas posteriores a la instalación.

Mejoras recomendadas para un parque: firma Authenticode de su script de bootstrap, ejecución desde una imagen de referencia o una herramienta de configuración, envío del registro a un almacenamiento central, identificador único de despliegue, control del espacio en disco, detección de un reinicio ya pendiente, prueba aplicativa propia del papel del VPS y un bloqueo que impida dos despliegues simultáneos.

16. Proxy, caché y acceso de red

Con el repositorio comunitario, el VPS debe alcanzar community.chocolatey.org, la infraestructura de paquetes de Chocolatey y los dominios de cada editor desde los que los scripts descargan los binarios.

Esta última dependencia explica por qué autorizar solo el dominio de Chocolatey en un proxy no siempre basta. Un repositorio interno con recursos internalizados reduce mucho el número de destinos externos.

Mostrar la configuración:

choco config list
choco source list

Configurar un proxy explícito sin autenticación:

choco config set --name=proxy --value=http://proxy.example.net:8080

Retirar ese ajuste:

choco config unset --name=proxy

Para un proxy autenticado, no escriba la contraseña en un script ni en un ticket. Inyéctela desde una bóveda y compruebe qué rastros de línea de comandos recoge su EDR.

Mover la caché

Chocolatey usa por defecto un directorio temporal para las descargas. En un VPS con un disco de sistema pequeño, puede definir una caché dedicada:

$CachePath = "D:\ChocolateyCache"

New-Item -Path $CachePath -ItemType Directory -Force |
    Out-Null

choco config set --name=cacheLocation --value=$CachePath
choco config get --name=cacheLocation

Si el volumen D: no existe, elija una ruta real. Proteja ese directorio frente a la escritura por usuarios no autorizados y defina una política de limpieza. Una caché puede contener instaladores ejecutables; no es una simple carpeta sin importancia.

17. Registros, inventario y prueba de cambios

El registro principal se encuentra normalmente aquí:

$ChocolateyLog = "C:\ProgramData\chocolatey\logs\chocolatey.log"

Get-Content $ChocolateyLog -Tail 200

Para añadir un registro propio de una operación:

$ChangeId = "CHG-2026-0001"
$OperationLog = "C:\Ops\Chocolatey\$ChangeId.log"
$Arguments = @(
    "upgrade",
    "git",
    "--yes",
    "--no-progress",
    "--log-file=$OperationLog"
)

& choco @Arguments

Para cada cambio en producción, conserve:

PruebaEjemplo
estado anteriorchoco list y versión del software
solicitudticket o commit del manifiesto
fuenterepositorio y versión aprobada
comandoargumentos sin secretos
resultadocódigo de salida y extractos útiles
reiniciorequerido, realizado y hora
validaciónservicio iniciado, puerto o prueba funcional
estado posteriornueva versión y supervisión normal

No publique un registro en bruto sin releerlo: puede aparecer una URL, un nombre de usuario, un token o una ruta sensible.

18. Desinstalar y volver atrás

Desinstalar un paquete:

choco uninstall git -y --no-progress
$UninstallCode = $LASTEXITCODE

if ($UninstallCode -notin @(0, 1605, 1614, 1641, 3010)) {
    throw "Desinstalacion fallida: codigo $UninstallCode"
}

Chocolatey documenta el código 1605 para un software ausente y 1614 para un producto ya desinstalado. El resultado real depende del script del paquete y del desinstalador del editor.

Una vuelta a una versión anterior no siempre es un retorno fiable: un instalador puede rechazar una versión previa, un formato de configuración o de datos puede haber migrado, un servicio puede no aceptar ya el binario antiguo, y un paquete puede no ofrecer un script de desinstalación completo.

Para un VPS crítico, prepare tres niveles:

  1. reinstalación del paquete anterior desde el repositorio interno;
  2. restauración de configuraciones y datos compatibles;
  3. reconstrucción del VPS a partir del manifiesto y las copias.

La instantánea de precaución puede reducir el tiempo de recuperación, pero su restauración anula también las escrituras realizadas desde que se tomó. Defina qué debe respaldarse por separado antes de la ventana, como describe nuestra guía sobre cómo respaldar su VPS Windows.

19. Resolución de problemas

El comando choco no se reconoce

Abra una consola nueva o actualice el PATH de la sesión:

$env:Path += ";$env:ProgramData\chocolatey\bin"
Get-Command choco
choco --version

Si se usó una ruta personalizada ChocolateyInstall, adapte el valor.

Error de TLS o conexión cerrada

[System.Net.ServicePointManager]::SecurityProtocol =
    [System.Net.ServicePointManager]::SecurityProtocol -bor 3072

Test-NetConnection community.chocolatey.org -Port 443

Compruebe también la fecha y la hora, la resolución DNS, el proxy, la inspección TLS, la cadena de certificación, las reglas de salida y la presencia de .NET Framework 4.8.

No use una opción que ignore los errores de certificado. Corrija la cadena de confianza o el proxy.

La directiva de ejecución bloquea el bootstrap

Get-ExecutionPolicy -List
Set-ExecutionPolicy Bypass -Scope Process -Force

Una GPO puede seguir teniendo prioridad sobre este ajuste. En ese caso, use el método de despliegue autorizado por la organización, por ejemplo un MSI aprobado o un script firmado.

Error de suma de comprobación

No ignore el error para «hacer pasar» la instalación. Puede indicar una versión nueva publicada bajo la misma URL, un paquete aún no actualizado, una interceptación o una caché intermedia, una descarga incompleta, o un recurso realmente distinto del validado.

Compare el binario del editor, el script del paquete, la versión y la suma. Espere una versión corregida o internalice el binario aprobado.

El paquete está instalado pero el software no

Con la edición Open Source, el estado del paquete puede divergir de Programas y características si el software se modificó fuera de Chocolatey.

choco list

Get-Package |
    Sort-Object Name |
    Select-Object Name, Version, ProviderName

Compruebe después el servicio, el archivo ejecutable o la clave del registro propia del software. No marque el servidor como conforme basándose solo en la salida de choco list.

Hay una fuente interna configurada pero se sigue usando el repositorio comunitario

choco source list

Compruebe las prioridades, la disponibilidad del paquete interno y los argumentos --source. Para una producción cerrada, desactive o elimine explícitamente la fuente comunitaria.

Una actualización pide un reinicio

No reinicie de inmediato un servidor de producción desde un script genérico. Informe del código 1641 o 3010, termine las comprobaciones posibles, reinicie después en la ventana prevista y valide los servicios.

¿Dónde leer el error detallado?

Get-Content "C:\ProgramData\chocolatey\logs\chocolatey.log" -Tail 300

Busque primero el primer error significativo y el paquete dependiente que se menciona. Los avisos posteriores pueden ser solo consecuencias.

20. Buenas prácticas en un VPS Windows

  • no instale herramientas innecesarias para el papel del servidor;
  • use una consola de administrador solo durante la operación;
  • limite la directiva Bypass al proceso;
  • inspeccione el bootstrap antes de la primera ejecución;
  • inspeccione los scripts de los paquetes nuevos o delicados;
  • use versiones validadas y disponibles en un repositorio interno;
  • separe los repositorios de prueba y producción;
  • desactive el repositorio comunitario en producción;
  • no ponga los secretos del repositorio en Git;
  • trate los códigos de reinicio como éxitos pendientes de completar;
  • ejecute outdated con regularidad, sin actualización automática a ciegas;
  • pruebe la función del software tras la instalación;
  • centralice los registros y el inventario;
  • revise los pins con regularidad;
  • pruebe una reconstrucción completa del VPS.

Preguntas frecuentes

¿Chocolatey es gratuito para una empresa?

Sí. La página oficial de precios presenta la edición Open Source como gratuita, utilizable por organizaciones y sin límite de máquinas. Las funciones Business son de pago, pero un repositorio privado no exige por sí solo la edición Business.

¿Puede desplegarse Chocolatey Pro en los VPS de una empresa?

No, según la página oficial de precios. Pro se presenta como una licencia personal y nominativa, prevista para las máquinas propias del usuario, hasta ocho. Una organización debe elegir Open Source o evaluar Business.

¿Publican los editores los paquetes comunitarios?

No necesariamente. Los crean mantenedores de la comunidad, a veces el propio editor, a veces un tercero. Compruebe la ficha de cada paquete.

¿Garantiza la moderación que un paquete es seguro?

No. Añade validación, verificación, análisis y revisión según el estado del paquete. Reduce el riesgo, pero no sustituye a la aprobación interna, la revisión del script y la prueba de la versión exacta.

¿Por qué leer install.ps1 si la URL es oficial?

Porque el comando oficial descarga y ejecuta PowerShell con privilegios elevados. Chocolatey recomienda esa inspección él mismo. Además permite conservar la suma del código realmente autorizado.

¿Hay que ejecutar choco upgrade all cada noche?

No en un servidor de producción sin pruebas. Use choco outdated para detectar, cualifique las versiones y despliegue después con ventana, pruebas y gestión de los reinicios.

¿Basta un packages.config para clonar un VPS?

No. Describe los paquetes, pero no todas las configuraciones, datos, secretos, roles de Windows, reglas de cortafuegos, certificados o tareas programadas. Intégrelo en un procedimiento de configuración más amplio.

¿Qué repositorio interno elegir?

Elija un producto compatible con NuGet que su equipo sepa respaldar, actualizar y supervisar. Chocolatey cita ProGet, Nexus y Artifactory. Chocolatey.Server está obsoleto.

¿Sustituye Chocolatey a Winget?

Ambos pueden coexistir, pero multiplicar los gestores aumenta el riesgo de estados divergentes. Defina un responsable por software y evite que el mismo programa lo actualicen Chocolatey, Winget y su propio actualizador sin una regla clara.

Lista de comprobación de explotación

  • Windows Server y .NET Framework están al día;
  • la consola utilizada está elevada;
  • el script oficial se descargó antes de ejecutarlo;
  • se han conservado su contenido y su SHA-256;
  • la directiva de ejecución solo se modificó en el ámbito Process;
  • la ruta de Chocolatey tiene ACL restrictivas;
  • cada paquete tiene un responsable y una justificación;
  • se han revisado el mantenedor, los scripts, las URL y las sumas;
  • las versiones constan en un manifiesto;
  • los parámetros de instalación están documentados aparte;
  • la fuente de producción es interna;
  • la fuente comunitaria está desactivada o eliminada en producción;
  • las identidades de lectura y publicación están separadas;
  • los secretos no figuran en los scripts;
  • los códigos 1641 y 3010 se tratan;
  • las actualizaciones se prueban antes del despliegue;
  • se genera con regularidad un informe outdated;
  • los registros se conservan;
  • se han probado la restauración y la reconstrucción.

Para ir más lejos

Esta guía encaja con nuestros otros artículos de Windows: primeros pasos con su VPS Windows para empezar, configurar el firewall de Windows Server para la política de red, instalar IIS si el VPS aloja un sitio, instalar Active Directory para un controlador de dominio, y guardar su VPS Windows antes de cualquier operación delicada.

Fuentes técnicas principales

Instalación y comandos

Paquetes, confianza y repositorios

Ediciones