Apa yang Dibangun Ini
Dua mesin. Instance Ryzen menjalankan Nextcloud, PHP-FPM, Postgres, dan Redis, semuanya di NVMe Gen4 lokal, yang merupakan tempat kerja sensitif-latensi berada. Node penyimpanan di sampingnya menyimpan konten file yang sebenarnya dalam bucket objek, yang merupakan tempat penyimpanan terabyte murah. Di antara keduanya ada tunnel WireGuard, jadi tidak ada apa pun dalam pengaturan ini yang terekspos ke hal lain.
Pemisahan ini penting karena Nextcloud dengan penyimpanan objek primer berhenti menulis data pengguna ke disk lokal sepenuhnya. NVMe Anda menyimpan basis data dan kode; bucket menyimpan setiap byte yang diunggah siapa pun. Bertumbuh dari dua ratus gigabyte menjadi dua puluh terabyte kemudian menjadi peningkatan node penyimpanan daripada migrasi.
Sebelum Anda mulai
- R-8 untuk aplikasi dan S-50 untuk bucket, idealnya di kota yang sama sehingga round-trip tunnel di bawah satu milidetik.
- Tunnel di antara keduanya. Panduan WireGuard membangun ini dengan tepat; gunakan
10.9.0.1untuk aplikasi dan10.9.0.2untuk node penyimpanan. - Nama host yang menunjuk ke instance aplikasi,
cloud.example.comdi bawah.
1. Penyimpanan objek di node penyimpanan
MinIO adalah biner tunggal dan tidak memerlukan apa pun lagi. Ambil, verifikasi, dan instal:
cd /usr/local/bin
wget https://dl.min.io/server/minio/release/linux-amd64/minio
wget https://dl.min.io/server/minio/release/linux-amd64/minio.sha256sum
sha256sum -c minio.sha256sum
chmod +x minio
useradd -r -s /sbin/nologin minio
install -d -o minio -g minio /srv/objectsTingkat massal pada node penyimpanan dipasang terpisah dari NVMe. Letakkan bucket pada tingkat massal dan sisakan NVMe untuk cache tulis, yang memang fungsinya. Kemudian unit, di /etc/systemd/system/minio.service:
[Unit]
Description=MinIO
After=network-online.target [email protected]
Wants=network-online.target
[Service]
User=minio
Group=minio
Environment=MINIO_ROOT_USER=nextcloud
Environment=MINIO_ROOT_PASSWORD=<forty random characters>
ExecStart=/usr/local/bin/minio server /srv/objects --address 10.9.0.2:9000
Restart=always
LimitNOFILE=65535
NoNewPrivileges=yes
ProtectSystem=strict
ReadWritePaths=/srv/objects
[Install]
WantedBy=multi-user.targetMengikat ke alamat tunnel daripada ke semua antarmuka adalah baris yang penting. Penyimpanan objek tidak seharusnya menjawab pada antarmuka publik, dan dengan cara ini kesalahan firewall tidak dapat mengeksposnya.
systemctl daemon-reload && systemctl enable --now minio
ss -ltn | grep 90002. Host aplikasi: paket
Pada instance Ryzen:
apt update && apt install -y nginx postgresql redis-server unzip \
php8.4-fpm php8.4-pgsql php8.4-gd php8.4-curl php8.4-zip php8.4-xml \
php8.4-mbstring php8.4-intl php8.4-bcmath php8.4-gmp php8.4-imagick \
php8.4-redis php8.4-apcu3. Basis data
sudo -u postgres psql -c "CREATE USER nextcloud WITH PASSWORD '<a long password>';"
sudo -u postgres psql -c "CREATE DATABASE nextcloud OWNER nextcloud TEMPLATE template0 ENCODING UTF8;"Pengaturan Postgres default sudah baik pada skala ini. Jika Nextcloud ini akhirnya melayani beberapa ratus orang, panduan tuning Postgres berlaku dan angka-angka di dalamnya layak untuk satu jam.
4. Nextcloud, dikonfigurasi sebelum instalasi
cd /var/www
wget https://download.nextcloud.com/server/releases/latest.zip
unzip -q latest.zip && rm latest.zip
chown -R www-data:www-data /var/www/nextcloudSekarang bagian yang harus terjadi sebelum installer berjalan, karena penyimpanan objek primer tidak dapat ditambahkan ke instance yang sudah ada tanpa memindahkan setiap file secara manual. Buat /var/www/nextcloud/config/config.php:
<?php
$CONFIG = array(
"objectstore" => array(
"class" => "\\OC\\Files\\ObjectStore\\S3",
"arguments" => array(
"bucket" => "nextcloud",
"autocreate" => true,
"key" => "nextcloud",
"secret" => "<the same forty characters>",
"hostname" => "10.9.0.2",
"port" => 9000,
"use_ssl" => false,
"use_path_style" => true,
"region" => "local",
),
),
);use_ssl sengaja false. Lalu lintas melintasi tunnel WireGuard yang sudah terautentikasi dan terenkripsi, dan mengakhiri TLS untuk kedua kalinya pada node penyimpanan tidak membeli apa pun kecuali siklus CPU dan sertifikat yang lupa diperbarui. Jika kedua mesin pernah berada di kota yang berbeda, aktifkan.
chown www-data:www-data /var/www/nextcloud/config/config.php
chmod 640 /var/www/nextcloud/config/config.php
cd /var/www/nextcloud
sudo -u www-data php occ maintenance:install --database pgsql \
--database-name nextcloud --database-user nextcloud \
--database-pass "<a long password>" \
--admin-user admin --admin-pass "<another long password>"5. Cache, cron, dan pengaturan terakhir
sudo -u www-data php occ config:system:set memcache.local --value "\\OC\\Memcache\\APCu"
sudo -u www-data php occ config:system:set memcache.distributed --value "\\OC\\Memcache\\Redis"
sudo -u www-data php occ config:system:set memcache.locking --value "\\OC\\Memcache\\Redis"
sudo -u www-data php occ config:system:set redis host --value /run/redis/redis-server.sock
sudo -u www-data php occ config:system:set redis port --value 0
sudo -u www-data php occ config:system:set trusted_domains 0 --value cloud.example.com
sudo -u www-data php occ config:system:set overwrite.cli.url --value https://cloud.example.com
sudo -u www-data php occ background:cronRedis melalui unix socket daripada TCP menghemat round-trip syscall pada setiap operasi kunci, dan Nextcloud banyak mengambil kunci. Tambahkan www-data ke grup redis agar dapat menjangkau socket, lalu hubungkan pekerjaan latar ke timer:
usermod -aG redis www-data
systemctl restart php8.4-fpm redis-server
echo "*/5 * * * * php -f /var/www/nextcloud/cron.php" | crontab -u www-data -Default PHP-FPM mengasumsikan mesin yang digunakan bersama. Mesin Anda tidak dibagi, jadi di /etc/php/8.4/fpm/pool.d/www.conf atur pm = dynamic, pm.max_children = 60, pm.start_servers = 12, pm.min_spare_servers = 8, dan pm.max_spare_servers = 20, dan naikkan memory_limit ke 1G di /etc/php/8.4/fpm/php.ini. Unggahan menginginkan upload_max_filesize dan post_max_size pada 16G kecuali Anda menikmati menjelaskan mengapa video gagal pada sembilan puluh persen.
Verifikasi
Inti dari build ini adalah bahwa file pengguna tidak ada di server aplikasi. Buktikan itu, dalam tiga perintah.
sudo -u www-data php occ status
du -sh /var/www/nextcloud/dataStatus harus melaporkan terinstal dan tidak dalam mode pemeliharaan. Direktori data harus beberapa megabyte dan tetap seperti itu selamanya; direktori itu menyimpan log dan tidak ada yang lain setelah penyimpanan objek menjadi primer.
Sekarang unggah sesuatu dan lihat di mana ia berakhir:
head -c 50M /dev/urandom > /tmp/test.bin
curl -u admin -T /tmp/test.bin https://cloud.example.com/remote.php/dav/files/admin/test.bin
du -sh /var/www/nextcloud/dataUnggahan berhasil, dan direktori data tidak bertambah lima puluh megabyte. Pada node penyimpanan, objek terlihat langsung:
ls -R /srv/objects/nextcloud | tail -5
du -sh /srv/objects/nextcloudObjek diberi nama urn:oid: diikuti dengan id file, itulah sebabnya bucket bukan salinan yang dapat dijelajahi dari folder pengguna dan mengapa Anda mencadangkan basis data dan bucket bersama-sama atau tidak sama sekali.
Setelahnya
Ambil add-on cadangan off-node untuk dump Postgres dan bucket, atau jalankan sendiri ke situs ketiga. Bucket tanpa basis datanya adalah tumpukan blob bernomor, dan basis data tanpa bucketnya adalah indeks file yang tidak ada lagi. Kehilangan salah satunya berarti kehilangan keduanya.