Harbor - Backup / Restore#
Cette page décrit la procédure pour sauvegarder et restaurer la partie S3 & RDS d'Harbor.
RDS#
La base va permettre de stocker les métadonnées/configurations d'Harbor, comme les projets, les utilisateurs, les rôles, les politiques de réplication, le chemin des images, etc. Sans le RDS, Harbor ne sera pas capable de récupérer les images stockées dans le S3.
Prérequis#
Il faut installer l'outil postgres localement via nix-shell :
nix-env -iA nixpkgs.postgresql_13
Exporter les variables#
export ZONE="<ZONE>"
export INFRA_ZONE="<INFRA_ZONE>"
export DUMP_FILE="$(date +%F)_${ZONE}.sql"
# Export RDS password
export VAULT_ADDR="https://vault.${INFRA_ZONE}.caascad.com"
vault token lookup || vault login -method oidc
export PGPASSWORD="$(vault read -field=password secret/zones/fe/${ZONE}/rds14/harbor-${ZONE}-registry/db)"
# Export RDS ip
export ADDR_TARGET="$(vault read -field=private_ip secret/zones/fe/${ZONE}/rds14/harbor-${ZONE}-registry/db)"
Connexion vers l'instance RDS#
Pour créer la connexion vers le RDS, il faut passer par le bastion via un tunnel SSH :
# Tunneling from bastion to RDS instance
ssh -f -N -L "65432:${ADDR_TARGET}:5432" "cloud@bst.admin-stg.csfpriv.com"
# Tunneling from bastion to RDS instance
ssh -f -N -L "65432:${ADDR_TARGET}:5432" "cloud@bst.admin-prd.cloudservicesfactory.com"
Dump#
# Dump source database
cd <backup_dir>
pg_dump -h 127.0.0.1 -p 65432 -c -O --if-exists -x -U "harbor-${ZONE}-registry" "harbor-${ZONE}-registry" > "${DUMP_FILE}"
# Check
head -n 2 "${DUMP_FILE}"; tail -n 3 "${DUMP_FILE}"
# Should return:
# --
# -- PostgreSQL database dump
# -- PostgreSQL database dump complete
# --
#
Restore#
# Load to target database
cd <backup_dir>
psql -h 127.0.0.1 -p 65432 -U "harbor-${ZONE}-registry" "harbor-${ZONE}-registry" -f "${DUMP_FILE}"
Warning
Si l'instance RDS ou la base d'Harbor a été détruite, il faut impérativement redéployer Harbor via le processus d'installation car le mot de passe de la base aura changé.
Warning
Il ne faut pas prendre en compte les erreurs ci-dessous lors de la restauration :
- must be owner of function ...
- function X already exists with same argument types
S3#
Le S3 permet simplement de stocker les images.
Prérequis#
Il faut installer le client awscli :
toolbox install awscli
Exporter les variables#
Les variables AWS_SECRET_ACCESS_KEY & AWS_ACCESS_KEY_ID vont permettre de configurer awscli.
export ZONE="<ZONE>"
export INFRA_ZONE="<INFRA_ZONE>"
export VAULT_ADDR="https://vault.${INFRA_ZONE}.caascad.com"
vault token lookup || vault login -method oidc
export AWS_SECRET_ACCESS_KEY="$(vault read -field=secret_key secret/zones/fe/${ZONE}/buckets/harbor-${ZONE}-storage)"
export AWS_ACCESS_KEY_ID="$(vault read -field=access_key secret/zones/fe/${ZONE}/buckets/harbor-${ZONE}-storage)"
export ENDPOINT_URL="$(vault read -field=endpoint_url secret/zones/fe/${ZONE}/buckets/harbor-${ZONE}-storage)"
export BUCKET_NAME="$(vault read -field=bucket_name secret/zones/fe/${ZONE}/buckets/harbor-${ZONE}-storage)"
Backup#
aws s3 --endpoint-url ${ENDPOINT_URL} cp --recursive s3://${BUCKET_NAME}/docker harbor
Restore#
aws s3 --endpoint-url ${ENDPOINT_URL} cp --recursive harbor s3://${BUCKET_NAME}/docker
Données supprimées manuellement (blobs)#
Dans ce scénario, on ne peut plus push/pull une image. Il faut impérativement restorer le S3. Dans le cas où il n'y a pas de backup, il faut exécuter le GC (Garbage Collection) pour rendre de nouveau opérationnel Harbor.
Warning
Les images seront perdues, il faut les repusher.
