Compare commits

...

8 Commits

Author SHA1 Message Date
aa976406e4 a ver 2025-09-04 23:20:28 +02:00
11da827e52 configurado external, dynu-updater, repo y coredns con cariño 2025-09-04 23:19:05 +02:00
23c556938b añadido script clientes 2025-09-04 00:39:48 +02:00
3bfbd99958 Actualizar readme.md 2025-09-03 22:23:46 +00:00
1d06b6bb37 Actualizar readme.md 2025-09-03 22:20:29 +00:00
612b808259 Actualizar readme.md 2025-09-03 22:19:32 +00:00
9991f318fc Actualizar readme.md 2025-09-03 22:19:00 +00:00
acc0b0bb79 Actualizar readme.md 2025-09-03 22:18:06 +00:00
9 changed files with 312 additions and 67 deletions

View File

@@ -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
} }

View 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

View File

@@ -1,3 +1,4 @@
resources: resources:
- harbor-regcred.yaml
- namespace.yaml - namespace.yaml
- cronjob.yaml - cronjob.yaml

View File

@@ -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;
} }
} }

View File

@@ -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:

View File

@@ -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) | |
--- ---

View File

@@ -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 ====="

View 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")"

View File

@@ -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 300GB 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.