Skip to content

Minio - Objektspeicher selbst gehostet

Linux
  • Ich hatte mal bei Hetzner, den S3 Objekt-Speicher ausprobiert, aber da ließen sich die Benutzerrechte nicht so einstellen, wie ich mir das vorstellte. Eine Recherche im Hetzner Forum ergab, das diese Funktion wohl noch Baustelle ist. Somit habe ich mich davon verabschiedet. Da ich das Thema sehr spannend fand und es von Restic auch so unterstützt wird, sperrte ich meine Ohren auf. Irgendwann fiel dann bei einem Gespräch, das Wort Minio. So fing es an....

    Installation

    So installierte ich das mal auf eine Hetzner VM, ein Debian 12 Bookworm. Dazu ein Letsencrypt Zertifikat und der Spaß konnte beginnen. Aber, am Anfang hatte ich doch einige Probleme, das vernünftig ans Laufen zu bekommen.

    SystemD

    /lib/systemd/system/minio.service

    [Unit]
    Description=MinIO
    Documentation=https://docs.min.io
    Wants=network-online.target
    After=network-online.target
    AssertFileIsExecutable=/usr/local/bin/minio
    
    [Service]
    Type=notify
    
    WorkingDirectory=/usr/local
    
    User=minio-user
    Group=minio-user
    ProtectProc=invisible
    
    EnvironmentFile=-/etc/default/minio
    ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES
    
    # Let systemd restart this service always
    Restart=always
    
    # Specifies the maximum file descriptor number that can be opened by this process
    LimitNOFILE=1048576
    
    # Turn-off memory accounting by systemd, which is buggy.
    MemoryAccounting=no
    
    # Specifies the maximum number of threads this process can create
    TasksMax=infinity
    
    # Disable timeout logic and wait until process is stopped
    TimeoutSec=infinity
    
    # Disable killing of MinIO by the kernel's OOM killer
    OOMScoreAdjust=-1000
    
    SendSIGKILL=no
    
    [Install]
    WantedBy=multi-user.target
    
    # Built for ${project.name}-${project.version} (${project.name})
    

    Mini ENV File

    Die Startparameter von Minio werden über /etc/default/minio gesteuert.

    MINIO_ROOT_USER=<USER>
    MINIO_ROOT_PASSWORD=<PASSWORD>
    
    MINIO_VOLUMES=/mnt/HC_Volume_XXXXXXXXXX/
    
    MINIO_OPTS="--address :9000 --console-address :9001 --certs-dir /home/minio/certs"
    
    MINIO_BROWSER_REDIRECT_URL=https://<DOMAIN>/minio/ui
    

    NGINX

    Das war mein Sorgenkind, doch am Ende hatte ich es hinbekommen.

    ## Upstream Block
    # API
    upstream minio_s3 {
       least_conn;
       server <DOMAIN>:9000;
    }
    
    # Webinterface
    upstream minio_console {
       least_conn;
       server <DOMAIN>:9001;
    }
    
    ## Server Block
    server {
       listen       443 ssl;
       listen  [::]:443 ssl;
       server_name  <DOMAIN>;
    
       # SSL configuration
       ssl_certificate /home/minio/certs/public.crt;
       ssl_certificate_key /home/minio/certs/private.key;
       ssl_dhparam /home/minio/certs/dhparam.pem;
    
       ssl_protocols TLSv1.3;
       ssl_prefer_server_ciphers on;
       ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
    
       # 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;
    
    # WebSocket-Verbindungen
    location /ws/ {
        proxy_pass http://localhost:9001/ws/;
        proxy_http_version 1.1;
        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_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_buffering off;
    }
    
    # API      
    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 https://minio_s3; # This uses the upstream directive definition to load balance
       }
    
    # Webinterface
    location /minio/ui/ {
       rewrite ^/minio/ui/(.*) /$1 break;
       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_set_header X-NginX-Proxy true;
       proxy_connect_timeout 300;
       proxy_http_version 1.1;
       proxy_set_header Upgrade $http_upgrade;
       proxy_set_header Connection "upgrade";
       chunked_transfer_encoding off;
       proxy_pass https://minio_console;
       }
    }
    

    1505926c-57d4-45d7-974d-f66360dc3b3c-grafik.png

    Speicher

    Hetzner Objektspeicher hat da kostenmäßig deutlich die Nase vorne. Das was ich jetzt hier mache, ist deutlich teurer. Aber, dafür habe ich die volle Kontrolle. Ok, fast 🙂 Ich lege da aber sowieso nur Restic Backups ab, da kann keiner was mit anfangen (AES256 verschlüsselt). Ich hänge an die Hetzner VM ein 100GB Volume an.

    /etc/fstab

    /dev/disk/by-id/scsi-0HC_Volume_xxxxxxxxxx /mnt/HC_Volume_xxxxxxxxxxxx xfs discard,nofail,defaults 0 0
    

    XFS, weil es in der Minio Dokumentation empfohlen wird.

    Die Kosten, mit 100GB Volume und CX22 VM, liegen bei ca. 9€ im Monat.

    Viel Spaß beim Spielen 😉