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