
Ostatnia aktualizacja: 27.01.2025 r.
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 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
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
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
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