

Przez prawie 3 lata moja strona bez zarzutów działała na Ubuntu Server 20.04 LTS. Firma Canonical 25 kwietnia 2024 roku wydała stabilną wersją Ubuntu Server 24.04 LTS i stwierdziłem, że jest to dobry moment, aby ustawić wszystko od zera na Ubuntu Server 22.04 LTS. 😜 Powodów tej decyzji było kilka:
Generalnie całość byłbym wstanie wykonać na Ubuntu 20.04 LTS, ale wolałem to już zrobić na nowszej wersji systemu. Pierwotnie na VPS działały dwie strony z dwoma dodatkowymi usługami dla agencji czyli phpmyadmin oraz FTP. W wersji "v2" postanowiłem postawić dodatkowe dwa systemy i jedną usługę, co w efekcie, mocno rozbudowało moją konfigurację:
Ustawienie tego wszystkiego, aby działało razem, zajęło mi trochę czasu i po drodze napotkałem kilka problemów - rozwiązanie niektórych zajęło mi parę dni jak np. ustawienie Wiki.js do działania poza Docker`em i dlaczego Wiki.js przestaje być dostępne po instalacji Invoice Ninja. 😂 Finalnie uporałem się z wszystkimi napotkanymi błędami i póki co działa to wszystko bardzo dobrze. 😎
Parametry sprzętowe w "v2" uległy polepszeniu - zamiast 1 rdzenia Intel Xeon serii Skylake są 2 rdzenie AMD EPYC 7002 (prawdopodobnie AMD EPYC 7H12 (830F10)) oraz podwojeniu uległa przestrzeń dyskowa. Obecne parametry to:
Wynik testy dd (maksymalna przepustowość sekwencyjna dysku oraz wydajność przy małych blokach (IOPS) + wpływ generowania losowych danych):
dd if=/dev/zero of=test bs=1M count=1024 conv=fdatasync oflag=direct
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 2.63816 s, 407 MB/s
dd if=/dev/urandom of=test bs=4k count=250000 conv=fdatasync oflag=direct
250000+0 records in
250000+0 records out
1024000000 bytes (1.0 GB, 977 MiB) copied, 59.5984 s, 17.2 MB/s
Wynik testu YABS`a:
# ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #
# Yet-Another-Bench-Script #
# v2024-06-09 #
# https://github.com/masonr/yet-another-bench-script #
# ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #
Tue Dec 3 05:45:32 PM CET 2024
Basic System Information:
---------------------------------
Uptime : 8 days, 48 hours, 0 minutes
Processor : AMD EPYC Processor
CPU cores : 2 @ 2495.312 MHz
AES-NI : ✔ Enabled
VM-x/AMD-V : ❌ Disabled
RAM : 1.9 GiB
Swap : 0.0 KiB
Disk : 37.5 GiB
Distro : Ubuntu 22.04.5 LTS
Kernel : 5.15.0-126-generic
VM Type : KVM
IPv4/IPv6 : ✔ Online / ✔ Online
IPv6 Network Information:
---------------------------------
ISP : Hetzner Online GmbH
ASN : AS24940 Hetzner Online GmbH
Host : Hetzner Online GmbH
Location : Helsinki, Uusimaa (18)
Country : Finland
fio Disk Speed Tests (Mixed R/W 50/50) (Partition /dev/sda1):
---------------------------------
Block Size | 4k (IOPS) | 64k (IOPS)
------ | --- ---- | ---- ----
Read | 110.23 MB/s (27.5k) | 1.16 GB/s (18.2k)
Write | 110.52 MB/s (27.6k) | 1.17 GB/s (18.3k)
Total | 220.76 MB/s (55.1k) | 2.34 GB/s (36.5k)
| |
Block Size | 512k (IOPS) | 1m (IOPS)
------ | --- ---- | ---- ----
Read | 1.18 GB/s (2.3k) | 1.27 GB/s (1.2k)
Write | 1.24 GB/s (2.4k) | 1.35 GB/s (1.3k)
Total | 2.42 GB/s (4.7k) | 2.62 GB/s (2.5k)
iperf3 Network Speed Tests (IPv4):
---------------------------------
Provider | Location (Link) | Send Speed | Recv Speed | Ping
----- | ----- | ---- | ---- | ----
Clouvider | London, UK (10G) | 1.07 Gbits/sec | 5.18 Gbits/sec | 38.4 ms
Eranium | Amsterdam, NL (100G) | 7.80 Gbits/sec | 7.10 Gbits/sec | 29.7 ms
Uztelecom | Tashkent, UZ (10G) | 1.07 Gbits/sec | busy | 61.0 ms
Leaseweb | Singapore, SG (10G) | 188 Mbits/sec | 987 Mbits/sec | 179 ms
Clouvider | Los Angeles, CA, US (10G) | 987 Mbits/sec | 1.06 Gbits/sec | 157 ms
Leaseweb | NYC, NY, US (10G) | 1.25 Gbits/sec | 1.91 Gbits/sec | 96.2 ms
Edgoo | Sao Paulo, BR (1G) | 600 Mbits/sec | 780 Mbits/sec | 218 ms
iperf3 Network Speed Tests (IPv6):
---------------------------------
Provider | Location (Link) | Send Speed | Recv Speed | Ping
----- | ----- | ---- | ---- | ----
Clouvider | London, UK (10G) | 3.04 Gbits/sec | 5.10 Gbits/sec | 37.2 ms
Eranium | Amsterdam, NL (100G) | 7.68 Gbits/sec | 7.09 Gbits/sec | 28.0 ms
Uztelecom | Tashkent, UZ (10G) | busy | 293 Mbits/sec | 60.9 ms
Leaseweb | Singapore, SG (10G) | 870 Mbits/sec | 978 Mbits/sec | 179 ms
Clouvider | Los Angeles, CA, US (10G) | 854 Mbits/sec | 1.13 Gbits/sec | 157 ms
Leaseweb | NYC, NY, US (10G) | 1.17 Gbits/sec | busy | 96.2 ms
Edgoo | Sao Paulo, BR (1G) | 818 Mbits/sec | 789 Mbits/sec | 216 ms
Geekbench 6 test failed. Run manually to determine cause.
YABS completed in 10 min 35 sec
Wynik testu PHP Benchmark Script:
-------------------------------------------------------
| PHP BENCHMARK SCRIPT v.2.0 by @SergiX44 |
-------------------------------------------------------
PHP............................................. 8.3.25
Platform......................................... Linux
Arch............................................ x86_64
Server.............................................. 95
Max memory usage.................................... -1
OPCache status................................ disabled
OPCache JIT....................... disabled/unavailable
PCRE JIT....................................... enabled
XDebug extension.............................. disabled
Difficulty multiplier............................... 1x
Started at..................... 06/10/2025 17:32:07.428
-------------------------------------------------------
math.......................................... 0.2137 s
loops......................................... 0.1220 s
ifelse........................................ 0.2696 s
switch........................................ 0.1754 s
string........................................ 0.2985 s
array......................................... 0.4438 s
regex......................................... 0.2818 s
is_{type}..................................... 0.2232 s
hash.......................................... 0.1249 s
json.......................................... 0.1925 s
-------------------------------------------------------
Total time.................................... 2.3454 s
Peak memory usage................................ 2 MiB
Wynik testu cyberfolks-dbSpeedTest (z moją małą poprawką):
+---------------------------------------------------------------+----------+--------+
| Typ operacji | Szybkość | Ocena |
+---------------------------------------------------------------+----------+--------+
| Wstawianie rekordów | 339/s | Dobra |
| Przykład: dodanie nowego artykułu, złożenie zamówienia, | | |
| rejestracja nowego klienta | | |
+---------------------------------------------------------------+----------+--------+
| Wyszukiwanie rekordu po kluczu głównym | 2410/s | Dobra |
| Przykład: znalezienie produktu po ID w e-commerce, | | |
| artykułu po ID w CMS | | |
+---------------------------------------------------------------+----------+--------+
| Wyszukiwanie nieindeksowanych rekordów całkowitych (dokładne) | 570/s | Dobra |
| Przykład: znalezienie wszystkich koszul w rozmiarze 40 | | |
+---------------------------------------------------------------+----------+--------+
| Wyszukiwanie tekstowe (ciąg 3 znaków w rekordach) | 97/s | Dobra |
| Przykład: znalezienie klientów, których imię zawiera 'art' | | |
+---------------------------------------------------------------+----------+--------+
| Wyszukiwanie nieindeksowanych rekordów tekstowych (dokładne) | 581/s | Dobra |
| Przykład: wyszukiwanie wszystkich przedmiotów | | |
| w danym kolorze | | |
+---------------------------------------------------------------+----------+--------+
| Selekcja rekordów z warunkiem: wartość_pola * 1.23 > losowa | 439/s | Słaba |
| Przykład: wyszukiwanie produktów większych niż... | | |
+---------------------------------------------------------------+----------+--------+
| Aktualizacja rekordów | 96/s | Dobra |
| Przykład: zmiana koloru wszystkich przedmiotów z zielonego | | |
| na niebieski | | |
+---------------------------------------------------------------+----------+--------+
Loguję się na VPS na konto root za pomocą wygenerowanego hasła, które od razu zmieniam na swoje własne. Następnie tworzę konto dla siebie i dodaję je do grupy sudo.
adduser nazwa_użytkownika
usermod -aG sudo nazwa_użytkownika
Przelogowuję się na swoje konto, a następnie:
sudo apt-get update && sudo apt-get upgrade -y && sudo apt-get dist-upgrade -y && sudo apt-get autoremove -y
sudo dpkg-reconfigure tzdata
sudo apt-get install apt-transport-https unzip -y
sudo wget https://7-zip.org/a/7z2407-linux-x64.tar.xz && sudo tar -xf 7z2407-linux-x64.tar.xz -C /usr/bin/ 7zz && sudo rm 7z2407-linux-x64.tar.xz
ssh-keygen -t ed25519 -o -a 100
touch .ssh/authorized_keys
cat .ssh/id_ed25519.pub >> .ssh/authorized_keys
rm .ssh/id_ed25519*
chmod 600 .ssh/authorized_keys
sudo nano /etc/ssh/sshd_config
[...]
#Include /etc/ssh/sshd_config.d/*.conf
[...]
Port numer_portu
[...]
PermitRootLogin no
[...]
PubkeyAuthentication yes
[...]
AuthorizedKeysFile .ssh/authorized_keys
[...]
PasswordAuthentication no
PermitEmptyPasswords no
[...]
ClientAliveInterval 300
ClientAliveCountMax 3
[...]
sudo ufw enable
sudo ufw allow from any to any port numer_portu proto tcp
sudo systemctl restart ssh
LC_ALL=C.UTF-8 sudo add-apt-repository ppa:ondrej/php
sudo apt-get install php8.3 -y
sudo apt-get install php8.3-{mysql,fpm,curl,mbstring,ldap,xml,zip,gd,gmp,tidy,imagick,bcmath,bz2,intl,soap,xmlrpc} -y
sudo mkdir /var/www/grzegorzwitait
sudo mv -f /home/nazwa_użytkownika/PLIKI/grzegorzwitait/{.,}* /var/www/grzegorzwitait/
sudo chown -R www-data:www-data /var/www/grzegorzwitait/
sudo find /var/www/grzegorzwitait/ -type d -exec chmod 755 {} \;
sudo find /var/www/grzegorzwitait/ -type f -exec chmod 644 {} \;
sudo find /var/www/grzegorzwitait/files/page_files/* -type d -exec chmod 775 {} \;
sudo find /var/www/grzegorzwitait/files/page_files/* -type f -exec chmod 664 {} \;
sudo find /var/www/grzegorzwitait/images/page_images/foto_* -type d -exec chmod 775 {} \;
sudo find /var/www/grzegorzwitait/images/page_images/foto_* -type f -exec chmod 664 {} \;
sudo nano /var/www/grzegorzwitait/database.php
sudo chmod 740 /var/www/grzegorzwitait/database.php
sudo chown root:www-data /var/www/grzegorzwitait/
sudo nano /etc/apache2/sites-available/grzegorzwitait.conf
<VirtualHost *:80>
ServerName grzegorzwita.it
ServerAdmin admin@grzegorzwita.it
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https [NC]
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,QSA,R=permanent]
</VirtualHost>
<IfModule mod_ssl.c>
SSLStaplingCache "shmcb:/var/log/ssl_stapling(150000)"
<VirtualHost *:443>
Protocols h2 http/1.1
ServerName grzegorzwita.it
ServerAdmin admin@grzegorzwita.it
DocumentRoot /var/www/grzegorzwitait/
DirectoryIndex index.php
Redirect permanent /statystyka https://grzegorzwita.it/statystyka.html
<Directory /var/www/grzegorzwitait/>
Options -Indexes -Includes +FollowSymLinks +MultiViews
AllowOverride all
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-XSS-Protection "1; mode=block"
Header always set X-Content-Type-Options "nosniff"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set Content-Security-Policy "form-action 'self'; base-uri 'self'; frame-ancestors 'self'; object-src 'none'; worker-src 'self'; child-src 'self'; frame-src 'self'; upgrade-insecure-requests"
SSLEngine on
SSLProtocol -all +TLSv1.2 +TLSv1.3
SSLCipherSuite EECDH+AESGCM:EDH+AESGCM
SSLOpenSSLConfCmd Curves X25519:secp521r1:secp384r1:prime256v1
SSLOpenSSLConfCmd Options -SessionTicket,ServerPreference
SSLHonorCipherOrder off
SSLSessionTickets off
SSLCompression off
SSLUseStapling on
SSLCertificateFile /etc/letsencrypt/live/grzegorzwita.it/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/grzegorzwita.it/privkey.pem
</VirtualHost>
</IfModule>
sudo chown root:root /etc/apache2/sites-available/grzegorzwitait.conf
sudo a2ensite grzegorzwitait.conf
sudo a2dissite 000-default.conf
sudo a2dismod php8.3 mpm_prefork
sudo a2enmod rewrite headers http2 mpm_event proxy_fcgi proxy_http ssl
sudo a2enconf php8.3-fpm
sudo sed -i "s/;date.timezone =/date.timezone = Europe\/Warsaw/" /etc/php/8.3/fpm/php.ini
sudo sed -i "s/memory_limit = 128M/memory_limit = 1024M/" /etc/php/8.3/fpm/php.ini
sudo sed -i "s/upload_max_filesize = 2M/upload_max_filesize = 6M/" /etc/php/8.3/fpm/php.ini
sudo sed -i "s/max_execution_time = 30/max_execution_time = 60/" /etc/php/8.3/fpm/php.ini
sudo sed -i "s/post_max_size = 8M/post_max_size = 16M/" /etc/php/8.3/fpm/php.ini
sudo sed -i "s/max_file_uploads = 20/max_file_uploads = 40/" /etc/php/8.3/fpm/php.ini
sudo systemctl restart php8.3-fpm.service
sudo ufw allow from any to any port 80,443 proto tcp
sudo apt-get install mysql-server -y
sudo mysql_secure_installation
sudo mysql -u root -p
CREATE DATABASE grzegorzwitait_dba;
CREATE USER 'grzegorzwitait_dba'@'localhost' IDENTIFIED WITH caching_sha2_password BY '8arDzo_Sk0mp1ikow4N3_Ha$LO!';
GRANT ALL ON grzegorzwitait_dba.* TO 'grzegorzwitait_dba'@'localhost';
FLUSH PRIVILEGES;
EXIT
sudo mysql -u root -p grzegorzwitait_dba < /home/nazwa_użytkownika/PLIKI/grzegorzwitait_*.sql
sudo apt-get install certbot python3-certbot-apache -y
sudo certbot certonly --manual --preferred-challenges=dns --email admin@grzegorzwita.it --server https://acme-v02.api.letsencrypt.org/directory --agree-tos -d "*.grzegorzwita.it, grzegorzwita.it"
sudo certbot certificates
sudo nano /root/letsencrypt_renew.sh
#!/bin/bash
sudo certbot certonly --manual --preferred-challenges=dns --email admin@grzegorzwita.it --server https://acme-v02.api.letsencrypt.org/directory --agree-tos -d "*.grzegorzwita.it, grzegorzwita.it"
sudo systemctl reload apache2
sudo chmod 740 /root/letsencrypt_renew.sh
sudo apache2ctl configtest
sudo systemctl restart apache2
sudo mysql -u root -p
CREATE DATABASE grzegorzwitait_pma;
CREATE USER 'grzegorzwitait_pma'@'localhost' IDENTIFIED WITH caching_sha2_password BY '8arDzo_Sk0mp1ikow4N3_Ha$LO!';
GRANT ALL ON grzegorzwitait_pma.* TO 'grzegorzwitait_pma'@'localhost';
GRANT ALL ON grzegorzwitait_dba.* TO 'grzegorzwitait_pma'@'localhost';
FLUSH PRIVILEGES;
UNINSTALL COMPONENT "file://component_validate_password";
EXIT
sudo apt-get install phpmyadmin -y
sudo mysql -u root -p
INSTALL COMPONENT "file://component_validate_password";
EXIT
sudo nano /etc/phpmyadmin/config.inc.php
[...]
/* User for advanced features */
$cfg['Servers'][$i]['controluser'] = 'grzegorzwitait_pma';
$cfg['Servers'][$i]['controlpass'] = '8arDzo_Sk0mp1ikow4N3_Ha$LO!';
[...]
sudo nano /etc/apache2/conf-available/phpmyadmin.conf
<Directory /usr/share/phpmyadmin>
[. . .]
AllowOverride All
[. . .]
</Directory>
sudo phpenmod mbstring
sudo systemctl restart apache2
grzegorzwita.it/phpmyadmin i loguję się danymi wprowadzonymi podczas konfiguracji. Po poprawnym zalogowaniu się zaznaczam odpowiednią bazę danych, a następnie w menu u samej góry klikam w Opcje.
sudo apt-get install vsftpd -y
sudo ufw delete allow from any to any port 20:21,40000:50000 proto tcp comment 'FTP'
sudo nano /etc/vsftpd.conf
[...]
listen=YES
[...]
listen_ipv6=NO
[...]
write_enable=YES
[...]
local_umask=022
[...]
chroot_local_user=YES
[...]
allow_writeable_chroot=YES
force_dot_files=YES
pasv_min_port=40000
pasv_max_port=50000
sudo systemctl restart vsftpd.service
sudo systemctl status vsftpd.service
sudo adduser --home /var/www/grzegorzwitait/ --ingroup www-data nazwa_uzytkownika
sudo find /var/www/grzegorzwitait/ -type d -exec chmod 775 {} \;
sudo find /var/www/grzegorzwitait/ -type f -exec chmod 664 {} \;
sudo apt-get install composer -y
sudo mkdir /var/www/BookStack
sudo mv -f /home/grzegorz_wita/PLIKI/BookStack/{.,}* /var/www/BookStack/
sudo chown -R www-data:www-data /var/www/BookStack/
sudo find /var/www/BookStack/ -type d -exec chmod 755 {} \;
sudo find /var/www/BookStack/ -type f -exec chmod 644 {} \;
sudo nano /var/www/BookStack/.env
sudo chmod 740 /var/www/BookStack/.env
sudo chmod 775 /var/www/BookStack/bootstrap/cache/ /var/www/BookStack/public/uploads/ /var/www/BookStack/storage/
sudo chown root:root /var/www/BookStack/
sudo chown -R root:root /var/www/BookStack/.git
sudo chown -R root:root /var/www/BookStack/.github
sudo mysql -u root -p
CREATE DATABASE bookstack;
CREATE USER 'bookstack_dba'@'localhost' IDENTIFIED WITH caching_sha2_password BY '8arDzo_Sk0mp1ikow4N3_Ha$LO!';
GRANT ALL ON bookstack.* TO 'bookstack_dba'@'localhost';
FLUSH PRIVILEGES;
EXIT
sudo mysql -u root -p bookstack < /home/grzegorz_wita/PLIKI/grzegorzwitait_*.sql
cd /var/www/BookStack/
sudo git reset --hard HEAD
sudo git pull origin release
sudo composer install --no-dev --no-plugins
sudo php artisan migrate && sudo php artisan cache:clear && sudo php artisan config:clear && sudo php artisan view:clear
sudo nano /etc/apache2/sites-available/bookstack.conf
<VirtualHost *:80>
ServerName zycie.grzegorzwita.it
ServerAdmin admin@grzegorzwita.it
Redirect / https://zycie.grzegorzwita.it
</VirtualHost>
<VirtualHost *:443>
ServerName zycie.grzegorzwita.it
ServerAdmin admin@grzegorzwita.it
DocumentRoot /var/www/BookStack/public/
<Directory /var/www/BookStack/public/>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews -Indexes
</IfModule>
RewriteEngine On
# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [L,R=301]
# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error_bookstack.log
CustomLog ${APACHE_LOG_DIR}/access_bookstack.log combined
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/grzegorzwita.it/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/grzegorzwita.it/privkey.pem
</VirtualHost>
sudo a2ensite bookstack.conf
cd /var/www/BookStack/ && sudo git pull origin release && sudo composer install --no-dev && sudo php artisan migrate && sudo php artisan cache:clear && sudo php artisan config:clear && sudo php artisan view:clear
sudo curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt-get install nodejs -y
sudo mkdir /var/www/Wikijs && cd /vaw/www/Wikijs
sudo wget https://github.com/Requarks/wiki/releases/latest/download/wiki-js.tar.gz
sudo tar xzf wiki-js.tar.gz
sudo rm wiki-js.tar.gz
sudo mysql -u root -p
CREATE DATABASE wikijs;
CREATE USER 'wikijs_dba'@'localhost' IDENTIFIED WITH caching_sha2_password BY '8arDzo_Sk0mp1ikow4N3_Ha$LO!';
GRANT ALL ON wikijs.* TO 'wikijs_dba'@'localhost';
FLUSH PRIVILEGES;
EXIT
sudo cp config.sample.yml config.yml
sudo nano config.yml
[...]
db:
type: mysql
#PostreSQL / MySQL / MariaDB / MS SQL Server only:
host: localhost
port: 3306
user: wikijs_dba
pass: 8arDzo_Sk0mp1ikow4N3_Ha$LO!
db: wikijs
ssl: false
[...]
sudo chown -R www-data:www-data /var/www/Wikijs/
sudo find /var/www/Wikijs/ -type d -exec chmod 755 {} \;
sudo find /var/www/Wikijs/ -type f -exec chmod 644 {} \;
sudo chmod 740 /var/www/Wikijs/config.yml
sudo chown root:root /var/www/Wikijs/
sudo nano /etc/systemd/system/wikijs.service
[Unit]
Description=Wiki.js
After=network.target
[Service]
Type=simple
ExecStart=/usr/bin/node server
Restart=always
User=root
Environment=NODE_ENV=production
WorkingDirectory=/var/www/Wikijs
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable wikijs
sudo systemctl start wikijs
sudo systemctl status wikijs
sudo nano /etc/apache2/sites-available/wikijs.conf
<VirtualHost *:80>
ServerName wiki.grzegorzwita.it
ServerAdmin admin@grzegorzwita.it
Redirect / https://wiki.grzegorzwita.it
</VirtualHost>
<VirtualHost *:443>
ServerName wiki.grzegorzwita.it
ServerAdmin admin@grzegorzwita.it
DocumentRoot /var/www/Wikijs/
ProxyPass / http://127.0.0.1:3000/
ProxyPassReverse / http://127.0.0.1:3000/
ErrorLog ${APACHE_LOG_DIR}/error_wikijs.log
CustomLog ${APACHE_LOG_DIR}/access_wikijs.log combined
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/grzegorzwita.it/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/grzegorzwita.it/privkey.pem
</VirtualHost>
sudo a2ensite wikijs.conf
sudo systemctl restart apache2
cd /var/www/Wikijs/ && sudo systemctl stop wikijs && sudo mv config.yml ~/config.yml && sudo rm -rf * && sudo wget https://github.com/Requarks/wiki/releases/latest/download/wiki-js.tar.gz && sudo tar xzf wiki-js.tar.gz && sudo rm wiki-js.tar.gz && sudo mv ~/config.yml ./config.yml && sudo chown -R www-data:www-data /var/www/Wikijs/ && sudo find /var/www/Wikijs/ -type d -exec chmod 755 {} \; && sudo find /var/www/Wikijs/ -type f -exec chmod 644 {} \; && sudo chown root:root /var/www/Wikijs/ && sudo chmod 740 /var/www/Wikijs/config.yml && sudo systemctl start wikijs
Przechodzę do przeglądarki na skonfigurowany adres i dokańczam konfigurację.
sudo mkdir /var/www/InvoiceNinja
sudo wget https://github.com/invoiceninja/invoiceninja/releases/download/v5.10.8/invoiceninja.tar
sudo tar xzf invoiceninja.tar -C /var/www/InvoiceNinja/
sudo rm invoiceninja.tar
sudo mysql -u root -p
CREATE DATABASE invoiceninja;
CREATE USER 'invoiceninja_dba'@'localhost' IDENTIFIED WITH caching_sha2_password BY '8arDzo_Sk0mp1ikow4N3_Ha$LO!';
GRANT ALL ON invoiceninja.* TO 'invoiceninja_dba'@'localhost';
FLUSH PRIVILEGES;
EXIT
sudo cp /var/www/InvoiceNinja/.env.example /var/www/InvoiceNinja/.env
sudo nano /var/www/InvoiceNinja/.env
[...]
DB_HOST=localhost
DB_DATABASE=invoiceninja
DB_USERNAME=invoiceninja_dba
DB_PASSWORD=8arDzo_Sk0mp1ikow4N3_Ha$LO!
DB_PORT=3306
[...]
PDF_GENERATOR=snappdf
[...]
PHANTOMJS_SECRET="8arDzo_Sk0mp1ikow4N3_Ha$LO!"
UPDATE_SECRET="8arDzo_Sk0mp1ikow4N3_Ha$LO!"
WEBCRON_SECRET="8arDzo_Sk0mp1ikow4N3_Ha$LO!"
[...]
EXPANDED_LOGGING=true
sudo chown -R www-data:www-data /var/www/InvoiceNinja/
sudo find /var/www/InvoiceNinja/ -type d -exec chmod 755 {} \;
sudo find /var/www/InvoiceNinja/ -type f -exec chmod 644 {} \;
sudo chmod 740 /var/www/InvoiceNinja/.env
sudo chown root:root /var/www/InvoiceNinja/
sudo nano /etc/apache2/sites-available/invoiceninja.conf
sudo chmod 744 /var/www/InvoiceNinja/vendor/bin/snappdf && sudo -u www-data /var/www/InvoiceNinja/vendor/bin/snappdf --force download && sudo chmod 644 /var/www/InvoiceNinja/vendor/bin/snappdf
sudo apt-get install fonts-liberation libasound2 libatk1.0-0 libatk-bridge2.0-0 libgbm1 libpango1.0-0 libxcomposite1 libxdamage1 libxfixes3 libxkbcommon0 libxrandr2 -y
sudo sed -i "s/127.0.0.1 localhost/127.0.0.1 localhost system.grzegorzwita.it/" /etc/hosts
sudo -u www-data crontab -e
[...]
#InvoiceNinja
#0 8 * * * php /var/www/InvoiceNinja/artisan ninja:send-recurring >> /dev/null
#0 8 * * * php /var/www/InvoiceNinja/artisan ninja:send-reminders >> /dev/null
* * * * * php /var/www/InvoiceNinja/artisan schedule:run >> /dev/null 2>&1
* * * * * php /var/www/InvoiceNinja/artisan optimize >> /dev/null 2>&1
cd /var/www/InvoiceNinja/
sudo -u www-data php artisan key:generate
sudo -u www-data php artisan migrate
sudo -u www-data php artisan optimize
sudo nano /etc/apache2/sites-available/invoiceninja.conf
<VirtualHost *:80>
ServerName system.grzegorzwita.it
ServerAdmin admin@grzegorzwita.it
Redirect / https://system.grzegorzwita.it
</VirtualHost>
<VirtualHost *:443>
ServerName system.grzegorzwita.it
ServerAdmin admin@grzegorzwita.it
DocumentRoot /var/www/InvoiceNinja/public/
<Directory /var/www/InvoiceNinja/public/>
DirectoryIndex index.php
Options +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error_invoiceninja.log
CustomLog ${APACHE_LOG_DIR}/access_invoiceninja.log combined
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/grzegorzwita.it/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/grzegorzwita.it/privkey.pem
</VirtualHost>
sudo a2ensite invoiceninja.conf
sudo systemctl restart apache2
sudo nano /root/goaccess.sh
sudo apt-get install goaccess -y
#!/bin/bash
goaccess /var/log/apache2/access.log -o /var/www/grzegorzwitait/statystyka.html --log-format=COMBINED --real-time-html --persist --restore --db-path /var/www/grzegorzwitait/tmp/ --real-os --all-static-files --ssl-cert=/etc/letsencrypt/live/grzegorzwita.it/fullchain.pem --ssl-key=/etc/letsencrypt/live/grzegorzwita.it/privkey.pem
sudo chmod 740 /root/goaccess.sh
sudo crontab -e
[...]
@reboot /root/goaccess.sh >> dev
sudo ufw allow from any to any port 7890 proto tcp
Zaktualizowałem swój pierwotny skrypt kopia_zapasowa.sh, aby wykonywał kopię głównej strony internetowej wraz z wszystkimi subdomenami oraz ich bazami danych.
Dodatkowo zmieniłem wcześniej wykorzystywany, a już nierozwijany pakiet p7zip-full (zawierający 7-Zip 16.04) na 7-Zip 24.07, który pobrałem bezpośrednio z oficjalnej strony projektu. Stary 7-Zip, dostępny w repozytoriach Ubuntu, działa cały czas, jednak doskwiera już mu wiek, co widać na nowszych procesorach, a taki mam teraz na VPS`ie. Napiszę tylko, że czas wykonania kopii zapasowej ponad 137 000 plików rozproszonych w ponad 17 000 folderów o łącznej wadze przekraczającej 2,6 GB (spakowany plik *.7z ma ok. 702 MB) zmniejszył się o 10 minut - z 27 do 17 minut w porównaniu ze starym pakietem.
mkdir /home/grzegorz_wita/backup
sudo nano /root/kopia_zapasowa.sh
#!/bin/bash
DATE=$(date +"%Y-%m-%d")
tar -caf - /var/www/grzegorzwitait -P | 7zz a -si /var/www/grzegorzwitait.tar.7z
tar -caf - /var/www/BookStack -P | 7zz a -si /var/www/BookStack.tar.7z
tar -caf - /var/www/Wikijs -P | 7zz a -si /var/www/Wikijs.tar.7z
tar -caf - /var/www/InvoiceNinja -P | 7zz a -si /var/www/InvoiceNinja.tar.7z
7zz e /var/www/grzegorzwitait.tar.7z -o/var/www/
7zz e /var/www/BookStack.tar.7z -o/var/www/
7zz e /var/www/Wikijs.tar.7z -o/var/www/
7zz e /var/www/InvoiceNinja.tar.7z -o/var/www/
rm -f -R /var/www/*.tar.7z
mv /var/www/grzegorzwitait.tar /var/www/grzegorzwitait_$DATE.tar
mv /var/www/BookStack.tar /var/www/BookStack_$DATE.tar
mv /var/www/Wikijs.tar /var/www/Wikijs_$DATE.tar
mv /var/www/InvoiceNinja.tar /var/www/InvoiceNinja_$DATE.tar
mysqldump --host=localhost --user=root --password='8arDzo_Sk0mp1ikow4N3_Ha$LO!' grzegorzwitait_dba > /var/www/mysql_grzegorzwitait_$DATE.sql
mysqldump --host=localhost --user=root --password='8arDzo_Sk0mp1ikow4N3_Ha$LO!' bookstack > /var/www/mysql_bookstack_$DATE.sql
mysqldump --host=localhost --user=root --password='8arDzo_Sk0mp1ikow4N3_Ha$LO!' wikijs > /var/www/mysql_wikijs_$DATE.sql
mysqldump --host=localhost --user=root --password='8arDzo_Sk0mp1ikow4N3_Ha$LO!' invoiceninja > /var/www/mysql_invoiceninja_$DATE.sql
7zz a -t7z -mhe=on -pmN1gdy_nie-zgadni3szhaha -m0=lzma -mx=9 -mfb=64 -md=32m -ms=on /var/www/grzegorz_wita_$DATE.7z /var/www/*.tar /var/www/*.sql
mv /var/www/grzegorz_wita_$DATE.7z /home/grzegorz_wita/backup/
find /home/grzegorz_wita/backup/ -type f -mtime +7 -delete
find /var/www/ -maxdepth 1 -type f -delete
sudo crontab -e
0 20 * * * /root/kopia_zapasowa.sh >> /home/grzegorz_wita/backup/kopia_zapasowa_`date +\%Y-\%m-\%d`.log 2>&1
sudo chmod 740 /root/kopia_zapasowa.sh