Compare commits
8 Commits
0bbc20ca14
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| aa976406e4 | |||
| 11da827e52 | |||
| 23c556938b | |||
| 3bfbd99958 | |||
| 1d06b6bb37 | |||
| 612b808259 | |||
| 9991f318fc | |||
| acc0b0bb79 |
@@ -36,11 +36,11 @@ data:
|
|||||||
192.168.0.100 heimdall.c2et.net
|
192.168.0.100 heimdall.c2et.net
|
||||||
|
|
||||||
# === dotcom ) ===
|
# === dotcom ) ===
|
||||||
192.168.0.40 cockpit.c2et.com
|
192.168.0.100 cockpit.c2et.com
|
||||||
192.168.0.40 git.c2et.com
|
192.168.0.100 git.c2et.com
|
||||||
192.168.0.40 harbor.c2et.com
|
192.168.0.100 harbor.c2et.com
|
||||||
192.168.0.40 wireguard.c2et.com
|
192.168.0.100 wireguard.c2et.com
|
||||||
192.168.0.40 proxy.c2et.com
|
192.168.0.100 proxy.c2et.com
|
||||||
192.168.0.80 backend.apolo.c2et.com
|
192.168.0.80 backend.apolo.c2et.com
|
||||||
192.168.0.80 portal.apolo.c2et.com
|
192.168.0.80 portal.apolo.c2et.com
|
||||||
192.168.0.80 colossus.apolo.c2et.com
|
192.168.0.80 colossus.apolo.c2et.com
|
||||||
@@ -63,7 +63,7 @@ data:
|
|||||||
|
|
||||||
fallthrough
|
fallthrough
|
||||||
}
|
}
|
||||||
forward . /etc/resolv.conf
|
forward . 8.8.8.8 1.1.1.1
|
||||||
cache 120
|
cache 120
|
||||||
# prometheus 0.0.0.0:9153 # <- activa si quieres métricas
|
# prometheus 0.0.0.0:9153 # <- activa si quieres métricas
|
||||||
}
|
}
|
||||||
|
|||||||
9
dynu-updater/harbor-regcred.yaml
Normal file
9
dynu-updater/harbor-regcred.yaml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
data:
|
||||||
|
.dockerconfigjson: eyJhdXRocyI6eyJoYXJib3IuYzJldC5uZXQiOnsidXNlcm5hbWUiOiJ4YXZvciIsInBhc3N3b3JkIjoiTUBuYWJvMjAyNSIsImVtYWlsIjoiYWRtaW5AYzJldC5uZXQiLCJhdXRoIjoiZUdGMmIzSTZUVUJ1WVdKdk1qQXlOUT09In19fQ==
|
||||||
|
kind: Secret
|
||||||
|
metadata:
|
||||||
|
creationTimestamp: null
|
||||||
|
name: harbor-regcred
|
||||||
|
namespace: dynu-updater
|
||||||
|
type: kubernetes.io/dockerconfigjson
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
resources:
|
resources:
|
||||||
|
- harbor-regcred.yaml
|
||||||
- namespace.yaml
|
- namespace.yaml
|
||||||
- cronjob.yaml
|
- cronjob.yaml
|
||||||
|
|||||||
53
external/configmaps/configmap.yaml
vendored
53
external/configmaps/configmap.yaml
vendored
@@ -4,6 +4,20 @@ metadata:
|
|||||||
name: nginx-router-config
|
name: nginx-router-config
|
||||||
namespace: external
|
namespace: external
|
||||||
data:
|
data:
|
||||||
|
_common.conf: |
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Connection "upgrade";
|
||||||
|
proxy_read_timeout 3600;
|
||||||
|
proxy_send_timeout 3600;
|
||||||
|
client_max_body_size 0;
|
||||||
|
proxy_redirect off;
|
||||||
|
proxy_ssl_server_name on;
|
||||||
|
|
||||||
router.conf: |
|
router.conf: |
|
||||||
server {
|
server {
|
||||||
listen 80 default_server;
|
listen 80 default_server;
|
||||||
@@ -36,40 +50,43 @@ data:
|
|||||||
|
|
||||||
gitdotcom.conf: |
|
gitdotcom.conf: |
|
||||||
server {
|
server {
|
||||||
listen 3001;
|
listen 80;
|
||||||
server_name git.c2et.com;
|
server_name git.c2et.com;
|
||||||
location / {
|
location / {
|
||||||
proxy_pass https://192.168.0.40;
|
include /etc/nginx/conf.d/_common.conf;
|
||||||
proxy_ssl_verify off;
|
proxy_pass http://192.168.0.40:3001;
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
harbordotcom.conf: |
|
|
||||||
server {
|
|
||||||
listen 85;
|
|
||||||
server_name harbor.c2et.com;
|
|
||||||
location / {
|
|
||||||
proxy_pass https://192.168.0.40;
|
|
||||||
proxy_ssl_verify off;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
wireguarddotcom.conf: |
|
wireguarddotcom.conf: |
|
||||||
server {
|
server {
|
||||||
listen 51821;
|
listen 80;
|
||||||
server_name wireguard.c2et.com;
|
server_name wireguard.c2et.com;
|
||||||
location / {
|
location / {
|
||||||
proxy_pass https://192.168.0.40;
|
include /etc/nginx/conf.d/_common.conf;
|
||||||
proxy_ssl_verify off;
|
proxy_pass http://192.168.0.40:51821;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
harbordotcom.conf: |
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
server_name harbor.c2et.com;
|
||||||
|
location / {
|
||||||
|
include /etc/nginx/conf.d/_common.conf;
|
||||||
|
proxy_pass http://192.168.0.40:85;
|
||||||
|
proxy_set_header X-Forwarded-Host $host;
|
||||||
|
proxy_set_header X-Forwarded-Port $server_port;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cockpitdotcom.conf: |
|
cockpitdotcom.conf: |
|
||||||
server {
|
server {
|
||||||
listen 9090;
|
listen 80;
|
||||||
server_name cockpit.c2et.com;
|
server_name cockpit.c2et.com;
|
||||||
location / {
|
location / {
|
||||||
proxy_pass https://192.168.0.40;
|
proxy_pass https://192.168.0.40:9090;
|
||||||
proxy_ssl_verify off;
|
proxy_ssl_verify off;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
1
external/ingress/wireguarddotcom.yaml
vendored
1
external/ingress/wireguarddotcom.yaml
vendored
@@ -8,6 +8,7 @@ metadata:
|
|||||||
nginx.ingress.kubernetes.io/backend-protocol: "HTTP"
|
nginx.ingress.kubernetes.io/backend-protocol: "HTTP"
|
||||||
nginx.ingress.kubernetes.io/ssl-redirect: "true"
|
nginx.ingress.kubernetes.io/ssl-redirect: "true"
|
||||||
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
|
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
|
||||||
|
nginx.ingress.kubernetes.io/upstream-vhost: "wireguard.c2et.com"
|
||||||
spec:
|
spec:
|
||||||
ingressClassName: nginx
|
ingressClassName: nginx
|
||||||
tls:
|
tls:
|
||||||
|
|||||||
30
readme.md
30
readme.md
@@ -114,6 +114,13 @@ Este repositorio contiene los **manifiestos, scripts y documentación** para des
|
|||||||
* Montado sobre dos **almacenes S3** (Minio), uno por **SITE**
|
* Montado sobre dos **almacenes S3** (Minio), uno por **SITE**
|
||||||
* Cada almacen en una cabina de almacenamiento **(DriverCSI)**
|
* Cada almacen en una cabina de almacenamiento **(DriverCSI)**
|
||||||
|
|
||||||
|
### 5.4. Repositorio interno
|
||||||
|
|
||||||
|
* **Repo**
|
||||||
|
* De momento, los repos de OpenSUSE 15.6 (ampliable)
|
||||||
|
* Servidor HTTP/HTTPS para centralizar las descargas
|
||||||
|
* servidor Samba para replicas a traves de diodo de datos
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 6. 📚 Índice de documentos y referencias cruzadas
|
## 6. 📚 Índice de documentos y referencias cruzadas
|
||||||
@@ -145,6 +152,8 @@ Este repositorio contiene los **manifiestos, scripts y documentación** para des
|
|||||||
| `argos\readme.md` | Manual de instalación de Argos Core | [Ver](./argos/readme.md) |
|
| `argos\readme.md` | Manual de instalación de Argos Core | [Ver](./argos/readme.md) |
|
||||||
| `multusk3s.md` | Notas para Multus en K3s | [Ver](./multusk3s.md) |
|
| `multusk3s.md` | Notas para Multus en K3s | [Ver](./multusk3s.md) |
|
||||||
| `velero\readme.md` | Manual de instalación de Velero | [Ver](./velero/readme.md) |
|
| `velero\readme.md` | Manual de instalación de Velero | [Ver](./velero/readme.md) |
|
||||||
|
| `dynu-updater\readme.md` | Manual de Dynu-updater | [Ver](./dynu-updater/readme.md) |
|
||||||
|
| `repo\readme.md` | Manual del repo SUSE | [Ver](./repo/readme.md) |
|
||||||
---
|
---
|
||||||
|
|
||||||
## 7. 📊 Estado actual de la instalación
|
## 7. 📊 Estado actual de la instalación
|
||||||
@@ -157,17 +166,20 @@ Este repositorio contiene los **manifiestos, scripts y documentación** para des
|
|||||||
| `Volumenes persistentes` | ✅ Completado | Rook Ceph a 4 nodos, falta ampliar a 5 nodos | [https://ceph.c2et.net](https://ceph.c2et.net/) | admin / Pozuelo12345 |
|
| `Volumenes persistentes` | ✅ Completado | Rook Ceph a 4 nodos, falta ampliar a 5 nodos | [https://ceph.c2et.net](https://ceph.c2et.net/) | admin / Pozuelo12345 |
|
||||||
| `Volumenes persistentes` | ✅ Completado | Driver para las cabinas de almacenamiendo DEEL Powervault | | |
|
| `Volumenes persistentes` | ✅ Completado | Driver para las cabinas de almacenamiendo DEEL Powervault | | |
|
||||||
| `Maquinas Virtuales` | ✅ Completado | Desplegado kubevirt, dashboard e isoserver | [https://kubevirt.c2et.net](https://kubevirt.c2et.net/) <br>[https://isoserver.c2et.net](https://isoserver.c2et.net/) | - |
|
| `Maquinas Virtuales` | ✅ Completado | Desplegado kubevirt, dashboard e isoserver | [https://kubevirt.c2et.net](https://kubevirt.c2et.net/) <br>[https://isoserver.c2et.net](https://isoserver.c2et.net/) | - |
|
||||||
| `Wireguard` | ✅ Completado | Funcionando | [https://wireguard.c2et.net](https://wireguard.c2et.net/) | Pozuelo12345 |
|
| `Wireguard` | ✅ Completado | version con acceso a 0.0 y a 200.0 | [https://wireguard.c2et.net](https://wireguard.c2et.net/) | Pozuelo12345 |
|
||||||
| `CoreDNS` | ✅ Completado | Funcionando | | |
|
| `CoreDNS` | ✅ Completado | Split DNS interno configurado en los host fisicos | | |
|
||||||
| `Apolo` | ✅ Completado | Funcionando | [https://portal.apolo.c2et.net](https://portal.apolo.c2et.net/) | admin / 123456 |
|
| `Apolo` | ✅ Completado | Funcionando, falta probar streaming | [https://portal.apolo.c2et.net](https://portal.apolo.c2et.net/) | admin / 123456 |
|
||||||
| `Gitea` | ✅ Completado | Funcionando | [https://git.c2et.net](https://git.c2et.net) | |
|
| `Gitea` | ✅ Completado | Funcionando | [https://git.c2et.net](https://git.c2et.net) | |
|
||||||
| `Harbor` | ✅ Completado | Funcionando | [https://harbor.c2et.net](https://harbor.c2et.net) | |
|
| `Harbor` | ✅ Completado | Funcionando pero no esta Ismael (solo estoy yo)| [https://harbor.c2et.net](https://harbor.c2et.net) | |
|
||||||
| `Guacamole` | ✅ Completado | Funcionando | [https://heimdall.c2et.net](https://heimdall.c2et.net) | guacadmin / guacadmin |
|
| `Guacamole` | ✅ Completado | Funcionando, pero esta en blanco (hay que crear los hosts) | [https://heimdall.c2et.net](https://heimdall.c2et.net) | guacadmin / guacadmin |
|
||||||
| `VSCode` | ✅ Completado | Funcionando | [https://vscode.c2et.net](https://vscode.c2et.net) | Pozuelo12345 |
|
| `VSCode` | ✅ Completado | Funcionando | [https://vscode.c2et.net](https://vscode.c2et.net) | Pozuelo12345 |
|
||||||
| `Tileserver-GL` | ✅ Completado | Funcionando | [https://mapas.c2et.net](https://mapas.c2et.net) | |
|
| `Tileserver-GL` | ✅ Completado | Funcionando con mapa de España de prueba | [https://mapas.c2et.net](https://mapas.c2et.net) | |
|
||||||
| `External` | ✅ Completado | Funcionando | [https://admin.firewall.c2et.net](https://admin.firewall.c2et.net) <br>[https://admin.powervault1.c2et.net](https://admin.powervault1.c2et.net)<br> [https://admin.powervault2.c2et.net](https://admin.powervault2.c2et.net) | |
|
| `External` | ✅ Completado | Funcionando los servicios de docker | [https://admin.firewall.c2et.net](https://admin.firewall.c2et.net) <br>[https://admin.powervault1.c2et.net](https://admin.powervault1.c2et.net)<br> [https://admin.powervault2.c2et.net](https://admin.powervault2.c2et.net) | |
|
||||||
| `Argos Core` | ✅ Completado | Funcionando | [https://argos.panel.c2et.net/](https://argos.panel.c2et.net) | |
|
| `Argos Core` | ✅ Completado | Funcionando sin clientes configurados | [https://argos.panel.c2et.net/](https://argos.panel.c2et.net) | |
|
||||||
| `Velero` | ✅ Completado | Funcionando | | |
|
| `Velero` | ✅ Completado | Copia de seguridad diaria de dynu y semanal de todo | | |
|
||||||
|
| `Dynu-updater` | ✅ Completado | Funcionando, actualiza el grupo "Trabajo" | | |
|
||||||
|
| `Repo` | ✅ Completado | Probando a ver si funciona | [http://repo.c2et.net/](https://repo.c2et.net) | |
|
||||||
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -4,28 +4,55 @@ metadata:
|
|||||||
name: repo-sources
|
name: repo-sources
|
||||||
namespace: repo
|
namespace: repo
|
||||||
data:
|
data:
|
||||||
|
# Lista de orígenes a espejar
|
||||||
|
# Formato por línea: NAME|URL|SUBDIR
|
||||||
|
# SUBDIR cuelga de /mirror/repos (asegúrate de que tu Deployment monta el PVC en /usr/local/apache2/htdocs con subPath repos)
|
||||||
sources.txt: |
|
sources.txt: |
|
||||||
|
# openSUSE Leap 15.6 (básicos + updates)
|
||||||
repo-oss|http://download.opensuse.org/distribution/leap/15.6/repo/oss/|opensuse/leap/15.6/oss
|
repo-oss|http://download.opensuse.org/distribution/leap/15.6/repo/oss/|opensuse/leap/15.6/oss
|
||||||
repo-non-oss|http://download.opensuse.org/distribution/leap/15.6/repo/non-oss/|opensuse/leap/15.6/non-oss
|
repo-non-oss|http://download.opensuse.org/distribution/leap/15.6/repo/non-oss/|opensuse/leap/15.6/non-oss
|
||||||
update-oss|http://download.opensuse.org/update/leap/15.6/oss/|opensuse/leap/15.6/update/oss
|
update-oss|http://download.opensuse.org/update/leap/15.6/oss/|opensuse/leap/15.6/update/oss
|
||||||
update-non-oss|http://download.opensuse.org/update/leap/15.6/non-oss/|opensuse/leap/15.6/update/non-oss
|
update-non-oss|http://download.opensuse.org/update/leap/15.6/non-oss/|opensuse/leap/15.6/update/non-oss
|
||||||
update-sle|http://download.opensuse.org/update/leap/15.6/sle/|opensuse/leap/15.6/update/sle
|
update-sle|http://download.opensuse.org/update/leap/15.6/sle/|opensuse/leap/15.6/update/sle
|
||||||
backports|http://download.opensuse.org/update/leap/15.6/backports/|opensuse/leap/15.6/update/backports
|
backports|http://download.opensuse.org/update/leap/15.6/backports/|opensuse/leap/15.6/update/backports
|
||||||
|
|
||||||
|
# Codecs openh264
|
||||||
openh264|http://codecs.opensuse.org/openh264/openSUSE_Leap/|opensuse/openh264
|
openh264|http://codecs.opensuse.org/openh264/openSUSE_Leap/|opensuse/openh264
|
||||||
|
|
||||||
|
# Terceros (opcional)
|
||||||
nvidia|https://download.nvidia.com/opensuse/leap/15.6/|thirdparty/nvidia/leap/15.6
|
nvidia|https://download.nvidia.com/opensuse/leap/15.6/|thirdparty/nvidia/leap/15.6
|
||||||
k8s-stable|https://pkgs.k8s.io/core:/stable:/v1.33/rpm/|thirdparty/kubernetes/core/stable/v1.33/rpm
|
k8s-stable|https://pkgs.k8s.io/core:/stable:/v1.33/rpm/|thirdparty/kubernetes/core/stable/v1.33/rpm
|
||||||
|
|
||||||
|
# Claves públicas a publicar en /mirror/keys
|
||||||
|
# Formato por línea: NAME|URL|FILENAME
|
||||||
|
# Ajusta las URLs si prefieres otras fuentes/ubicaciones oficiales
|
||||||
|
keys.txt: |
|
||||||
|
opensuse|https://download.opensuse.org/repositories/openSUSE:/Leap:/15.6:/Update/standard/repodata/repomd.xml.key|RPM-GPG-KEY-openSUSE
|
||||||
|
nvidia|https://download.nvidia.com/opensuse/repodata/repomd.xml.key|RPM-GPG-KEY-NVIDIA
|
||||||
|
k8s|https://pkgs.k8s.io/core:/stable:/v1.33/rpm/repodata/repomd.xml.key|RPM-GPG-KEY-k8s
|
||||||
|
|
||||||
|
# Script de sincronización diario (CronJob)
|
||||||
|
# - Sincroniza repos a /mirror/repos/...
|
||||||
|
# - Publica claves GPG en /mirror/keys
|
||||||
sync.sh: |
|
sync.sh: |
|
||||||
|
#!/usr/bin/env bash
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
SRC_LIST="/config/sources.txt"
|
SRC_LIST="/config/sources.txt"
|
||||||
|
KEYS_LIST="/config/keys.txt"
|
||||||
|
|
||||||
DEST_ROOT="/mirror/repos"
|
DEST_ROOT="/mirror/repos"
|
||||||
|
DEST_KEYS="/mirror/keys"
|
||||||
|
|
||||||
mkdir -p "$DEST_ROOT"
|
mkdir -p "$DEST_ROOT" "$DEST_KEYS"
|
||||||
|
|
||||||
command -v rsync >/dev/null 2>&1 || echo "Aviso: rsync no disponible; usaré wget para HTTP/HTTPS"
|
# Requisitos
|
||||||
command -v wget >/dev/null 2>&1 || { echo "ERROR: wget requerido"; exit 1; }
|
command -v wget >/dev/null 2>&1 || { echo "ERROR: wget requerido"; exit 1; }
|
||||||
|
if ! command -v rsync >/dev/null 2>&1; then
|
||||||
|
echo "Aviso: rsync no disponible; usaré wget para HTTP/HTTPS"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "===== SYNC REPOS ====="
|
||||||
while IFS='|' read -r NAME URL SUBDIR; do
|
while IFS='|' read -r NAME URL SUBDIR; do
|
||||||
[[ -z "${NAME:-}" || "${NAME:0:1}" == "#" ]] && continue
|
[[ -z "${NAME:-}" || "${NAME:0:1}" == "#" ]] && continue
|
||||||
|
|
||||||
@@ -35,22 +62,39 @@ data:
|
|||||||
echo "==> Sync ${NAME} (${URL}) -> ${DEST}"
|
echo "==> Sync ${NAME} (${URL}) -> ${DEST}"
|
||||||
|
|
||||||
if [[ "$URL" == rsync://* ]]; then
|
if [[ "$URL" == rsync://* ]]; then
|
||||||
|
# Sincronización eficiente por rsync (si el mirror lo soporta)
|
||||||
rsync -aH --delete --partial --info=stats1,progress2 "${URL}" "${DEST}/"
|
rsync -aH --delete --partial --info=stats1,progress2 "${URL}" "${DEST}/"
|
||||||
else
|
else
|
||||||
|
# Mirror vía HTTP/HTTPS con wget
|
||||||
TMP="${DEST}.tmp"
|
TMP="${DEST}.tmp"
|
||||||
mkdir -p "$TMP"
|
mkdir -p "$TMP"
|
||||||
|
|
||||||
|
# -m (mirror), -np (no subir), -nH (sin host en ruta), robots=off
|
||||||
wget -m -np -nH -e robots=off -P "$TMP" --no-verbose --show-progress "$URL"
|
wget -m -np -nH -e robots=off -P "$TMP" --no-verbose --show-progress "$URL"
|
||||||
|
|
||||||
|
# Mover contenido espeljado a DEST (limpiando y dejando estructura limpia)
|
||||||
shopt -s dotglob nullglob
|
shopt -s dotglob nullglob
|
||||||
SRC_CONTENT=("$TMP"/*)
|
if compgen -G "$TMP/*" >/dev/null; then
|
||||||
if [[ ${#SRC_CONTENT[@]} -gt 0 ]]; then
|
|
||||||
rsync -a --delete "$TMP"/ "$DEST"/
|
rsync -a --delete "$TMP"/ "$DEST"/
|
||||||
fi
|
fi
|
||||||
rm -rf "$TMP"
|
rm -rf "$TMP"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Permisos legibles por httpd y Samba
|
||||||
chmod -R a+rX "$DEST"
|
chmod -R a+rX "$DEST"
|
||||||
done < "$SRC_LIST"
|
done < "$SRC_LIST"
|
||||||
|
|
||||||
echo "Sync completado."
|
echo "===== SYNC KEYS ====="
|
||||||
|
if [[ -f "$KEYS_LIST" ]]; then
|
||||||
|
while IFS='|' read -r KNAME KURL KFILE; do
|
||||||
|
[[ -z "${KNAME:-}" || "${KNAME:0:1}" == "#" ]] && continue
|
||||||
|
echo "==> Key ${KNAME} (${KURL}) -> ${DEST_KEYS}/${KFILE}"
|
||||||
|
wget -q -O "${DEST_KEYS}/${KFILE}.tmp" "$KURL"
|
||||||
|
mv "${DEST_KEYS}/${KFILE}.tmp" "${DEST_KEYS}/${KFILE}"
|
||||||
|
chmod a+r "${DEST_KEYS}/${KFILE}"
|
||||||
|
done < "$KEYS_LIST"
|
||||||
|
else
|
||||||
|
echo "No hay KEYS_LIST ($KEYS_LIST), omitido."
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "===== DONE ====="
|
||||||
|
|||||||
144
repo/configure-local-repos.sh
Normal file
144
repo/configure-local-repos.sh
Normal file
@@ -0,0 +1,144 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# ============================
|
||||||
|
# Configuración (ajusta aquí)
|
||||||
|
# ============================
|
||||||
|
BASE_URL="${BASE_URL:-http://repo.c2et.net}" # tu dominio del mirror (sin / al final)
|
||||||
|
LEAP_VER="${LEAP_VER:-15.6}" # versión de Leap
|
||||||
|
ENABLE_NVIDIA="${ENABLE_NVIDIA:-true}" # true/false
|
||||||
|
ENABLE_K8S="${ENABLE_K8S:-true}" # true/false
|
||||||
|
DISABLE_EXTERNAL="${DISABLE_EXTERNAL:-true}" # true/false (deshabilitar repos externos)
|
||||||
|
|
||||||
|
# Rutas base del mirror interno
|
||||||
|
REPO_BASE="${BASE_URL}/opensuse/leap/${LEAP_VER}"
|
||||||
|
KEYS_BASE="${BASE_URL}/keys"
|
||||||
|
|
||||||
|
# Directorio de repos dnf/zypp
|
||||||
|
REPOS_DIR="/etc/zypp/repos.d"
|
||||||
|
|
||||||
|
# ============================
|
||||||
|
# Helpers
|
||||||
|
# ============================
|
||||||
|
need_root() {
|
||||||
|
if [[ $EUID -ne 0 ]]; then
|
||||||
|
echo "Este script debe ejecutarse como root (o con sudo)." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
have_cmd() {
|
||||||
|
command -v "$1" >/dev/null 2>&1
|
||||||
|
}
|
||||||
|
|
||||||
|
write_repo() {
|
||||||
|
local alias="$1" name="$2" baseurl="$3" gpgkey="$4"
|
||||||
|
local path="${REPOS_DIR}/${alias}.repo"
|
||||||
|
|
||||||
|
cat >"${path}.tmp" <<EOF
|
||||||
|
[${alias}]
|
||||||
|
name=${name}
|
||||||
|
enabled=1
|
||||||
|
autorefresh=1
|
||||||
|
baseurl=${baseurl}
|
||||||
|
type=rpm-md
|
||||||
|
gpgcheck=1
|
||||||
|
gpgkey=${gpgkey}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Solo mueve si cambió (idempotente)
|
||||||
|
if [[ ! -f "${path}" ]] || ! cmp -s "${path}.tmp" "${path}"; then
|
||||||
|
mv "${path}.tmp" "${path}"
|
||||||
|
echo " - Escrito ${path}"
|
||||||
|
else
|
||||||
|
rm -f "${path}.tmp"
|
||||||
|
echo " - Sin cambios ${path}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
import_key() {
|
||||||
|
local url="$1" file="key-$(basename "$url")"
|
||||||
|
# rpm ignora si ya está importada; esto es idempotente
|
||||||
|
echo " - Importando clave: $url"
|
||||||
|
rpm --import "$url" || {
|
||||||
|
echo " * Aviso: no se pudo importar $url. ¿Hay conectividad al mirror?" >&2
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
disable_external_repos() {
|
||||||
|
echo "Deshabilitando repos externos conocidos..."
|
||||||
|
# Deshabilita TODO lo que no sea *_local que creemos, de forma segura:
|
||||||
|
# Busca todos los alias actuales y deshabilita los que no terminen en '-local'
|
||||||
|
local aliases
|
||||||
|
aliases=$(zypper --non-interactive lr -u | awk 'NR>2 {print $1,$2}' | tail -n +1 | awk '{print $2}')
|
||||||
|
for a in $aliases; do
|
||||||
|
if [[ "$a" != *-local ]]; then
|
||||||
|
# Algunos sistemas traen alias con espacios; saltamos los complicados
|
||||||
|
if [[ "$a" =~ ^[A-Za-z0-9._:-]+$ ]]; then
|
||||||
|
zypper --non-interactive mr -d "$a" || true
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# ============================
|
||||||
|
# Main
|
||||||
|
# ============================
|
||||||
|
need_root
|
||||||
|
|
||||||
|
if ! have_cmd zypper; then
|
||||||
|
echo "No se encontró zypper. ¿Es openSUSE/SLE este sistema?" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "== Configurando repos locales desde ${BASE_URL} para Leap ${LEAP_VER} =="
|
||||||
|
|
||||||
|
mkdir -p "$REPOS_DIR"
|
||||||
|
|
||||||
|
# 1) Importa claves GPG desde tu mirror
|
||||||
|
echo "Importando claves GPG desde ${KEYS_BASE} ..."
|
||||||
|
import_key "${KEYS_BASE}/RPM-GPG-KEY-openSUSE" || true
|
||||||
|
$ENABLE_NVIDIA && import_key "${KEYS_BASE}/RPM-GPG-KEY-NVIDIA" || true
|
||||||
|
$ENABLE_K8S && import_key "${KEYS_BASE}/RPM-GPG-KEY-k8s" || true
|
||||||
|
|
||||||
|
# 2) Repos base de openSUSE
|
||||||
|
echo "Escribiendo archivos .repo para repos locales..."
|
||||||
|
write_repo "repo-oss-local" "repo-oss-local" "${REPO_BASE}/oss" "${KEYS_BASE}/RPM-GPG-KEY-openSUSE"
|
||||||
|
write_repo "repo-non-oss-local" "repo-non-oss-local" "${REPO_BASE}/non-oss" "${KEYS_BASE}/RPM-GPG-KEY-openSUSE"
|
||||||
|
write_repo "update-oss-local" "update-oss-local" "${REPO_BASE}/update/oss" "${KEYS_BASE}/RPM-GPG-KEY-openSUSE"
|
||||||
|
write_repo "update-non-oss-local" "update-non-oss-local" "${REPO_BASE}/update/non-oss" "${KEYS_BASE}/RPM-GPG-KEY-openSUSE"
|
||||||
|
write_repo "update-sle-local" "update-sle-local" "${REPO_BASE}/update/sle" "${KEYS_BASE}/RPM-GPG-KEY-openSUSE"
|
||||||
|
write_repo "update-backports-local" "update-backports-local" "${REPO_BASE}/update/backports" "${KEYS_BASE}/RPM-GPG-KEY-openSUSE"
|
||||||
|
write_repo "openh264-local" "openh264-local" "${BASE_URL}/opensuse/openh264" "${KEYS_BASE}/RPM-GPG-KEY-openSUSE"
|
||||||
|
|
||||||
|
# 3) Repos de terceros (opcional)
|
||||||
|
if $ENABLE_NVIDIA; then
|
||||||
|
write_repo "nvidia-local" "nvidia-local" \
|
||||||
|
"${BASE_URL}/thirdparty/nvidia/leap/${LEAP_VER}" \
|
||||||
|
"${KEYS_BASE}/RPM-GPG-KEY-NVIDIA"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if $ENABLE_K8S; then
|
||||||
|
write_repo "k8s-stable-local" "k8s-stable-local" \
|
||||||
|
"${BASE_URL}/thirdparty/kubernetes/core/stable/v1.33/rpm" \
|
||||||
|
"${KEYS_BASE}/RPM-GPG-KEY-k8s"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 4) Deshabilitar repos externos si procede
|
||||||
|
if $DISABLE_EXTERNAL; then
|
||||||
|
disable_external_repos
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 5) Refrescar repos (no interactivo)
|
||||||
|
echo "Refrescando repos..."
|
||||||
|
zypper --non-interactive --gpg-auto-import-keys ref || true
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "== Listado final de repos =="
|
||||||
|
zypper lr -d || true
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "Listo. Si quieres personalizar:"
|
||||||
|
echo " BASE_URL=... LEAP_VER=... ENABLE_NVIDIA=true/false ENABLE_K8S=true/false DISABLE_EXTERNAL=true/false \\"
|
||||||
|
echo " sudo -E ./$(basename "$0")"
|
||||||
@@ -1,22 +1,30 @@
|
|||||||
## Cómo usarlo (rápido)
|
# Repositorio Privado openSUSE
|
||||||
|
|
||||||
|
Este despliegue en Kubernetes crea un **mirror interno de repositorios de openSUSE** (y de terceros opcionales, como NVIDIA o Kubernetes). Sirve para que los servidores de nuestra red se actualicen **desde dentro**, sin depender de internet.
|
||||||
|
|
||||||
|
El sistema funciona con:
|
||||||
|
|
||||||
|
* **Servidor HTTP/HTTPS** → los clientes SUSE acceden vía `http://repo.c2et.net/...` o `https://repo.c2et.net/...` para descargar paquetes y metadatos.
|
||||||
|
* **Servidor Samba (SMB)** → expone la misma carpeta por red. Esto nos permite que el **“diodo de datos”** copie los repos de manera unidireccional hacia la red clasificada. Así aseguramos que las máquinas en la red sensible reciben actualizaciones sin conectividad exterior.
|
||||||
|
|
||||||
|
La carpeta de repos se actualiza automáticamente cada día mediante un **CronJob**, que sincroniza contra los repos oficiales de openSUSE y de terceros.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Cómo desplegarlo
|
||||||
|
|
||||||
1. Ajusta **dominio** en el Ingress y (si quieres) IP fija en el Service de Samba.
|
1. Ajusta **dominio** en el Ingress y (si quieres) IP fija en el Service de Samba.
|
||||||
2. Revisa tamaño de **PVC**.
|
2. Revisa tamaño de **PVC** (mínimo 300 GB recomendado).
|
||||||
3. (Opcional) Cambia o amplía la lista en `sources.txt`. Si tienes un mirror con **rsync**, usa `rsync://...` en la URL para más eficiencia.
|
3. (Opcional) Cambia o amplía la lista en `sources.txt` (por ejemplo, usando mirrors con `rsync://`).
|
||||||
4. Aplica en orden:
|
4. Despliega todo de una vez con **Kustomize**:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
kubectl apply -f repo/namespace.yaml
|
kubectl apply -k repo/
|
||||||
kubectl apply -f repo/pvc.yaml
|
|
||||||
kubectl apply -f repo/configmap/repo-sources.yaml
|
|
||||||
kubectl apply -f repo/deployments/repo-server.yaml
|
|
||||||
kubectl apply -f repo/services/service-http.yaml
|
|
||||||
kubectl apply -f repo/services/service-samba.yaml # o NodePort
|
|
||||||
kubectl apply -f repo/ingress/ingress-repo.yaml
|
|
||||||
kubectl apply -f repo/cronjobs/repo-sync.yaml
|
|
||||||
```
|
```
|
||||||
|
|
||||||
5. Lanza una sync inicial **ad hoc** (sin esperar al cron) creando un Job manual:
|
*(Si prefieres, aún puedes aplicar los manifiestos uno por uno en el orden indicado en la carpeta `repo/`.)*
|
||||||
|
|
||||||
|
5. Para lanzar una sincronización inicial manual (sin esperar al cron):
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
kubectl create job --from=cronjob/repo-sync repo-sync-now -n repo
|
kubectl create job --from=cronjob/repo-sync repo-sync-now -n repo
|
||||||
@@ -27,28 +35,37 @@ kubectl logs -f job/repo-sync-now -n repo
|
|||||||
|
|
||||||
## Configuración en los clientes SUSE
|
## Configuración en los clientes SUSE
|
||||||
|
|
||||||
En tus servidores, añade repos apuntando a tu repo interno, por ejemplo:
|
En los clientes no hace falta configurar repos manualmente. Basta con ejecutar el **script de cliente** incluido en este repo (`configure-local-repos.sh`). Este script:
|
||||||
|
|
||||||
|
* Importa las claves GPG desde `http://repo.c2et.net/keys/`.
|
||||||
|
* Crea los `.repo` apuntando al mirror interno.
|
||||||
|
* Deshabilita los repos externos para que solo se usen los `-local`.
|
||||||
|
|
||||||
|
### Uso del script en el cliente
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# HTTP (recomendado)
|
chmod +x configure-local-repos.sh
|
||||||
sudo zypper ar -f http://repo.c2et.net/opensuse/leap/15.6/oss repo-oss-local
|
sudo ./configure-local-repos.sh
|
||||||
sudo zypper ar -f http://repo.c2et.net/opensuse/leap/15.6/non-oss repo-non-oss-local
|
|
||||||
sudo zypper ar -f http://repo.c2et.net/opensuse/leap/15.6/update/oss update-oss-local
|
|
||||||
sudo zypper ar -f http://repo.c2et.net/opensuse/leap/15.6/update/non-oss update-non-oss-local
|
|
||||||
sudo zypper ar -f http://repo.c2et.net/opensuse/leap/15.6/update/sle update-sle-local
|
|
||||||
sudo zypper ar -f http://repo.c2et.net/opensuse/leap/15.6/update/backports update-backports-local
|
|
||||||
sudo zypper ar -f http://repo.c2et.net/opensuse/openh264 openh264-local
|
|
||||||
|
|
||||||
# Terceros (si los espejas):
|
|
||||||
sudo zypper ar -f http://repo.c2et.net/thirdparty/nvidia/leap/15.6 nvidia-local
|
|
||||||
sudo zypper ar -f http://repo.c2et.net/thirdparty/kubernetes/core/stable/v1.33/rpm k8s-stable-local
|
|
||||||
```
|
```
|
||||||
|
|
||||||
> Truco: deja tus repos “externos” deshabilitados (`zypper mr -d <alias>`) y activa solo los “-local”. Así fuerzan el uso del mirror interno.
|
Esto deja el sistema listo para trabajar solo con los repos locales.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Ventajas de esta arquitectura
|
||||||
|
|
||||||
|
* **Seguridad**: los clientes nunca salen a internet, solo acceden al repo interno.
|
||||||
|
* **Control**: el mirror se actualiza de forma programada (p. ej. de madrugada). Siempre sabemos qué versiones están disponibles.
|
||||||
|
* **Simplicidad**: los clientes usan HTTP/HTTPS estándar; el Ingress se encarga del TLS si hace falta.
|
||||||
|
* **Integración con el diodo**: gracias a Samba, la carpeta puede replicarse unidireccionalmente hacia la red clasificada.
|
||||||
|
* **Verificación**: zypper siempre valida las firmas GPG de los paquetes, aunque se distribuyan por HTTP.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Sugerencias y mejoras
|
## Sugerencias y mejoras
|
||||||
|
|
||||||
* **Mejor rsync**: si eliges un mirror con `rsync://`, cambia las URLs de `download.opensuse.org` a ese mirror (ej. `rsync://<mirror>/opensuse/distribution/leap/15.6/repo/oss/`) para acelerar y reducir ancho de banda (usa `--delete`).
|
* Usar **mirrors oficiales con rsync** para ahorrar ancho de banda y tiempo de sincronización.
|
||||||
* **Throttle nocturno**: añade `--bwlimit=MB` a `rsync` si tu ventana noc
|
* Añadir `--bwlimit` en el `sync.sh` si queremos limitar consumo nocturno de ancho de banda.
|
||||||
|
* Sustituir `httpd` por `nginx` si se busca mayor rendimiento en descargas masivas.
|
||||||
|
* Proteger el Ingress con autenticación si se expone fuera de la red de confianza.
|
||||||
|
* Mantener el **script de cliente** actualizado para simplificar el alta de repos en todos los servidores SUSE.
|
||||||
|
|||||||
Reference in New Issue
Block a user