Limpieza de Espacio en el Social - Alojamiento S3

Hola,

Documento aquí el proceso de instalación y configuración de MinIO y la migración de los ficheros.


Recursos consultados

https://min.io/docs/minio/linux/operations/network-encryption.html

Instalación de MinIO

Tras crear un nuevo VPS y actualizarlo a la versión de Ubuntu 22.04, instalo MinIO:

wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio_20240326221045.0.0_amd64.deb -O minio.deb
sudo dpkg -i minio.deb

Creación de un usuario específico:

sudo groupadd -r minio-user
sudo useradd -M -r -g minio-user minio-user

Creación de la ubicación de los ficheros:

sudo vim /etc/default/minio
sudo mkdir /opt/s3.social
sudo chown minio-user:minio-user /opt/s3.social

Edito el fichero de configuración de minio para incorporar esta última ubicación:

sudo vim /etc/default/minio

Inicio del servicio de minio para que se ejecute cada vez que se encienda el servidor:

sudo systemctl start minio.service 
sudo journalctl -f -u minio.service
sudo systemctl enable minio.service

Instalación y configuración de Nginx:

sudo apt install nginx
sudo vim /etc/nginx/sites-available/minio

Fichero nginx:

upstream minio {
    server 127.0.0.1:9000;
}

server {
    listen 80;
    listen [::]:80;

    # regex: Make bucket subdomains work
    server_name ~^([^.]+).s3.anartist.org s3.anartist.org;

    # Allow special characters in headers
    ignore_invalid_headers off;
    # Allow any size file to be uploaded.
    # Set to a value such as 1000m; to restrict file size to a specific value
    client_max_body_size 0;
    # Disable buffering
    proxy_buffering off;
    proxy_request_buffering off;

    location / {
        proxy_set_header Host $http_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_connect_timeout 300;
        # Default is HTTP/1, keepalive is only enabled in HTTP/1.1
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        chunked_transfer_encoding off;

        proxy_pass http://minio; # This uses the upstream directive definition to load balance
    }
}
sudo ln -s /etc/nginx/sites-available/minio /etc/nginx/sites-enabled/
sudo rm /etc/nginx/sites-enabled/default

Instalación de certificado de Let’s Encrypt:

sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d s3.anartist.org

Creación de Bucket para el social

Accedo al panel a través de http://95.217.142.136:9001.
Creo un Bucket con el nombre socialdata.
Configuro la access policy a custom con el siguiente código:

{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Effect": "Allow",
         "Principal": {
           "AWS": "*"
         },
         "Action": "s3:GetObject",
         "Resource": "arn:aws:s3:::socialdata/*"
      }
   ]
}

Creación de mastodon-readwrite policy

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::socialdata/*"
        }
    ]
}

Creación de usuario mastodon y asignación de política mastodon-readwrite. `

Creación de un Acceso API a través del panel con los siguientes permisos:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::socialdata"
            ]
            },
        {
            "Effect": "Allow",
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "arn:aws:s3:::socialdata/*"
            ]
        }
    ]
}`

Migración de los datos de Amazon a MinIO

Para ello voy a usar la herramienta rclone:

sudo apt install rclone
rclone config

Esto genera el fichero .config/rclone/rclone.conf

[amazon]
type = s3
provider = Amazon
env_auth = false
access_key_id = XXXXXXXXX
secret_access_key = XXXXXXXXX
region = eu-central-1
endpoint = s3-eu-central-1.amazonaws.com
acl = public-read
storage_class = STANDARD

[minio]
type = s3
provider = Minio
env_auth = false
access_key_id = XXXXXXXXX
secret_access_key = XXXXXXXXX
region = eu-central-1
endpoint = https://s3.anartist.org
acl = public-read

Con esto ya puedo copiar los ficheros del s3 de Amazon al de MinIO:

rclone copy --progress --transfers=8 amazon:anartist2/custom_emojis/ minio:socialdata/custom_emojis/
rclone copy --progress --transfers=8 amazon:anartist2/accounts/ minio:socialdata/accounts/
rclone copy --progress --transfers=8 amazon:anartist2/site_uploads/ minio:socialdata/site_uploads/
rclone copy --progress --transfers=8 amazon:anartist2/media_attachments/ minio:socialdata/media_attachments/
rclone copy --progress --transfers=8 amazon:anartist2/imports/ minio:socialdata/imports/
rclone copy --progress --transfers=8 amazon:anartist2/cache/accounts/ minio:socialdata/cache/accounts/
rclone copy --progress --transfers=8 amazon:anartist2/cache/custom_emojis/ minio:socialdata/cache/custom_emojis/
rclone copy --progress --transfers=8 amazon:anartist2/cache/preview_cards/ minio:socialdata/cache/preview_cards/
rclone copy --progress --transfers=8 amazon:anartist2/cache/media_attachments/ minio:socialdata/cache/media_attachments/

Esto tarda mucho, lo que hace que durante la transferencia se publique alguna imagen que no sea transferida. Por suerte no son muchas y no es muy grave.

Finalmente, hace falta cambiar la configuración del fichero .env.production de mastodon (hago una copia antes de modificarlo) cambiando la parte de S3:

S3_ENABLED=true
S3_BUCKET=socialdata
AWS_ACCESS_KEY_ID=XXXXXXXX
AWS_SECRET_ACCESS_KEY=XXXXXXXX
S3_REGION=eu-central-1
S3_PROTOCOL=https
S3_HOSTNAME=s3.anartist.org
S3_ENDPOINT=https://s3.anartist.org

Y reinicio los servicios de mastodon:

sudo systemctl restart mastodon-sidekiq
sudo systemctl reload mastodon-web
sudo systemctl restart mastodon-streaming
2 Me gusta