net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
Category: Research and development
FastCGI vs suPHP vs CGI vs mod_php (DSO)
Attribute | mod_php | CGI | suPHP | FastCGI |
---|---|---|---|---|
Memory usage | Low | Low | Low | High |
CPU usage | Low | High | High | Low |
Security | Low | Low | High | High |
Run as file owner | No | No | Yes | Yes |
Overall Performance | Fast | Slow | Slow | Fast |
Secure SSH with Yubikey
- Install OpenSSH
ssh-keygen -t ed25519-sk -O resident -O verify-required -C "Your Comment"
– t : Specifies the type of key to create. We are using
ed25519-sk
– 0 : Specify a key/value option.
resident : Indicate that the key handle should be stored on the FIDO authenticator itself.
verify-required : Indicate that this private key should require user verification for each signature.
- Copy public key
ssh-copy-id -i ~/.ssh/id_ed25519_sk.pub user@host
- And finally update SSH server
# Support public key cryptography (includes FIDO2)
PubkeyAuthentication yes
# Enforce User Verification
PubkeyAuthOptions verify-required
# Public keys location
AuthorizedKeysFile .ssh/authorized_keys
# Allow root only with MFA
PermitRootLogin prohibit-password
# Disable password authentication
PasswordAuthentication no
PermitEmptyPasswords no
How to install Speedtest – Tracker on Synology NAS
Laravel – Different between instance vs bind
use ->bind()
when you want to provide just a FQCN (full-qualified class name), or a factory closure, to instruct the container on how to lazily build an instance only when needed.
use ->instance()
` when you already have an constructed instance and want to instruct the container to provide that particular instance when required.
Simple Bindings
We can register a binding using the bind method, passing the class or interface name that we wish to register along with a closure that returns an instance of the class
Binding Instances
You may also bind an existing object instance into the container using the instance method. The given instance will always be returned on subsequent calls into the container
How to create Ubuntu system user without home directory
sudo groupadd --system prometheus
sudo useradd -s /sbin/nologin --no-create-home --system -g prometheus prometheus
Grafana – Install Loki
A Loki-based logging stack consists of 3 components:
- Promtail is the agent, responsible for gathering logs and sending them to Loki.
- Loki is the main server, responsible for storing logs and processing queries.
- Grafana for querying and displaying the logs.
- Download Loki
wget https://github.com/grafana/loki/releases/download/v2.9.8/loki-linux-amd64.zip
chmod a+x loki-linux-amd64
sudo cp loki-linux-amd64 /usr/local/bin/loki
loki --version
- Create Systemd service
sudo nano /etc/systemd/system/loki.service
[Unit]
Description=Loki is a log aggregation system designed to store and query logs from all your applications and infrastructure.
Document=https://github.com/grafana/loki/releases
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/loki -config.file /mnt/data/loki/loki-config.yaml
Restart=on-failure
RestartSec=10
StandardOutput=append:/mnt/data/loki/logs/loki.log
StandardError=append:/mnt/data/loki/logs/loki.log
[Install]
WantedBy=multi-user.target
# This is a complete configuration to deploy Loki backed by the filesystem.
# The index will be shipped to the storage via tsdb-shipper.
auth_enabled: false
server:
http_listen_port: 3100
common:
ring:
instance_addr: 127.0.0.1
kvstore:
store: inmemory
replication_factor: 1
path_prefix: /mnt/data/loki
storage:
filesystem:
chunks_directory: /mnt/data/loki/chunks
rules_directory: /mnt/data/loki/rules
schema_config:
configs:
- from: 2020-05-15
store: tsdb
object_store: filesystem
schema: v13
index:
prefix: index_
period: 24h
storage_config:
filesystem:
directory: /mnt/data/loki/chunks
Grafana – Monitor các thiết bị
Ở các bài trước ta đã setup được cơ bản server cho web hosting, gatekeeper. Vậy post này ta setup Grafana trên `gatekeeper` để monitor các server(s).
Đầu tiên là install Grafana . Cái này quite simple chỉ cần follow up guide trên website của hãng là okay. By default Grafana sử dụng port 3000
Sau đó install Prometheus
- Setup Group & User
sudo groupadd prometheus
sudo useradd -s /sbin/nologin --system -g prometheus prometheus
- Setup các directories cần thiết
sudo mkdir /etc/prometheus
sudo mkdir /var/lib/prometheus
Directory “““/var/lib/prometheus
sẽ dùng chứa data do đó suggest store trên HDD thay vì SSD chính để bảo toàn tuổi thọ cho SSD, cũng như không làm ảnh hưởng performance của SSD cho các việc khác liên quan tới OS.
Do đó trong case này mình chuyển về /mnt/data
sudo mkdir /mnt/data/prometheus
Latest version hiện tại là 2.52.02 / 2024-05-07
mkdir -p /tmp/prometheus
cd /tmp/prometheus
curl -s https://api.github.com/repos/prometheus/prometheus/releases/latest | grep browser_download_url | grep linux-amd64 | cut -d '"' -f 4 | wget -qi -
tar xvf prometheus*.tar.gz
cd prometheus*/
Tiếp theo là cd vào directory vừa unzip ra và move binaries về “`/usr/local/bin
sudo mv prometheus /usr/local/bin
sudo mv promtool /usr/local/bin
sudo chown prometheus:prometheus /usr/local/bin/prometheus
sudo chown prometheus:prometheus /usr/local/bin/promtool
Sau đó tạo file config ( ở directory song song với data )
sudo mv consoles /etc/prometheus
sudo mv console_libraries /etc/prometheus
sudo mv prometheus.yml /etc/prometheus
- Tạo Systemd Service
[Unit]
Description=Power your metrics and alerting with the leading open-source monitoring solution
Documentation=https://prometheus.io/
Wants=network-online.target
After=network-online.target
[Service]
User=prometheus
Group=prometheus
Type=simple
Restart=on-failure
RestartSec=5s
ExecStart=/usr/local/bin/prometheus \
--config.file=/etc/prometheus/prometheus.yml \
--storage.tsdb.path=/mnt/data/prometheus/ \
--web.console.templates=/etc/prometheus/consoles \
--web.console.libraries=/etc/prometheus/console_libraries \
--web.listen-address=0.0.0.0:9090 \
--web.enable-lifecycle \
--log.level=info
[Install]
WantedBy=multi-user.target
https://prometheus.io/docs/prometheus/latest/command-line/prometheus
Chú ý thay đổi path phù hợp
Enable service khi boot và start
sudo systemctl daemon-reload
sudo systemctl enable prometheus.service
sudo systemctl start prometheus.service
sudo systemctl status prometheus.service
Như vậy là xong. Prometheus sẽ chạy ở port 9090
Thực tế https://prometheus.jooservices.com
Ở các bài tiếp theo sẽ setup tiếp các exporters / loki
HAProxy server
Ở bài trước mình đã có 1 con server selfhosted
dành cho web server. Tuy nhiên homelab này mình sẽ có nhiều server do đó sẽ cần 1 em đóng vai trò gateway
( cũng như monitoring
)
- i5-8700
- 32GB RAM – 2666Mhz
- SSD NVme Gen3 x4 : 256GB
- HDD Sata : 1TB
- Ubuntu server 20.04 ( Focal Fossa )
- OpenSSH
- Static IP : 192.168.1.5
- Hostname : gatekeeper
Sau khi setup xong Ubuntu server như ở bài trước ( không cần Virtualmin ) thì ở server này sẽ cần HAProxy
HAProxy is a free, very fast and reliable reverse-proxy offering high availability, load balancing, and proxying for TCP and HTTP-based applications.
Mục đích sử dụng HAProxy để forward request về các servers / services cần thiết. Ví dụ
- https://selfhosted.jooservices.com/ sẽ được forward về Virtualmin ( port 10000 ) ở server
selfhosted
ta vừa installed trước. - https://jooservices.com sẽ forward về port 443 ( SSL ) của Virtualmin và load website
Cấu hình HAProxy
# HAProxy Stats
listen stats
bind *:1936
log global
maxconn 10
stats enable
stats show-node
http-request use-service prometheus-exporter if { path /metrics }
stats uri /stats
Bật HAProxy stats để quản lý
Tạm gác qua Sentry & Grafana ta sẽ nói sau. Thì ta có FE SSL cho các services
- cnmatrix.jooservices.com : Trỏ về Core switch port 443
- gatekeeper.jooservices.com : Trỏ về con server này với Webmin ( không phải Virtualmin ) trên port 10000
- jooservices.com && xcrawler.net cùng nằm trên
selfhosted
server với port 443
Và sau đó là config BE để forward về server / port tương tứng với từng FE
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
user haproxy
group haproxy
daemon
# Default SSL material locations
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
# See: https://ssl-config.mozilla.org/#server=haproxy&server-version=2.0.3&config=intermediate
ssl-default-bind-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
ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
# Newly added timeouts
timeout http-request 10s
timeout http-keep-alive 2s
timeout queue 5s
timeout tunnel 2m
timeout client-fin 1s
timeout server-fin 1s
# Caching
cache hosting
total-max-size 4095 # MB
max-object-size 10000 # bytes
max-age 3600 # seconds
cache general
total-max-size 4095 # MB
max-object-size 10000 # bytes
max-age 3600 # seconds
# HAProxy Stats
listen stats
bind *:1936
log global
maxconn 10
stats enable
stats show-node
http-request use-service prometheus-exporter if { path /metrics }
stats uri /stats
userlist basic_auth_logins
user <username> insecure-password <password>
# Frontend HTTP
frontend http
bind :80
mode http
compression algo gzip
acl acl_grafana hdr(host) -i grafana.jooservices.com
acl acl_sentry hdr(host) -i sentry.jooservices.com
use_backend be_grafana if acl_grafana
#default_backend be_http
backend be_grafana
mode http
balance roundrobin
server gatekeeper 192.168.1.5:3000 check
backend be_sentry
mode http
balance roundrobin
server gitlab 192.168.1.5:9000 check
## Frontend SSL
frontend ssl
bind :443
mode tcp
option tcplog
# Wait for a client hello for at most 5 seconds
tcp-request inspect-delay 5s
tcp-request content accept if { req_ssl_hello_type 1 }
## 192.168.1.2
use_backend be_ssl_cnmatrix if { req_ssl_sni -i cnmatrix.jooservices.com }
## 192.168.1.3
# use_backend be_ssl_unifi if { req_ssl_sni -i unifi.jooservices.com }
## 192.168.1.5
use_backend be_ssl_webmin_gatekeeper if { req_ssl_sni -m end gatekeeper.jooservices.com }
## 192.168.1.6
use_backend be_ssl_selfhosted if { req_ssl_sni -i jooservices.com }
use_backend be_ssl_virtualmin_selfhosted if { req_ssl_sni -m end selfhosted.jooservices.com }
#### XCrawler
use_backend be_ssl_selfhosted if { req_ssl_sni -i xcrawler.net }
use_backend be_ssl_selfhosted if { req_ssl_sni -m end .xcrawler.net }
## 192.168.1.8
use_backend be_ssl_nas if { req_ssl_sni -i nas.jooservices.com }
## 192.168.1.10
#use_backend be_ssl_esxi if { req_ssl_sni -i esxi.jooservices.com }
## 192.168.1.24
#use_backend be_ssl_gitlab if { req_ssl_sni -i gitlab.jooservices.com }
## Virtualmin / Webmin
#use_backend be_ssl_hosting_virtualmin if { req_ssl_sni -i virtualmin.jooservices.com }
#use_backend be_ssl_gatekeeper_webmin if { req_ssl_sni -i gatekeeper.jooservices.com }
#use_backend be_ssl_smb_webmin if { req_ssl_sni -i smb.jooservices.com }
## Hosting
## 192.168.1.20
#use_backend be_ssl_hosting if { req_ssl_sni -i jooservices.com }
## XCrawler
## 192.168.1.30
#use_backend be_ssl_xcrawler if { req_ssl_sni -i xcrawler.net }
#use_backend be_ssl_xcrawler if { req_ssl_sni -m end .xcrawler.net }
#default_backend be_ssl_hosting
## Backend SSL
### CnMatrix
backend be_ssl_cnmatrix
mode tcp
balance roundrobin
server cnmatrix 192.168.1.2:443 check
### Gatekeeper
backend be_ssl_webmin_gatekeeper
mode tcp
balance roundrobin
server selfhosted 192.168.1.5:10000 check
### NAS
backend be_ssl_nas
mode tcp
balance roundrobin
server nas 192.168.1.8:443 check
## Selfhosted
backend be_ssl_selfhosted
mode tcp
balance roundrobin
server selfhosted 192.168.1.6:443 check
backend be_ssl_virtualmin_selfhosted
mode tcp
balance roundrobin
server selfhosted 192.168.1.6:10000 check
My HAProxy configuration
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
user haproxy
group haproxy
daemon
# Default SSL material locations
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
# See: https://ssl-config.mozilla.org/#server=haproxy&server-version=2.0.3&config=intermediate
ssl-default-bind-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
ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
# Newly added timeouts
timeout http-request 10s
timeout http-keep-alive 2s
timeout queue 5s
timeout tunnel 2m
timeout client-fin 1s
timeout server-fin 1s
# Caching
cache hosting
total-max-size 4095 # MB
max-object-size 10000 # bytes
max-age 3600 # seconds
cache general
total-max-size 4095 # MB
max-object-size 10000 # bytes
max-age 3600 # seconds
# HAProxy Stats
listen stats
bind *:1936
log global
maxconn 10
stats enable
stats show-node
http-request use-service prometheus-exporter if { path /metrics }
stats uri /stats
userlist basic_auth_logins
user <your_username_here> insecure-password <your_password_here>
# Frontend HTTP
frontend http
bind :80
mode http
compression algo gzip
acl acl_sentry hdr(host) -i sentry.jooservices.com
acl acl_grafana hdr(host) -i grafana.jooservices.com
use_backend be_sentry if acl_sentry
use_backend be_grafana if acl_grafana
#default_backend be_http
backend be_sentry
mode http
balance roundrobin
server gitlab 192.168.1.12:9000 check
backend be_grafana
mode http
balance roundrobin
server gitlab 192.168.1.12:3000 check
## Frontend SSL
frontend ssl
bind :443
mode tcp
option tcplog
# Wait for a client hello for at most 5 seconds
tcp-request inspect-delay 5s
tcp-request content accept if { req_ssl_hello_type 1 }
## 192.168.1.2
use_backend be_ssl_cnmatrix if { req_ssl_sni -i cnmatrix.jooservices.com }
## 192.168.1.3
# use_backend be_ssl_unifi if { req_ssl_sni -i unifi.jooservices.com }
## 192.168.1.8
use_backend be_ssl_nas if { req_ssl_sni -i nas.jooservices.com }
## 192.168.1.10
use_backend be_ssl_esxi if { req_ssl_sni -i esxi.jooservices.com }
## 192.168.1.24
use_backend be_ssl_gitlab if { req_ssl_sni -i gitlab.jooservices.com }
## Virtualmin / Webmin
use_backend be_ssl_hosting_virtualmin if { req_ssl_sni -i virtualmin.jooservices.com }
use_backend be_ssl_gatekeeper_webmin if { req_ssl_sni -i gatekeeper.jooservices.com }
use_backend be_ssl_smb_webmin if { req_ssl_sni -i smb.jooservices.com }
## Hosting
## 192.168.1.20
use_backend be_ssl_hosting if { req_ssl_sni -i jooservices.com }
use_backend be_ssl_hosting if { req_ssl_sni -m end tpbeauty.art baristaschool.vn .baristaschool.vn phongcachxanh.vn }
#use_backend be_ssl_develop if { req_ssl_sni -m end coffeeschool.vn .coffeeschool.vn }
## XCrawler
## 192.168.1.30
use_backend be_ssl_xcrawler if { req_ssl_sni -i xcrawler.net }
use_backend be_ssl_xcrawler if { req_ssl_sni -m end .xcrawler.net }
default_backend be_ssl_hosting
### CnMatrix
backend be_ssl_cnmatrix
mode tcp
balance roundrobin
server cnmatrix 192.168.1.2:443 check
### Unifi
#backend be_ssl_unifi
# mode tcp
# balance roundrobin
# server gatekeeper 192.168.1.3:443 check
# BEGIN Monitor
# END Monitor
# NAS
backend be_ssl_nas
mode tcp
balance roundrobin
server smb 192.168.1.8:443 check
### BEGIN ESXi
#### Gatekeeper
backend be_ssl_gatekeeper_webmin
mode tcp
balance roundrobin
server gatekeeper 192.168.1.9:10000 check
#### ESXi
backend be_ssl_esxi
mode tcp
balance roundrobin
server esxi 192.168.1.10:443 check
#### BEGIN Hosting
backend be_ssl_hosting_virtualmin
mode tcp
balance roundrobin
server hosting 192.168.1.20:10000 check
backend be_ssl_hosting
mode tcp
balance roundrobin
server hosting 192.168.1.20:443 check
#backend be_ssl_develop
# mode tcp
# balance roundrobin
# server develop 192.168.1.12:443 check
backend be_ssl_smb_webmin
mode tcp
balance roundrobin
server smb 192.168.1.14:10000 check
backend be_ssl_gitlab
mode tcp
balance roundrobin
server hosting 192.168.1.24:443 check
# END Hosting
# BEGIN XCrawler
backend be_ssl_xcrawler
mode tcp
balance roundrobin
server xcrawler 192.168.1.13:443 check
# END XCrawler