рдореИрдВрдиреЗ рд░рд╛рд╕реНрдкрдмреЗрд░реА рдкреАрдЖрдИ рдкрд░ рдбреЙрдХ рдореЗрдВ рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдХреИрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдФрд░ рдХреНрдпреЛрдВ рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХреА рдХрд╣рд╛рдиреАред
рдкрд░рд┐рдЪрдп (рдпрд╛ рдпрд╣ рд╕рдм рдХреИрд╕реЗ рд╢реБрд░реВ рд╣реБрдЖ)
рдпрд╣ рд╕рдм рдкреНрд░рд╛рд░рдВрдн рд╣реБрдЖ рдмрд╣реБрдд рд╕рдордп рдкрд╣рд▓реЗрдХреБрдЫ рд╕рд╛рд▓ рдкрд╣рд▓реЗред рдпрд╣ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рд╣реБрдЖ рдХрд┐ рдореИрдВ рдЪреАрди рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рдФрд░ рдореБрдЭреЗ рдХрд┐рд╕реА рддрд░рд╣ рдмрд╛рд╣рд░реА рджреБрдирд┐рдпрд╛ рдХреЗ рд╕рдВрдкрд░реНрдХ рдореЗрдВ рдЖрдирд╛ рдкрдбрд╝рд╛ред рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рд╡реАрдкреАрдПрди рдФрд░ рдкреНрд░реЙрдХреНрд╕реА рдкрд░ рднрд░реЛрд╕рд╛ рдирд╣реАрдВ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдкреНрд░реЙрдХреНрд╕реА рдХреЗ рд╕рд╛рде DigitalOcean рдмрдврд╝рд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдпрд╣ рдмрд╕ рдЗрддрдирд╛ рд╣реБрдЖ рдХрд┐ рд╕рдордп рдХреЗ рд╕рд╛рде, рдкреНрд░реЙрдХреНрд╕реА рд╡рд╛рд▓рд╛ рд╕рд░реНрд╡рд░ рд╡рд┐рднрд┐рдиреНрди рдЕрдВрддрд░реЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рдХрд╕рд┐рдд рд╣реБрдЖ рд╣реИ: рдлрд╛рдЗрд▓ рд╕реНрдЯреЛрд░реЗрдЬ ( Syncthing
) рд╕реЗ CI ( Jenkins
) рддрдХред
рд░реВрд╕ рд▓реМрдЯрдиреЗ рдкрд░, рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рд╕реНрд╡рдпрдВ-рдореЗрдЬрдмрд╛рдиреА рдХреЗ рд▓рд┐рдП рдбреАрдУ рдЫреЛрдбрд╝рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд╕рд░реНрд╡рд░ рдирд╣реАрдВ рдЦрд░реАрджрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ - рдпрд╣ рдорд╣рдВрдЧрд╛ рд╣реИ, рдФрд░ рдЕрдм рддрдХ рдЗрд╕рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ рдореИрдВрдиреЗ рд░рд╛рд╕реНрдкрдмреЗрд░реА рдкреАрдЖрдИ 4 рдмреА рд▓рд┐рдпрд╛ред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдореБрдЭреЗ рдбреАрдУ рд╕реЗ рдЗрд╕ рдорд╢реАрди рддрдХ рд╕рднреА рдмреБрдирд┐рдпрд╛рджреА рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдкрдбрд╝рд╛, рдЬреЛ рдЗрд╕ рдкрдж рдХрд╛ рд╡рд┐рд╖рдп рд╣реЛрдЧрд╛ред
рдкрд░рд┐рдЪрдпрд╛рддреНрдордХ
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛:
- Syncthing - рдлрд╝рд╛рдЗрд▓ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди
- рдЬреЗрдирдХрд┐рдВрд╕ - CI
- рдЯреЗрд▓реАрдЧреНрд░рд╛рдл - |
- Influxdb - CPU, GPU рдФрд░ рдРрд╕реЗ рдЕрдиреНрдп рдХреЗ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕
- рдЧреНрд░реЗрдлрд╛рдирд╛ - |
- рдЧреЛрдЧрд╕ - рдЧрд┐рдЯ
- рд░реЗрдбрд┐рдХрд▓ - рд╕рд┐рдВрдХ рдХреИрд▓реЗрдВрдбрд░ / рд╕рдВрдкрд░реНрдХ
рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд:
- рдпрд╣
USB3
рдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рд░реВрдк рдореЗрдВ рдлреНрд▓реИрд╢ рдбреНрд░рд╛рдЗрд╡ рдХреА рдПрдХ рдЬреЛрдбрд╝реА рдкрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдФрд░ рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдерд╛ ( LUKS
) - рд╕рднреА рд╡реЗрдм рдЗрдВрдЯрд░рдлреЗрд╕ Nginx рд░рд┐рд╡рд░реНрд╕ рдкреНрд░реЙрдХреНрд╕реА рдХреЗ рдкреАрдЫреЗ рдЫрд┐рдкреЗ рд╣реБрдП рдереЗ
рд╕рдорд╕реНрдпрд╛рдПрдВ рдФрд░ рд╡рд┐рддреНрдд
рдореИрдВ рддреБрд░рдВрдд рдЙрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдЬреЛ рдЗрд╕ рдкреВрд░реЗ рдорд╛рдорд▓реЗ рдХреА рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЗ рджреМрд░рд╛рди рдЙрддреНрдкрдиреНрди рд╣реБрдИ рдереАрдВ рдФрд░ / рдпрд╛ рдЕрдм рдЙрддреНрдкрдиреНрди рд╣реЛ рд░рд╣реА рд╣реИрдВ:
- Raspberry PI 1A, . , , тАФ
- RaspberryPI 4B ( ) USB . тАФ / . USB3
- , . ( ) ( " ")
- тАФ
syncthing
, , / - 60
тАФ 502
ssh
.
, Micro SD 16GB ( ) Raspbian. .
- Noobs
- Micro SD Fat32
- ( uNetbootin)
- Raspberry PI
. : GUI . GUI, ssh
GUI .
()
Elementary OS GUI (GParted disks) . , :
, .
тАФ ext4
LUKS.
GParted
Device
-> Create partition table...
gpt
Apply
ext4
gnome-disks
( sudo apt install gnome-disk-utility
) ( Disks
):
- ()
Format partition...
Ext 4
Password protect volume
Next
- :
. , RaspberryPI . :
: /dev/sdb1
тАФ , Device
dd if=/dev/urandom bs=4M count=1 of=/tmp/usb_decrypt_file
sudo cryptsetup luksAddKey /dev/sdb1 /tmp/usb_decrypt_file
.
: .
, . ()- /
Raspberry PI
, :
- (
sudo apt update && sudo apt -y dist-upgrade
) - :
docker
docker-compose
(sudo apt -y install docker docker-compose
)Nginx
(sudo apt -y install nginx
). reverse-proxy
- (, /root/cryptfiles
; )
/etc/crypttab
:
usb1_crypt UUID=___UUID /root/cryptfiles/_- luks
/etc/fstab
/dev/mapper/usb1_crypt /media/pi/usb1 ext4 defaults,nofail 0 2
:
/dev/mapper/usb1_crypt
тАФ /dev/mapper/
+ ( ) /etc/crypttab
/media/pi/usb1
тАФ . (mkdir /media/pi/usb1
). тАФ , /mnt
/media/$USER
,
Nginx
bash
, reverse-proxy .
:
reverse-proxy nginx, тАФ mydomain.com
. nginx /etc/nginx
, /etc/nginx/autocompile
.
compile_apps_configs.sh#!/bin/bash
APPS=("syncthing" "grafana" "radicale" "git" "jenkins")
APPS_PROXIES=(http://localhost:8880 http://localhost:3000 http://localhost:8882 http://localhost:8883 http://localhost:8884)
HOSTNAMES=(my.domain)
conf_file="/etc/nginx/sites-available/autocompiled.conf"
ln_file="/etc/nginx/sites-enabled/autocompiled.conf"
echo "" > "$conf_file"
for app_index in ${!APPS[*]}
do
app="${APPS[app_index]}"
app_proxy="${APPS_PROXIES[app_index]}"
for host in ${HOSTNAMES[*]}
do
echo "`./compile_config.sh "$host" "$app_proxy" $app`" >> "$conf_file"
echo "" >> "$conf_file"
done
done
ln -s "$conf_file" "$ln_file"
compile_config.sh#!/bin/bash
DOMAIN_BASE="$1"
shift
PROXY_PATH=$(echo "$1" | sed -e "s/\//\\\\\//g")
PROXY_LOCATION=""
shift
HOSTNAME="$DOMAIN_BASE"
while [ -n "$1" ]
do
case "$1" in
"-pl") shift; PROXY_LOCATION="$(echo "$1" | sed -e "s/\//\\\\\//g")" ;;
*) HOSTNAME="$1.$HOSTNAME" ;;
esac
shift
done
cat template.conf | sed "s/HOSTNAME_BASE/$DOMAIN_BASE/g" | sed "s/HOSTNAME/$HOSTNAME/g" | sed "s/PROXYPATH/$PROXY_PATH/g" | sed "s/PROXYLOCATION/$PROXY_LOCATION/"
location_template.conf location /PROXYLOCATION {
proxy_pass PROXYPATH;
}
template.confserver {
server_name "HOSTNAME";
ssl_certificate /etc/letsencrypt/live/HOSTNAME_BASE/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/HOSTNAME_BASE/privkey.pem;
listen 443 ssl;
keepalive_timeout 60;
ssl on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers "HIGH:!RC4:!aNULL:!MD5:!kEDH";
add_header Strict-Transport-Security 'max-age=604800';
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
# set max upload size
client_max_body_size 4000M;
sendfile on;
send_timeout 600s;
proxy_connect_timeout 600;
location /PROXYLOCATION {
proxy_pass_request_headers on;
proxy_pass_request_body on;
proxy_pass PROXYPATH;
}
}
, ./compile_apps_configs.sh
nginx: sudo systemd reload nginx
.
Docker
, docker
docker-compose
:
sudo apt install docker docker-compose
yml
. :
тФЬтФАтФА doForAll
тФЬтФАтФА gogs
тФВ тФЬтФАтФА docker-compose.yml
тФВ тФЬтФАтФА Dockerfile
тФВ тФФтФАтФА .env
тФЬтФАтФА grafana
тФВ тФЬтФАтФА configs
тФВ тФВ тФЬтФАтФА influxdb.conf
тФВ тФВ тФФтФАтФА telegraf.conf
тФВ тФЬтФАтФА docker-compose.yml
тФВ тФФтФАтФА .env
тФЬтФАтФА jenkins
тФВ тФЬтФАтФА docker-compose.yml
тФВ тФЬтФАтФА .env
тФЬтФАтФА makeFullUpdate
тФЬтФАтФА radicale
тФВ тФЬтФАтФА docker-compose.yml
тФВ тФФтФАтФА .env
тФФтФАтФА syncthing
тФЬтФАтФА docker-compose.yml
тФФтФАтФА .env
, ( grafana
тАФ , тАФ influxdb
). .
, :
.env
DATA_PATH
Grafana
- :
Telegraf
. .env
INFLUXDB_WRITE_USER_PASSWORD
, configs/telegraf.conf
тАФ password
Grafana
. .env
INFLUXDB_READ_USER_PASSWORD
, Grafana
.
root
. :
sudo -i
mkdir -p /root/scripts/
touch "/root/scripts/monitor_startup_docker_container"
chmod 700 "/root/scripts/monitor_startup_docker_container"
nano "/root/scripts/monitor_startup_docker_container"
/root/scripts/monitor_startup_docker_container
:
#!/bin/bash
function log() {
echo `date`: "$@"
}
container_name="$1"
true=1
false=0
function restartContainer() {
docker container restart "$1"
}
function checkContanerExitStatus() {
container_name="$1"
status_line="`docker container ps -a --filter "name=$container_name" --filter "exited=255" | grep "$container_name"`"
[[ -z "$status_line" ]] && echo $false || echo $true
}
function checkContanerStatusIsEqual() {
container_name="$1"
container_dest_status="$2"
status_line="`docker container ps -a --filter "name=$container_name" --filter "status=$container_dest_status" | grep "$container_name"`"
[[ -z "$status_line" ]] && echo $false || echo $true
}
function isRunning() {
echo "`checkContanerStatusIsEqual "$container_name" "running"`"
}
while [[ "`isRunning`" != "$true" ]]; do
log check cycle "$container_name"
if [ "`checkContanerStatusIsEqual "$container_name" "exited"`" == "$true" -o "`checkContanerStatusIsEqual "$container_name" "dead"`" == "$true" ]; then
log restart "$container_name"
restartContainer "$container_name"
fi
if [[ "`isRunning`" -eq "$false" ]]; then
sleep 5
else
sleep 120
fi
done
log started "$container_name"
crontab
. root
:
`crontab -e`@reboot rm /root/startup_docker_logs
1/10 * * * * /root/scripts/monitor_startup_docker_container telegraf >> /root/startup_docker_logs
2/10 * * * * /root/scripts/monitor_startup_docker_container influxdb >> /root/startup_docker_logs
3/10 * * * * /root/scripts/monitor_startup_docker_container grafana >> /root/startup_docker_logs
3/10 * * * * /root/scripts/monitor_startup_docker_container jenkins >> /root/startup_docker_logs
3/10 * * * * /root/scripts/monitor_startup_docker_container gogs >> /root/startup_docker_logs
1/10 * * * * /root/scripts/monitor_startup_docker_container radicale >> /root/startup_docker_logs
2/10 * * * * /root/scripts/monitor_startup_docker_container syncthing >> /root/startup_docker_logs
, , рдФрд╕рддрди, рд▓рдЧрднрдЧ рдХреЛрдИ рд░рдЦрд░рдЦрд╛рд╡ рдирд╣реАрдВред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдХреНрдпрд╛ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:
SSH
рд░рд╛рд╕реНрдкрдмреЗрд░реА рддрдХ рдкрд╣реБрдВрдЪ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ : рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рд╣реИрдВ, рдпрд╣рд╛рдВ DigitalOcean рдХреЗ рд╕рд╛рде рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ- рд╕реНрд╡рдпрдВ рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ
- рдбреЛрдореЗрди рдХреЗ рд▓рд┐рдП DNS рдЦрд░реАрджрдирд╛ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛
рдореБрдЭреЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдФрд░ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдкрд░ рдЦреБрд╢реА рд╣реЛрдЧреАред