Noticias

Almacene en caché las descargas instantáneas y ahorre ancho de banda

Para muchas personas, las conexiones rápidas de banda ancha y la cantidad ilimitada de datos son una realidad. Para otros, no lo son. Si tiene varios hosts Linux en su entorno (doméstico) y usa Snaps, cada uno de estos sistemas se comunica por separado con Snap Store y descarga regularmente las actualizaciones necesarias. Esto puede resultar costoso en términos de datos entrantes.

Una solución a este problema es almacenar en caché las descargas de Snap: tome los Snaps una vez y luego utilícelos tantas veces como sea necesario. Hay dos formas principales de lograrlo. Primero, puede descargar manualmente las instantáneas que necesita en un solo host y luego distribuirlas a través de su red interna mediante un mecanismo personalizado. La desventaja de este enfoque es que debe mantener su propio programa de actualización. En segundo lugar, puede configurar un servidor proxy Snap. En esta guía, le mostraremos cómo hacer esto.

Tenga en cuenta que este es un tutorial largo y complejo. Cubriremos conceptos como servidor web Nginx, base de datos Postgresql, proxy de red, administración de servicios, certificados y similares. Cada uno de ellos requiere cierta familiaridad con el tema, especialmente cuando necesita solucionar posibles errores.

Además, es posible que deba considerar la seguridad de la red, ya que ejecutar un servidor proxy tiene sus propios desafíos. Esto es un problema menor en las redes internas, pero hay una serie de prácticas saludables y un riguroso refuerzo de la seguridad que se deben seguir al exponer su computadora a Internet.

Antes de poder configurar el proxy instantáneo, necesita una configuración de base de datos. Instale el paquete postgresql en su distribución. Para que funcione con el proxy Snap, la plantilla de script más simple que puede usar es la siguiente:

CREATE ROLE "snapproxy-user" LOGIN CREATEROLE PASSWORD 'snapproxy-password';
CREATE DATABASE "snapproxy-db" OWNER "snapproxy-user";
connect "snapproxy-db"
CREATE EXTENSION "btree_gist";

Luego guarde el archivo y ejecute el script:

sudo -u postgres psql < proxydb.sql
CREATE ROLE
CREATE DATABASE
You are now connected to database "snapproxy-db" as user "postgres".
CREATE EXTENSION

A continuación, configure la cadena de conexión de la base de datos; se le pedirá la contraseña que configuró en el script de plantilla anterior.

sudo snap-proxy config proxy.db.connection="postgresql://[email protected]:5432/snapproxy-db"
Authentication error with user snapproxy-user.
Check the user name and password and that the user has the LOGIN privilege.
Please enter password for database user snapproxy-user (attempt 1 of 3):
Configured database for snaprevs role.
Configured database for snapauth role.
Configured database for snapident role.
Configured database for snapassert role.

El siguiente paso es instalar y configurar el proxy instantáneo.

sudo snap install snap-store-proxy

Una vez que el complemento esté configurado, deberá configurar su dominio. Debe ser una dirección de red enrutable para sus clientes: dirección IP o FQDN. La forma en que administra el espacio de nombres depende completamente de usted.

sudo snap-proxy config proxy.domain="DOMAIN"

Por ejemplo:

sudo snap-proxy config proxy.domain="10.0.2.15"

Una vez que se complete el paso anterior, deberá hacer que su instancia de proxy de Snap sea reconocible y verificarla desde la tienda de Snap upstream.

sudo snap-proxy import-certificate --selfsigned
sudo snap-proxy register

El proceso de registro es interactivo. Se le pedirá su correo electrónico y contraseña de SSO de Ubuntu, así como un segundo factor opcional de una sola vez. Después de eso, el script le hace una serie de preguntas sobre qué y cómo desea usar su proxy:

Please enter the Ubuntu SSO account you wish to use to register this proxy.
Email: [email protected]
Password:
Second-factor auth: 123456
Please let us know some details of your use-case:
Primary reason for using the Proxy:
  1: Update control of snap revisions
  2: Edge proxy for constrained network access
  3: Fun!
  4: Other
>

Si todo va bien, debería ver un mensaje como el siguiente:

Thank you, you have registered proxy ID kEpuqguXTNRB4UK9LC6Nl6Pn7ibYJtr8.
Your proxy has been automatically approved, and is ready to use.

Ahora tenemos que decirle al proxy que almacene las descargas en caché. El archivo de configuración debe guardarse en:

/var/snap/snap-store-proxy/current/nginx/snap-proxy.conf

Agregue el siguiente texto a este archivo: reemplace el marcador de posición genérico PROXY_HOSTNAME con su dominio, por ejemplo, 192.168.2.122, localhost u otra cosa que haya configurado anteriormente.

upstream thestore 
        server api.snapcraft.io:443;

server
    listen       80  default_server;
    server_name  _;
    return       444;

server
        listen 80;
        listen [::]:80;
        server_name PROXY_HOSTNAME; # hostname of your cloud proxy
        return 301 https://PROXY_HOSTNAME$request_uri;

server
        server_name PROXY_HOSTNAME; # hostname of your cloud proxy
        listen 443 ssl;
        ssl_certificate /etc/ssl/certs/cert.crt;
        ssl_certificate_key /etc/ssl/private/key.key;
        location /
                proxy_pass      https://thestore;
                # Substitute all store downloads url returned in JSON responses
                # from the store and repoint them at this cloud proxy.
      # Requires ngx_http_substitutions_filter_module that comes with nginx-extras in Debian/Ubuntu.
                subs_filter_types application/json;
                subs_filter     https://api.snapcraft.io/api/v1/snaps/download/ https://PROXY_HOSTNAME/api/v1/snaps/download/;
       

        location /api/v1/snaps/download/
                proxy_pass      https://thestore;
                # Trap redirects from the download endpoint and stream the
                # response from the cdn via an internal handler @handle_cdn.
                proxy_intercept_errors on;
                error_page 302 = @handle_cdn;
       

        location @handle_cdn
                Internal;
                # Resolver for the store cdn hosts. Test and set appropriately.
                resolver 127.0.0.53;
                set $cdn_url $upstream_http_location;
                proxy_pass $cdn_url;
       

Por ejemplo, use la dirección IP 10.0.2.15, esta línea:

return 301 https://PROXY_HOSTNAME$request_uri;

Se convierte en:

return 301 https://10.0.2.15$request_uri;

Para que funcione como se requiere, el proxy debe poder comunicarse con la tienda instantánea ascendente, pero también identificarse correctamente con la clave de aserción correcta correspondiente a su ID de proxy registrado.

Primero, verifique que Snap Proxy se esté ejecutando y que todos sus servicios estén en un estado activo:

sudo snap services snap-store-proxy
Service                        Startup  Current  Notes
snap-store-proxy.memcached     enabled  active   -
snap-store-proxy.nginx         enabled  active   -
snap-store-proxy.snapassert    enabled  active   -
snap-store-proxy.snapauth      enabled  active   -
snap-store-proxy.snapdevicegw  enabled  active   -
snap-store-proxy.snapident     enabled  active   -
snap-store-proxy.snapproxy     enabled  active   -
snap-store-proxy.snaprevs      enabled  active   -

Segundo, haz el Ajustar el estado del proxy Mando:

snap-proxy status
Store ID: kEpcqguXTNRM4UK9LC6Nl5Mn5ibYLtr7
Status: approved
Connected Devices (updated daily): 0
Device Limit: 5
Internal Service Status:
  memcached: running
  nginx: running
  snapauth: running
  snapdevicegw: running
  snapdevicegw-local: running
  snapproxy: running
  snaprevs: running

Finalmente, verifique la conexión:

snap-proxy check-connections
http: https://dashboard.snapcraft.io: OK
http: https://login.ubuntu.com: OK
http: https://api.snapcraft.io: OK
postgres: localhost: OK
All connections appear to be accessible

Ahora necesitamos decirle a nuestros sistemas cliente que usen el proxy. Para hacer esto, necesitamos obtener la clave de aserción y el ID de proxy en el servidor.

curl -sk https://DOMAIN/v2/auth/store/assertions

Reemplaza el marcador de posición DOMINIO con el dominio que usaste para configurar tu proxy. El comando debería devolver algunos datos. Algo como:

curl -sk https://localhost/v2/auth/store/assertions

O tal vez:

curl -sk https://10.0.2.15/v2/auth/store/assertions
type: account-key
authority-id: canonical
revision: 2
public-key-sha3-384:
BWDEoaqyr25nF5SNCvEv2v7QnM9QsfCc0PBMYD_i2NGSQ32EF2d4D0hqUel3m8ul
account-id: canonical
name: store
since: 2016-04-01T00:00:00.0Z
body-length: 717
sign-key-sha3-384: -CvQKAwRQ5h3Ffn10FILJoEZUXOv6km9FwA80-Rcj-f-6jadQ89VRswHNiEB9Lxk
AcbBTQRWhcGAARAA0KKYYQWuHOrsFVi4p4l7ZzSvX7kLgJFFeFgOkzdWKBTHEnsMKjl5mefFe9ji
qe8NlmJdfY7BenP7XeBtwKp700H/t9lLrZbpTNAPHXYxEWFJp5bPqIcJYBZ+29oLVLN1Tc5X482R
vCiDqL8+pPYqBrK2fNlyPlNNSum9wI70rDDL4r6FVvr+osTnGejibdV8JphWX+lrSQDnRSdM8KJi
UM43vTgLGTi9W54oRhsA2OFexRfRksTrnqGoonCjqX5wO3OFSaMDzMsO2MJ/hPfLgDqw53qjzuKL
...

Ahora repita el comando y guarde la clave de aserción en un archivo, por ejemplo:

curl -sk https://192.168.1.109/v2/auth/store/assertions > proxy.assert

Busque el ID de proxy de una manera similar:

snap-proxy config internal.store.id

Copie la información relevante (y el archivo de afirmación) a sus clientes. Luego haga lo siguiente en cada cliente:

sudo snap ack proxy.asset
sudo snap set core proxy.store=”PROXY ID”

Por ejemplo, puede tener tres sistemas en su entorno, 192.168.2.100, 192.168.2.101 y 192.168.2.102. Puede configurar el primero como servidor (use 192.168.2.100 para la configuración del proxy instantáneo) y luego sus dos clientes serán los sistemas .101 y .102. Estos hosts deben poder comunicarse entre sí.

Ahora está listo para instalar Snaps en sus clientes. La primera descarga debe realizarse para cada complemento solicitado, que luego se almacena en caché en el servidor.

Dado que esta es una configuración no trivial, puede haber algunos errores y ganchos.

Nginx no se está ejecutando

Puede haber varias razones por las que el servidor web no se esté ejecutando. Puede haber algo más vinculado a los puertos 80, 443 (como otra instancia de servidor web) o la configuración puede ser incorrecta por varias razones.

snap-proxy status
Store ID: kEpuqguXTNRM4UK5LC7Nl5Pn5ibZLtr2
Status: approved
Connected Devices (updated daily): 0
Device Limit: 5
Internal Service Status:
  memcached: running
  nginx: not running: (104, 'ECONNRESET')
  snapauth: running
  snapdevicegw: running
  snapdevicegw-local: running
  snapproxy: running
  snaprevs: running

Otros errores que puede encontrar incluyen:

nginx: not running: [Errno 111] Connection refused
nginx: not running: hostname '10.0.2.15' doesn't match either of '10.0.2.15', '127.0.0.1', '127.0.0.1'

El primer error indicaría que los puertos requeridos no están disponibles (tal vez ya estén en uso). El segundo error indica una discrepancia entre la configuración del servidor web y la configuración del proxy instantáneo.

Puede verificar y cambiar la configuración de nginx (en el complemento) en:

/var/snap/snap-store-proxy/current/nginx/nginx.conf

Para poder realizar los ajustes adecuados, por supuesto necesita cierta familiaridad con los servidores web en general y con nginx en particular. Luego reinicie (y / o recargue) el servidor después de cada cambio:

sudo snapctl restart snap-store-proxy.nginx

Certificado inválido

Cuando intenta instalar un Snap en su cliente, es posible que reciba una advertencia de que está utilizando un certificado incorrecto:

snap install vlc
error: cannot install "vlc": Post https://10.0.2.15/v2/snaps/refresh: x509: certificate is valid for 127.0.0.1, not 10.0.2.15

Esto podría deberse a una configuración incorrecta del servidor web o del proxy, similar a un certificado para, por ejemplo, dominio.com, pero no para www.dominio.com. Deberá ajustar la configuración de nginx y / o reconfigurar (y volver a registrar) su proxy.

Para volver a registrar el proxy, haga lo siguiente:

sudo snap-proxy reregister

Deberá volver a ejecutar los comandos del lado del cliente. Del mismo modo, también puede ver:

error: cannot install "vlc": Post https://127.0.0.1/v2/snaps/refresh: x509: certificate signed by unknown authority

En este caso, podría deberse a que está utilizando certificados personalizados y / o sus certificados no se agregaron durante el paso de configuración del proxy. Puede indicarle al proxy que use cualquier certificado que esté en su directorio nginx, p. Ej.

sudo snap set system store-certs.cert1="$(cat /var/snap/snap-store-proxy/current/nginx/127.0.0.1.cert)"

También puede restablecer los certificados agregados manualmente:

sudo snap-proxy remove-ca-certs

Para obtener más información, consulte el tutorial sobre solución de problemas de Snap Proxies.

El almacenamiento en caché de instantáneas puede ser una característica bastante útil, especialmente en entornos con muchos clientes y ancho de banda de red limitado. En casa, el proxy de Snap está limitado a cinco dispositivos, pero eso aún debería darle cierta ventaja para administrar de manera eficiente las instalaciones y actualizaciones de Snap. Con suerte, este tutorial aclara algunos de los elementos menos obvios de la configuración del proxy Snap. Si tiene alguna pregunta o idea, únase a nuestro foro y háganoslo saber.

Unsplash.

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba