
Ostatnia aktualizacja: 25.04.2023 r.
Jeśli chciałbyś(-abyś), podobnie jak ja, mieć swoją stronę internetową lub w swojej pracy masz za zadanie przygotować grunt pod firmową stronę internetową czy też aplikację internetową, to poniżej udostępniam Ci wszystkie kroki, które ja zrobiłem w celu uruchomienia strony internetowej na Ubuntu 20.04 LTS, na której właśnie jesteś. 😎
Przed przystąpieniem do konfiguracji w pierwszej kolejności aktualizuję system i pakiety do najnowszych dostępnych wersji.
sudo apt-get update && sudo apt-get upgrade -y && sudo apt-get dist-upgrade -y && sudo apt-get autoremove -y
ssh-keygen -t rsa -b 4096
mkdir -p ~/.ssh
echo "klucz_publiczny" >> ~/.ssh/authorized_keys
chown -R grzegorz_wita:grzegorz_wita ~/.ssh
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
sudo nano /etc/ssh/sshd_config
[...]
Port 22122
[...]
PermitRootLogin no
[...]
PubkeyAuthentication yes
[...]
AuthorizedKeysFile .ssh/authorized_keys
[...]
PasswordAuthentication no
PermitEmptyPasswords no
[...]
sudo ufw allow 22122/SSH
sudo ufw status numbered
sudo ufw delete 22/tcp numer
sudo systemctl restart ssh
sudo apt-get install apache2 p7zip-full php libapache2-mod-php php-mysql -y
sudo ufw allow in "Apache Full" && sudo ufw status verbose
sudo mkdir /var/www/grzegorzwitait
sudo chown -R www-data:www-data /var/www/grzegorzwitait
sudo chmod -R g+rw /var/www/grzegorzwitait
sudo nano /etc/apache2/sites-available/grzegorzwitait.conf
<VirtualHost *:80>
ServerName grzegorzwita.it
ServerAlias *.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
ServerAlias *.grzegorzwita.it
ServerAdmin admin@grzegorzwita.it
DocumentRoot /var/www/grzegorzwitait
DirectoryIndex index.php
<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
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/grzegorzwita.it/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/grzegorzwita.it/privkey.pem
</VirtualHost>
</IfModule>
sudo a2ensite grzegorzwitait
sudo a2dissite 000-default
sudo apache2ctl configtest
sudo a2enmod rewrite headers http2 mpm_event proxy_fcgi
sudo a2dismod php7.4 mpm_prefork
sudo a2enconf php7.4-fpm
sudo nano /etc/php/7.4/apache2/php.ini
sudo nano /etc/php/7.4/fpm/php.ini
sudo nano /etc/php/7.4/cli/php.ini
[...]
max_execution_time = 60
[...]
max_input_vars = 2000
[...]
post_max_size = 16M
[...]
upload_max_filesize = 5M
[...]
max_file_uploads = 40
[...]
sudo systemctl reload apache2
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 'Sk0mp1ikow4N3_Ha$LO';
GRANT ALL ON grzegorzwitait_dba.* TO 'grzegorzwitait_dba'@'localhost';
FLUSH PRIVILEGES;
exit
sudo mysql -u grzegorzwitait_dba -p
SHOW DATABASES;
exit
sudo mysql -u root -p
CREATE DATABASE grzegorzwitait_pma;
CREATE USER 'grzegorzwitait_pma'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'Sk0mp1ikow4N3_Ha$LO';
GRANT ALL ON grzegorzwitait_pma.* TO 'grzegorzwitait_pma'@'localhost';
UNINSTALL COMPONENT "file://component_validate_password";
exit
sudo apt-get install phpmyadmin php-mbstring php-zip php-gd php-json php-curl -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'] = 'Sk0mp1ikow4N3_Ha$LO';
[...]
sudo phpenmod mbstring
sudo nano /etc/apache2/conf-available/phpmyadmin.conf
<Directory /usr/share/phpmyadmin>
[. . .]
AllowOverride All
[. . .]
</Directory>
sudo systemctl restart apache2
sudo nano /usr/share/phpmyadmin/.htaccess
AuthType Basic
AuthName "Restricted Files"
AuthUserFile /etc/phpmyadmin/.htpasswd
Require valid-user
sudo htpasswd -bc /etc/phpmyadmin/.htpasswd N4zW@_Uzy7k0wn1ka N1gdy_nie-zgadni3szhaha
sudo systemctl restart apache2
sudo apt-get install vsftpd -y
sudo systemctl status vsftpd
sudo ufw allow 20/tcp
sudo ufw allow 21/tcp
sudo ufw allow 40000:50000/tcp
sudo nano /etc/vsftpd.conf
[...]
listen=NO
[...]
listen_ipv6=NO
[...]
anonymous_enable=NO
[...]
local_enable=YES
[...]
write_enable=YES
[...]
local_umask=022
[...]
dirmessage_enable=YES
[...]
use_localtime=YES
[...]
xferlog_enable=YES
[...]
connect_from_port_20=YES
[...]
pam_service_name=vsftpd
[...]
force_dot_files=YES
pasv_min_port=40000
pasv_max_port=50000
sudo systemctl restart vsftpd
sudo adduser --home /var/www --ingroup www-data nazwa_uzytkownika N1gdy_nie-zgadni3szhaha
sudo chgrp -R www-data /var/www
sudo chmod -R g+w /var/www
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
Krok opcjonalny ponieważ prócz głównej strony przygotowałem sobie dodatkową platformę do przechowywania przydatnych informacji. Dodatkowo twórca zautomatyzował cały proces instalacji i wystarczy pobrać gotowy skrypt instalacyjny, jednak jest on dedykowany dla "pustych systemów" więc w moim przypadku nie mogłem ich wykorzystać i musiałem pójść trudniejszą drogą. 😋
mkdir /var/www/BookStack && cd /var/www/BookStack
git clone https://github.com/BookStackApp/BookStack.git --branch release --single-branch
sudo apt-get install unzip php-fpm php-ldap php-tidy -y
sudo composer install --no-dev
sudo chown -R www-data:www-data bootstrap/cache public/uploads storage
sudo chmod -R g+rw bootstrap/cache public/uploads storage
sudo mysql -u root -p
CREATE DATABASE bookstack;
CREATE USER 'bookstack'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'Sk0mp1ikow4N3_Ha$LO';
GRANT ALL ON bookstack.* TO 'bookstack'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
exit
sudo cp .env.example .env
php artisan key:generate
sudo nano .env
php artisan migrate
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
RewriteEngine On
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/grzegorzwita.it/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/grzegorzwita.it/privkey.pem
</VirtualHost>
sudo a2ensite bookstack
sudo systemctl reload apache2
cd /var/www/BookStack/
git pull origin release && composer install --no-dev && php artisan migrate && php artisan cache:clear && php artisan config:clear && php artisan view:clear
sudo nano /root/kopia_zapasowa.sh
#!/bin/bash
DATE=$(date +"%Y-%m-%d")
mkdir -p /root/backup
tar -caf - /var/www/grzegorzwitait -P | 7z a -si /var/www/grzegorzwitait.tar.7z >> /var/www/grzegorzwitait_$DATE.log 2>&1
tar -caf - /var/www/BookStack -P | 7z a -si /var/www/BookStack.tar.7z >> /var/www/BookStack_$DATE.log 2>&1
7z e /var/www/grzegorzwitait.tar.7z -o/var/www/ >> /var/www/grzegorzwitait_$DATE.log 2>&1
7z e /var/www/BookStack.tar.7z -o/var/www/ >> /var/www/BookStack_$DATE.log 2>&1
rm -f -R /var/www/grzegorzwitait.tar.7z
rm -f -R /var/www/BookStack.tar.7z
mv /var/www/grzegorzwitait.tar /var/www/grzegorzwitait_$DATE.tar >> /var/www/grzegorzwitait_$DATE.log 2>&1
mv /var/www/BookStack.tar /var/www/BookStack_$DATE.tar >> /var/www/BookStack_$DATE.log 2>&1
mysqldump --host=localhost --user=konto_bazy_danych --password='N1gdy_nie-zgadni3szhaha' grzegorzwitait > /var/www/MYSQL_$DATE.sql 2> /var/www/grzegorzwitait_$DATE.log
mysqldump --host=localhost --user=konto_bazy_danych --password='N1gdy_nie-zgadni3szhaha' bookstack > /var/www/MYSQL_$DATE.sql 2> /var/www/BookStack_$DATE.log
7z a -t7z -mhe=on -pN1gdy_nie-zgadni3szhaha -m0=lzma -mx=9 -mfb=64 -md=32m -ms=on /var/www/grzegorz_wita_$DATE.7z /var/www/*.tar /var/www/*.sql >> /var/www/grzegorz_wita_$DATE.log 2>&1
mv /var/www/grzegorz_wita_$DATE.7z /root/backup
mv /var/www/*_$DATE.log /root/backup
find /root -maxdepth 1 -type f -name '*.7z'-delete
find /root -maxdepth 1 -type f -name '*.log'-delete
sudo crontab -e
0 20 * * * /root/kopia_zapasowa.sh >> /home/grzegorz_wita/backup/kopia_zapasowa_`date +\%Y-\%m-\%d`.log 2>&1