Jak skonfigurować hosting S3 na własnym serwerze

Wstęp

W tym przewodniku pokażę, jak w prosty i tani sposób utworzyć hosting S3 na własnym serwerze. 🖥️
Wykorzystamy aplikację MinIO na VPS-ie. Możesz wybrać dowolnego dostawcę, który odpowiada Twoim potrzebom (np. Hetzner, AWS, Azure lub OVH).
Ja osobiście używam taniego VPS-a z Ubuntu 1 GB RAM od mikr.us. Z dodatkowym dyskiem twardym mój całkowity koszt wynosi 110 PLN rocznie (około 26,5 USD).

VPS Hardening

Przed rozpoczęciem konfiguracji polecam przeprowadzenie wstępnej konfiguracji nowego serwera VPS. Obejmuje to ustawienie rekordu A w strefie DNS, konfigurację hasła root, utworzenie nowego użytkownika oraz wyłączenie logowania przez SSH na hasło. Proces ten, znany jako VPS Hardening 🪪, znacznie zwiększa bezpieczeństwo serwera. W sieci znajdziesz wiele zasobów na ten temat, więc zachęcam do poszukania informacji.

Zaczynajmy! 🔥

Utworzenie użytkownika i grupy dla MinIO

Dla bezpieczeństwa i izolacji usług stworzymy dedykowanego użytkownika i grupę dla MinIO. Dzięki temu aplikacja nie będzie działać na koncie root. 🛂

Wykonaj następujące komendy na serwerze Ubuntu:

sudo groupadd minio
sudo useradd -r -g minio -s /usr/sbin/nologin minio

Ten użytkownik będzie później odpowiedzialny za uruchamianie usługi MinIO, co zapewni minimalne uprawnienia zgodnie z najlepszymi praktykami bezpieczeństwa.

Tworzenie katalogu do przechowywania danych MinIO i nadawanie uprawnień

Następnie musimy utworzyć dedykowany katalog na dane MinIO i przypisać odpowiednie uprawnienia, aby użytkownik MinIO miał pełną kontrolę nad tym katalogiem. 📂

Uruchom poniższe polecenia na serwerze Ubuntu:

sudo mkdir -p /storage/minio
sudo chown minio:minio /storage/minio
sudo chmod 750 /storage/minio

Konfiguracja MinIO i pobieranie binariów MinIO

Po utworzeniu katalogu do przechowywania danych, kolejnym krokiem jest utworzenie folderu danych w jego wnętrzu oraz pobranie binariów MinIO. To przygotuje środowisko do uruchomienia usługi MinIO. ☁️

Wykonaj następujące polecenia, aby kontynuować:

sudo mkdir -p /storage/minio/data
cd /storage/minio
sudo wget https://dl.min.io/server/minio/release/linux-amd64/minio
sudo chown -R minio:minio /storage/minio
sudo chmod 750 /storage/minio
sudo chmod +x /storage/minio/minio
sudo chown -R minio:minio /storage/minio/data
sudo chmod u+rxw /storage/minio/data

Tworzenie i konfigurowanie usługi systemd dla MinIO

Aby MinIO uruchamiało się automatycznie i działało jako zarządzana usługa, stworzymy nową usługę systemd. Usługa ta uruchomi MinIO z niezbędnymi zmiennymi środowiskowymi dla API, CLI i konsoli internetowej. 🛠️

Krok 1: Tworzenie pliku usługi systemd

Najpierw uruchom polecenie: sudo nano /etc/systemd/system/minio.service
i dodaj następującą konfigurację do pliku:

[Unit]
Description=MinIO Object Storage
After=network.target

[Service]
User=minio
Group=minio
ExecStart=/storage/minio/minio server /storage/minio/data \
  --address :9000 \
  --console-address :40288
Environment="MINIO_ROOT_USER=admin"
Environment="MINIO_ROOT_PASSWORD=strongpassword123"
Restart=always
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

ExecStart – Uruchamia MinIO z określoną ścieżką do przechowywania danych i wiąże API/CLI z portem 9000, a konsolę internetową z portem 40288. W moim przypadku używam portów TCP skonfigurowanych w panelu mikr.us.
Environment – Definiuje użytkownika root i hasło dla MinIO. Zastąp admin oraz strongpassword123 bezpiecznymi danymi logowania.
Restart=always – Zapewnia ponowne uruchomienie MinIO w przypadku awarii lub restartu serwera.

Krok 2: Włączanie i uruchamianie usługi MinIO ▶️

Zapisz i zamknij plik, a następnie przeładuj demona systemd, aby zastosować zmiany:

sudo systemctl daemon-reload
sudo systemctl enable minio
sudo systemctl start minio


Krok 3: Weryfikacja statusu usługi i logów 🔍

Aby upewnić się, że MinIO działa poprawnie, sprawdź jego status i przejrzyj logi:

sudo systemctl status minio
sudo journalctl -u minio

W tym momencie MinIO powinno być dostępne przez API pod adresem http://<adres-IP-serwera>:9000 oraz przez konsolę internetową pod adresem http://<adres-IP-serwera>:44935.

Tworzenie bucketu i klucza dostępu

Ostatnim krokiem jest stworzenie bucketu i wygenerowanie klucza dostępu. Przejdź do panelu “Buckets” i kliknij “Create Bucket”. Nazwę swój bucket tutorial-bucket. 🪣

Teraz utwórz nowy klucz dostępu. Otwórz panel „Access Keys” i kliknij “Create Access Key”. Nazwę go tutorial-bucket-rw, wskazując, że klucz ma prawa odczytu i zapisu dla bucketu tutorial-bucket. 🔑

Pamiętaj, aby zapisać sekret w bezpiecznym miejscu, ponieważ nie będzie można go później wyświetlić.

Ostatecznym krokiem konfiguracji jest przypisanie odpowiednich uprawnień do naszego klucza dostępu. 🛂

Kliknij ikonę ołówka obok nowego klucza i wklej następujący tekst w polu “Access Key Policy”:

{
 "Version": "2012-10-17",
 "Statement": [
  {
   "Effect": "Allow",
   "Action": [
    "s3:DeleteObject",
    "s3:GetObject",
    "s3:ListBucket",
    "s3:PutObject"
   ],
   "Resource": [
    "arn:aws:s3:::tutorial-bucket/*"
   ]
  }
 ]
}

Dzięki temu klucz otrzyma uprawnienia do listowania, odczytu, zapisu i usuwania obiektów w ramach tutorial-bucket, co zapewni pełny dostęp do zarządzania zawartością.

Na potrzeby testów skonfigurowałem jedną z wtyczek WordPressa, aby przesyłała kopie zapasowe do naszego nowego bucketu S3. Jak widać, wprowadziłem dane logowania oraz wyłączyłem weryfikację SSL w ustawieniach wtyczki.

Wszystko działa poprawnie. ✅

Konfiguracja SSL dla MinIO za pomocą Certbota i automatycznej synchronizacji certyfikatów

Aby zapewnić podstawowe standardy bezpieczeństwa, musimy skonfigurować SSL dla naszej instancji MinIO 🛜. Osiągniemy to za pomocą Certbota oraz stworzenia usługi, która automatycznie synchronizuje certyfikaty do odpowiedniego katalogu.

Krok 1: Konfiguracja Certbota

Najpierw skonfiguruj Certbota. Nie będę powielać dostępnych informacji, więc po prostu postępuj zgodnie z poniższym przewodnikiem:
🔗 How to Acquire a Let’s Encrypt Certificate Using DNS Validation with ACME-DNS and Certbot on Ubuntu 18.04

Po uruchomieniu polecenia:

sudo certbot certonly --manual --manual-auth-hook /etc/letsencrypt/acme-dns-auth.py --preferred-challenges dns --debug-challenges -d <YOUR_DOMAIN>

Certyfikaty privkey.pem i cert.pem zostaną wygenerowane w katalogu: /etc/letsencrypt/live/<YOUR_DOMAIN>/

Krok 2: Tworzenie usługi 🛠️

Gdy to zrobisz, możemy przystąpić do tworzenia naszej usługi. Utwórz nowy katalog za pomocą następujących poleceń:

sudo mkdir -p /home/minio/.minio/certs
sudo chown -R minio:minio /home/minio
sudo chmod u+rxw -R /home/minio

Następnie stwórz plik skryptu w sudo nano /usr/local/bin/minio_sync_certs.sh z następującą zawartością (pamiętaj, aby zastąpić `<YOUR_DOMAIN>`):

#!/bin/bash

CERT_SRC="/etc/letsencrypt/live/<YOUR_DOMAIN>/fullchain.pem"
KEY_SRC="/etc/letsencrypt/live/<YOUR_DOMAIN>/privkey.pem"

CERT_DST="/home/minio/.minio/certs/public.crt"
KEY_DST="/home/minio/.minio/certs/private.key"

cp "$CERT_SRC" "$CERT_DST"
cp "$KEY_SRC" "$KEY_DST"

chmod 600 "$KEY_DST"
chmod 644 "$CERT_DST"
chown -R minio:minio "$KEY_DST"
chown -R minio:minio "$CERT_DST"

Teraz nadaj uprawnienia do wykonywania skryptu poleceniem sudo chmod +x /usr/local/bin/minio_sync_certs.sh

Po tym stwórz plik usługi w sudo nano /etc/systemd/system/minio-sync-certs.service z następującą zawartością:

[Unit]
Description=Sync Lets Encrypt certificate to MinIO directory
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/minio_sync_certs.sh

[Install]
WantedBy=multi-user.target

Krok 3: Tworzenie timera usługi ⌚

Następnie skonfiguruj timer, który zautomatyzuje synchronizację certyfikatów. Utwórz plik za pomocą polecenia: sudo nano /etc/systemd/system/minio-sync-certs.timer i wprowadź następującą zawartość:

[Unit]
Description=Timer to synchronize Let's Encrypt certificates

[Timer]
OnBootSec=1min
OnUnitActiveSec=12h
Persistent=true

[Install]
WantedBy=timers.target

Na koniec włącz i uruchom timer:

sudo systemctl daemon-reload
sudo systemctl enable minio-sync-certs.timer
sudo systemctl start minio-sync-certs.timer

Teraz, gdy wykonamy polecenie: systemctl restart minio, powinniśmy zauważyć, że czerwona kłódka w przeglądarce zniknęła, co oznacza, że nasze połączenie jest teraz bezpieczne i szyfrowane za pomocą TLS. 🎉🚀

Podsumowanie

Gratulacje! Udało Ci się skonfigurować bezpieczne i ekonomiczne rozwiązanie do przechowywania danych kompatybilne z S3 za pomocą MinIO. Od konfiguracji VPS po włączenie szyfrowania SSL. Dzięki gotowej instancji MinIO możesz teraz bez obaw korzystać z niej do kopii zapasowych, przechowywania multimediów lub innych potrzeb związanych z chmurą. Powodzenia w hostingu! 🔥

Leave a Comment

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Scroll to Top