
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! 🔥