Poniżej znajduje się szczegółowa instrukcja, jak skonfigurować serwer na OVH od zera, obejmująca wszystkie podstawowe kroki.
Spis treści
- Podstawowa konfiguracja użytkownika i bezpieczeństwa
- Instalacja i konfiguracja środowiska Docker
- Konfiguracja NGINX jako reverse proxy
- Wdrożenie Let’s Encrypt dla SSL
- Konfiguracja stosu monitorowania
- Konfiguracja serwera plików (Nextcloud)
- Konfiguracja serwera poczty
- Konfiguracja portfolio
- Informacje dodatkowe
1. Podstawowa konfiguracja użytkownika i bezpieczeństwa
1.1 Utworzenie użytkownika **deployer**
# Dodaj nowego użytkownika
sudo adduser deployer
# Dodaj użytkownika do grupy sudo
sudo usermod -aG sudo deployer
1.2 Konfiguracja SSH i sudo dla nowego użytkownika
# Przełącz się na użytkownika deployer
sudo su - deployer
# Utwórz katalog .ssh i ustaw odpowiednie uprawnienia
mkdir -p ~/.ssh
chmod 700 ~/.ssh
# Utwórz plik authorized_keys
touch ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
# Dodaj swój klucz publiczny do authorized_keys
echo "TWÓJ_KLUCZ_PUBLICZNY_SSH" > ~/.ssh/authorized_keys
# Wróć do poprzedniego użytkownika
exit
1.3 Zabezpieczenie konfiguracji SSH
# Edytuj plik konfiguracyjny SSH
sudo nano /etc/ssh/sshd_config
Zmodyfikuj następujące linie:
# Wyłącz logowanie na roota
PermitRootLogin no
# Wyłącz logowanie hasłem (tylko klucze)
PasswordAuthentication no
# Określ port SSH (opcjonalnie możesz zmienić z 22 na inny)
Port 22
# Ograniczenie czasu bezczynności
ClientAliveInterval 300
ClientAliveCountMax 2
Zrestartuj usługę SSH:
sudo systemctl restart sshd
1.4 Konfiguracja sudo dla użytkownika deployer
# Utwórz plik konfiguracyjny sudo dla użytkownika deployer
sudo visudo -f /etc/sudoers.d/deployer
Dodaj następującą linię:
deployer ALL=(ALL) NOPASSWD: ALL
1.5 Konfiguracja firewall (UFW)
# Zainstaluj UFW
sudo apt update
sudo apt install ufw
# Ustaw domyślne zasady
sudo ufw default deny incoming
sudo ufw default allow outgoing
# Zezwól na SSH
sudo ufw allow ssh
# Zezwól na HTTP/HTTPS
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# Włącz firewall
sudo ufw enable
# Sprawdź status
sudo ufw status verbose
2. Instalacja i konfiguracja środowiska Docker
2.1 Instalacja Docker Engine
# Aktualizacja pakietów
sudo apt update
# Instalacja wymaganych pakietów
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
# Dodanie oficjalnego klucza GPG Dockera
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# Dodanie repozytorium Docker
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# Aktualizacja listy pakietów
sudo apt update
# Instalacja Dockera
sudo apt install -y docker-ce docker-ce-cli containerd.io
2.2 Instalacja Docker Compose
# Instalacja Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# Nadanie uprawnień wykonywania
sudo chmod +x /usr/local/bin/docker-compose
# Sprawdzenie wersji
docker-compose --version
2.3 Konfiguracja uprawnień Docker dla użytkownika
# Dodanie użytkownika do grupy docker
sudo usermod -aG docker $USER
sudo usermod -aG docker deployer
# Zastosowanie zmian (wylogowanie i zalogowanie ponownie)
# lub uruchomienie poniższej komendy
newgrp docker
2.4 Utworzenie struktury katalogów dla kontenerów
# Utworzenie głównych katalogów dla Dockera
sudo mkdir -p /opt/docker/monitoring/grafana
sudo mkdir -p /opt/docker/monitoring/loki
sudo mkdir -p /opt/docker/monitoring/prometheus
sudo mkdir -p /opt/docker/file
sudo mkdir -p /opt/docker/mail
sudo mkdir -p /opt/docker/apps/portfolio
# Zmiana właściciela katalogów
sudo chown -R $USER:$USER /opt/docker
# Nadanie odpowiednich uprawnień
sudo chmod -R 755 /opt/docker
3. Konfiguracja NGINX jako reverse proxy
3.1 Instalacja NGINX
# Aktualizacja pakietów
sudo apt update
# Instalacja NGINX
sudo apt install -y nginx
# Uruchomienie NGINX i włączenie autostartu
sudo systemctl start nginx
sudo systemctl enable nginx
3.2 Podstawowa konfiguracja NGINX
# Tworzenie katalogów dla konfiguracji
sudo mkdir -p /etc/nginx/sites-available
sudo mkdir -p /etc/nginx/sites-enabled
sudo mkdir -p /etc/nginx/snippets
# Edycja głównego pliku konfiguracyjnego
sudo nano /etc/nginx/nginx.conf
Wklej poniższą konfigurację:
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 1024;
multi_accept on;
}
http {
# Podstawowe ustawienia
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
server_tokens off;
# MIME
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Logi
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
# Gzip
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
# Dołączanie konfiguracji
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
# Limity czasowe dla proxy
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;
send_timeout 300;
}
3.3 Przygotowanie snippetów pod SSL
# Tworzenie snippetu SSL
sudo nano /etc/nginx/snippets/ssl-params.conf
Wklej poniższą konfigurację:
# Protokoły SSL/TLS
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
# Parametry Diffie-Hellman
ssl_dhparam /etc/nginx/dhparam.pem;
# Sesje SSL
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
# HSTS (15768000 sekund = 6 miesięcy)
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload";
# OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
# Resolver DNS
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# Dodatkowe nagłówki bezpieczeństwa
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
3.4 Generowanie silnych parametrów Diffie-Hellman
# Generowanie parametrów Diffie-Hellman
sudo openssl dhparam -out /etc/nginx/dhparam.pem 2048
3.5 Utworzenie domyślnej konfiguracji dla domen
# Tworzenie konfiguracji dla domeny głównej
sudo nano /etc/nginx/sites-available/example.com # Zmień na swoją domenę
Wklej poniższą konfigurację (zmień domenę na swoją):
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com; # Zmień na swoją domenę
# Przekierowanie na HTTPS (będzie aktywowane po skonfigurowaniu SSL)
# return 301 https://$host$request_uri;
location / {
root /var/www/html;
index index.html index.htm;
}
}
# Utwórz katalog dla plików HTML
sudo mkdir -p /var/www/html
# Utwórz podstawowy plik index.html
sudo nano /var/www/html/index.html
Dodaj prosty plik HTML:
<!DOCTYPE html>
<html>
<head>
<title>Strona w budowie</title>
<style>
body {
font-family: Arial, sans-serif;
text-align: center;
padding: 50px;
}
h1 {
color: #333;
}
</style>
</head>
<body>
<h1>Strona w budowie</h1>
<p>Serwer działa poprawnie. Strona w trakcie konfiguracji.</p>
</body>
</html>
Aktywowanie konfiguracji:
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/ # Zmień na swoją domenę
sudo rm -f /etc/nginx/sites-enabled/default # Usunięcie domyślnej konfiguracji
sudo nginx -t # Sprawdzenie składni
sudo systemctl reload nginx # Przeładowanie konfiguracji
4. Wdrożenie Let’s Encrypt dla SSL
4.1 Instalacja Certbot
# Aktualizacja pakietów
sudo apt update
# Instalacja Certbot i wtyczki dla NGINX
sudo apt install -y certbot python3-certbot-nginx
4.2 Przygotowanie konfiguracji dla subdomen
Przed uzyskaniem certyfikatów, utwórz podstawową konfigurację NGINX dla wszystkich subdomen:
# Utwórz plik konfiguracyjny dla wszystkich subdomen
sudo nano /etc/nginx/sites-available/subdomains.example.com # Zmień na swoją domenę
Wklej następującą konfigurację (dostosuj nazwy domen):
server {
listen 80;
listen [::]:80;
server_name prometheus.example.com loki.example.com grafana.example.com mail.example.com files.example.com portfolio.example.com monitoring.example.com;
location / {
root /var/www/html;
index index.html;
}
}
Aktywuj konfigurację:
sudo ln -s /etc/nginx/sites-available/subdomains.example.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
4.3 Pozyskanie certyfikatów dla domen
# Pozyskanie certyfikatu dla domeny głównej i wszystkich subdomen
sudo certbot --nginx -d example.com -d www.example.com -d prometheus.example.com -d loki.example.com -d grafana.example.com -d mail.example.com -d files.example.com -d portfolio.example.com -d monitoring.example.com
Podczas procesu zostaniesz poproszony o:
- Podanie adresu e-mail do powiadomień
- Akceptację warunków korzystania z usługi
- Wybór, czy chcesz przekierowywać HTTP na HTTPS
4.4 Konfiguracja automatycznego odnawiania certyfikatów
# Sprawdzenie czy automatyczne odnawianie jest skonfigurowane
sudo systemctl status certbot.timer
# Test procesu odnowienia (bez faktycznego odnowienia)
sudo certbot renew --dry-run
4.5 Konfiguracja subdomen
Po uzyskaniu certyfikatów, utwórz szczegółowe pliki konfiguracyjne dla każdej subdomeny:
# Monitoring (Grafana, Prometheus, Loki)
sudo nano /etc/nginx/sites-available/monitoring.example.com # Zmień na swoją domenę
server {
listen 80;
listen [::]:80;
server_name prometheus.example.com loki.example.com grafana.example.com monitoring.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name monitoring.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
include /etc/nginx/snippets/ssl-params.conf;
location / {
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name grafana.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
include /etc/nginx/snippets/ssl-params.conf;
location / {
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name prometheus.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
include /etc/nginx/snippets/ssl-params.conf;
location / {
proxy_pass http://localhost:9090;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name loki.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
include /etc/nginx/snippets/ssl-params.conf;
auth_basic "Restricted Access";
auth_basic_user_file /etc/nginx/.htpasswd;
location / {
proxy_pass http://localhost:3100;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
# Serwer plików
sudo nano /etc/nginx/sites-available/files.example.com # Zmień na swoją domenę
server {
listen 80;
listen [::]:80;
server_name files.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name files.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
include /etc/nginx/snippets/ssl-params.conf;
location / {
return 200 "File server placeholder";
}
}
# Serwer poczty
sudo nano /etc/nginx/sites-available/mail.example.com # Zmień na swoją domenę
server {
listen 80;
listen [::]:80;
server_name mail.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name mail.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
include /etc/nginx/snippets/ssl-params.conf;
location / {
return 200 "Mail server placeholder";
}
}
# Portfolio
sudo nano /etc/nginx/sites-available/portfolio.example.com # Zmień na swoją domenę
server {
listen 80;
listen [::]:80;
server_name portfolio.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name portfolio.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
include /etc/nginx/snippets/ssl-params.conf;
location / {
return 200 "Portfolio placeholder";
}
}
Aktywuj wszystkie konfiguracje:
sudo ln -s /etc/nginx/sites-available/monitoring.example.com /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/files.example.com /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/mail.example.com /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/portfolio.example.com /etc/nginx/sites-enabled/
# Usuń tymczasowy plik konfiguracyjny
sudo rm /etc/nginx/sites-enabled/subdomains.example.com
sudo nginx -t
sudo systemctl reload nginx
5. Konfiguracja stosu monitorowania
5.1 Przygotowanie pliku docker-compose.yml dla stosu monitorowania
# Przejdź do katalogu monitorowania
cd /opt/docker/monitoring
# Utwórz plik docker-compose.yml
nano docker-compose.yml
Wklej poniższą konfigurację:
version: '3.8'
networks:
monitoring:
driver: bridge
volumes:
prometheus_data: {}
grafana_data: {}
# loki_data: {} # Odkomentuj, jeśli chcesz używać Loki
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
restart: unless-stopped
volumes:
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.console.libraries=/etc/prometheus/console_libraries'
- '--web.console.templates=/etc/prometheus/consoles'
- '--web.enable-lifecycle'
ports:
- '9090:9090'
networks:
- monitoring
labels:
org.label-schema.group: 'monitoring'
node-exporter:
image: prom/node-exporter:latest
container_name: node-exporter
restart: unless-stopped
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- '--path.procfs=/host/proc'
- '--path.rootfs=/rootfs'
- '--path.sysfs=/host/sys'
- '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)'
ports:
- '9100:9100'
networks:
- monitoring
labels:
org.label-schema.group: 'monitoring'
cadvisor:
image: gcr.io/cadvisor/cadvisor:latest
container_name: cadvisor
restart: unless-stopped
volumes:
- /:/rootfs:ro
- /var/run:/var/run:ro
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
- /dev/disk/:/dev/disk:ro
ports:
- '8080:8080'
networks:
- monitoring
labels:
org.label-schema.group: 'monitoring'
grafana:
image: grafana/grafana:latest
container_name: grafana
restart: unless-stopped
volumes:
- grafana_data:/var/lib/grafana
- ./grafana/provisioning:/etc/grafana/provisioning
environment:
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD=<strong-password> # Zmień to na bezpieczne hasło!
- GF_USERS_ALLOW_SIGN_UP=false
ports:
- '3000:3000'
networks:
- monitoring
labels:
org.label-schema.group: 'monitoring'
# Loki i Promtail są opcjonalne - odkomentuj jeśli chcesz ich używać
# loki:
# image: grafana/loki:latest
# container_name: loki
# restart: unless-stopped
# volumes:
# - ./loki/config.yml:/etc/loki/config.yml
# - loki_data:/loki
# command: -config.file=/etc/loki/config.yml
# ports:
# - "3100:3100"
# networks:
# - monitoring
# labels:
# org.label-schema.group: "monitoring"
#
# promtail:
# image: grafana/promtail:latest
# container_name: promtail
# restart: unless-stopped
# volumes:
# - /var/log:/var/log
# - ./loki/promtail-config.yml:/etc/promtail/config.yml
# command: -config.file=/etc/promtail/config.yml
# networks:
# - monitoring
# labels:
# org.label-schema.group: "monitoring"
5.2 Przygotowanie konfiguracji Prometheus
# Utwórz katalog dla konfiguracji Prometheus
mkdir -p /opt/docker/monitoring/prometheus
# Utwórz plik konfiguracyjny Prometheus
nano /opt/docker/monitoring/prometheus/prometheus.yml
Wklej poniższą konfigurację:
global:
scrape_interval: 15s
evaluation_interval: 15s
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node_exporter'
static_configs:
- targets: ['node-exporter:9100']
- job_name: 'cadvisor'
static_configs:
- targets: ['cadvisor:8080']
5.3 Przygotowanie konfiguracji Grafana
# Utwórz katalogi dla konfiguracji Grafana
mkdir -p /opt/docker/monitoring/grafana/provisioning/datasources
mkdir -p /opt/docker/monitoring/grafana/provisioning/dashboards
# Utwórz plik konfiguracyjny źródeł danych
nano /opt/docker/monitoring/grafana/provisioning/datasources/datasource.yml
Wklej poniższą konfigurację:
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
access: proxy
url: http://prometheus:9090
isDefault: true
editable: true
5.4 Uruchomienie stosu monitorowania
# Uruchom kontenery
cd /opt/docker/monitoring
docker-compose up -d
5.5 Zabezpieczenie dostępu do Prometheus
# Zainstaluj narzędzie do generowania haseł
sudo apt install -y apache2-utils
# Utwórz plik z hasłami (zastąp 'admin_user' i 'your_password' własnymi wartościami)
sudo htpasswd -c /etc/nginx/.htpasswd admin_user
6. Konfiguracja serwera plików (Nextcloud)
6.1 Przygotowanie docker-compose.yml dla Nextcloud
# Utwórz katalog dla Nextcloud
cd /opt/docker/file
# Utwórz plik docker-compose.yml
nano docker-compose.yml
Wklej poniższą konfigurację:
version: '3'
volumes:
nextcloud_data:
nextcloud_db:
services:
db:
image: mariadb:10.6
container_name: nextcloud-db
command: --transaction-isolation=READ-COMMITTED --log-bin=binlog --binlog-format=ROW
restart: always
volumes:
- nextcloud_db:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=<strong-db-root-password> # Zmień to!
- MYSQL_PASSWORD=<strong-db-password> # Zmień to!
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
networks:
- nextcloud_network
app:
image: nextcloud:stable
container_name: nextcloud-app
restart: always
depends_on:
- db
volumes:
- nextcloud_data:/var/www/html
environment:
- MYSQL_PASSWORD=<strong-db-password> # Zmień to!
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
- MYSQL_HOST=db
- NEXTCLOUD_TRUSTED_DOMAINS=files.example.com # Zmień na swoją domenę
- NEXTCLOUD_ADMIN_USER=admin
- NEXTCLOUD_ADMIN_PASSWORD=<strong-admin-password> # Zmień to!
networks:
- nextcloud_network
ports:
- 8081:80 # Używamy portu 8081, ponieważ 8080 jest już używany przez cAdvisor
networks:
nextcloud_network:
6.2 Konfiguracja NGINX jako reverse proxy dla Nextcloud
# Edytuj plik konfiguracyjny dla serwera plików
sudo nano /etc/nginx/sites-available/files.example.com # Zmień na swoją domenę
Zaktualizuj konfigurację:
## 6.2 Konfiguracja NGINX jako reverse proxy dla Nextcloud (kontynuacja)
```nginx
server {
listen 80;
listen [::]:80;
server_name files.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name files.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
include /etc/nginx/snippets/ssl-params.conf;
# Ustawienia specyficzne dla Nextcloud
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always;
add_header Referrer-Policy "no-referrer" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Download-Options "noopen" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Permitted-Cross-Domain-Policies "none" always;
add_header X-Robots-Tag "noindex, nofollow" always;
add_header X-XSS-Protection "1; mode=block" always;
# Wyłączenie ograniczeń rozmiaru dla uploadu plików
client_max_body_size 0;
location / {
proxy_pass http://localhost:8081;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_buffering off;
proxy_request_buffering off;
# Zwiększenie timeoutów dla długo trwających operacji
proxy_connect_timeout 3600s;
proxy_send_timeout 3600s;
proxy_read_timeout 3600s;
}
}
6.3 Uruchomienie Nextcloud
# Uruchom kontenery
cd /opt/docker/file
docker-compose up -d
Sprawdź działanie Nextcloud pod adresem https://files.example.com i zaloguj się używając danych:
- Użytkownik: admin
- Hasło:
(lub to, które ustawiłeś w docker-compose.yml)
7. Konfiguracja serwera poczty
7.1 Przygotowanie docker-compose.yml dla serwera poczty
# Przejdź do katalogu serwera poczty
cd /opt/docker/mail
# Utwórz plik docker-compose.yml
nano docker-compose.yml
Wklej poniższą konfigurację:
version: '3'
networks:
mail_network:
driver: bridge
services:
mailserver:
image: docker.io/mailserver/docker-mailserver:latest
container_name: mailserver
hostname: mail.example.com # Zmień na swoją domenę
domainname: example.com # Zmień na swoją domenę
ports:
- '25:25' # SMTP
- '143:143' # IMAP
- '587:587' # Submission
- '993:993' # IMAPS
volumes:
- ./mail-data:/var/mail
- ./mail-state:/var/mail-state
- ./config:/tmp/docker-mailserver/
- /etc/localtime:/etc/localtime:ro
environment:
- ENABLE_SPAMASSASSIN=1
- ENABLE_CLAMAV=1
- ENABLE_FAIL2BAN=1
- SSL_TYPE=manual
- SSL_CERT_PATH=/tmp/docker-mailserver/cert/cert.pem
- SSL_KEY_PATH=/tmp/docker-mailserver/cert/privkey.pem
- PERMIT_DOCKER=connected-networks
networks:
mail_network:
restart: always
webmail:
image: roundcube/roundcubemail:latest
container_name: roundcube
depends_on:
- mailserver
environment:
- ROUNDCUBEMAIL_DEFAULT_HOST=mailserver
- ROUNDCUBEMAIL_DEFAULT_PORT=143
- ROUNDCUBEMAIL_SMTP_SERVER=mailserver
- ROUNDCUBEMAIL_SMTP_PORT=587
ports:
- '8082:80'
networks:
mail_network:
restart: always
7.2 Przygotowanie certyfikatów dla serwera poczty
# Utwórz strukturę katalogów
mkdir -p /opt/docker/mail/config/cert
# Skopiuj certyfikaty
sudo cp /etc/letsencrypt/live/example.com/fullchain.pem /opt/docker/mail/config/cert/cert.pem
sudo cp /etc/letsencrypt/live/example.com/privkey.pem /opt/docker/mail/config/cert/privkey.pem
# Ustaw odpowiednie uprawnienia
sudo chown -R $USER:$USER /opt/docker/mail
sudo chmod -R 600 /opt/docker/mail/config/cert
7.3 Uruchomienie serwera poczty i konfiguracja kont
# Utwórz potrzebne katalogi
mkdir -p /opt/docker/mail/mail-data
mkdir -p /opt/docker/mail/mail-state
mkdir -p /opt/docker/mail/mail-logs
mkdir -p /opt/docker/mail/config
# Uruchom kontenery
cd /opt/docker/mail
docker-compose up -d
# Pobierz narzędzie setup.sh
curl -L https://raw.githubusercontent.com/docker-mailserver/docker-mailserver/master/setup.sh -o setup.sh
chmod +x setup.sh
# Utwórz konto e-mail (przykład)
docker exec -it mailserver setup email add [email protected] # Zostaniesz poproszony o hasło
7.4 Konfiguracja DKIM
# Wygeneruj klucze DKIM
docker exec -it mailserver setup config dkim
# Wyświetl wygenerowany klucz DKIM
docker exec -it mailserver cat /tmp/docker-mailserver/opendkim/keys/example.com/mail.txt
7.5 Konfiguracja NGINX jako reverse proxy dla Roundcube
# Edytuj plik konfiguracyjny dla mail.example.com
sudo nano /etc/nginx/sites-available/mail.example.com # Zmień na swoją domenę
Wklej zaktualizowaną konfigurację:
server {
listen 80;
listen [::]:80;
server_name mail.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name mail.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
include /etc/nginx/snippets/ssl-params.conf;
location / {
proxy_pass http://localhost:8082;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
7.6 Konfiguracja DNS dla poczty
W panelu zarządzania DNS swojej domeny, dodaj następujące rekordy:
-
Rekord MX:
- Typ: MX
- Nazwa: @ (lub twoja domena)
- Wartość: mail.example.com
- Priorytet: 10
-
Rekord SPF:
- Typ: TXT
- Nazwa: @ (lub twoja domena)
- Wartość:
v=spf1 a mx ip4:<your-server-ip> -all
-
Rekord DKIM:
- Typ: TXT
- Nazwa: mail._domainkey
- Wartość: skopiuj z wyjścia polecenia
cat /tmp/docker-mailserver/opendkim/keys/example.com/mail.txt
-
Rekord DMARC:
- Typ: TXT
- Nazwa: _dmarc
- Wartość:
v=DMARC1; p=none; rua=mailto:[email protected]; ruf=mailto:[email protected]; pct=100
8. Konfiguracja portfolio
8.1 Struktura katalogów
# Utwórz katalog dla aplikacji
mkdir -p /opt/docker/apps/portfolio
8.2 Konfiguracja Docker dla portfolio
# Przejdź do katalogu portfolio
cd /opt/docker/apps/portfolio
# Utwórz plik docker-compose.yml
nano docker-compose.yml
Zawartość pliku docker-compose.yml:
version: '3.8'
services:
portfolio:
build:
context: .
dockerfile: Dockerfile
ports:
- '3001:80'
restart: always
8.3 Utworzenie Dockerfile dla aplikacji React
# Utwórz plik Dockerfile
nano Dockerfile
FROM node:18 as build
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=build /app/build /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
8.4 Przygotowanie konfiguracji NGINX dla kontenera
# Utwórz plik nginx.conf
nano nginx.conf
server {
listen 80;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
}
8.5 Konfiguracja NGINX jako proxy dla portfolio
# Edytuj plik konfiguracyjny NGINX dla portfolio
sudo nano /etc/nginx/sites-available/portfolio.example.com # Zmień na swoją domenę
server {
listen 80;
listen [::]:80;
server_name portfolio.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name portfolio.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
include /etc/nginx/snippets/ssl-params.conf;
location / {
proxy_pass http://localhost:3001;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
8.6 Uruchomienie portfolio
# Przeładuj konfigurację NGINX
sudo nginx -t
sudo systemctl reload nginx
# Uruchom kontener portfolio
cd /opt/docker/apps/portfolio
docker-compose up -d
9. Informacje dodatkowe
9.1 Uwagi dotyczące bezpieczeństwa
-
Regularnie aktualizuj system i aplikacje:
sudo apt update && sudo apt upgrade -y -
Monitoruj logi systemowe:
sudo journalctl -f -
Utwórz kopie zapasowe ważnych danych:
- Certyfikaty SSL
- Konfiguracja NGINX
- Dane z kontenerów Docker
9.2 Rozwiązywanie problemów
-
Sprawdzanie statusu usług:
systemctl status nginx docker ps -
Sprawdzanie logów:
docker logs [nazwa_kontenera] sudo tail -f /var/log/nginx/error.log -
Testowanie konfiguracji NGINX:
sudo nginx -t -
Restart usług:
sudo systemctl restart nginx docker-compose down && docker-compose up -d
9.3 Przydatne polecenia
-
Aktualizacja kontenerów Docker:
docker-compose pull docker-compose up -d -
Czyszczenie nieużywanych obrazów Docker:
docker system prune -a -
Odnowienie certyfikatów SSL:
sudo certbot renew -
Dodawanie nowych kont e-mail:
docker exec -it mailserver setup email add [email] -
Sprawdzanie użycia dysku:
df -h du -sh /opt/docker/*
Ta instrukcja powinna umożliwić pełną konfigurację serwera na OVH, od podstawowej konfiguracji systemu, przez instalację i konfigurację wszystkich potrzebnych usług, aż po zabezpieczenia i rozwiązywanie typowych problemów.