рд░рд╛рд╕рдмреЗрд░реАрдкреАрдЖрдИ рдЖрдзрд╛рд░рд┐рдд рдбреЙрдХрдЯрд░ рдкрд░ рдЕрдкрдиреЗ рд╕рд░реНрд╡рд░ рдХреЛ рдХреИрд╕реЗ рдмрдврд╝рд╛рдПрдВ

рдореИрдВрдиреЗ рд░рд╛рд╕реНрдкрдмреЗрд░реА рдкреАрдЖрдИ рдкрд░ рдбреЙрдХ рдореЗрдВ рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдХреИрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдФрд░ рдХреНрдпреЛрдВ рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХреА рдХрд╣рд╛рдиреАред


рдкрд░рд┐рдЪрдп (рдпрд╛ рдпрд╣ рд╕рдм рдХреИрд╕реЗ рд╢реБрд░реВ рд╣реБрдЖ)


рдпрд╣ рд╕рдм рдкреНрд░рд╛рд░рдВрдн рд╣реБрдЖ рдмрд╣реБрдд рд╕рдордп рдкрд╣рд▓реЗрдХреБрдЫ рд╕рд╛рд▓ рдкрд╣рд▓реЗред рдпрд╣ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рд╣реБрдЖ рдХрд┐ рдореИрдВ рдЪреАрди рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рдФрд░ рдореБрдЭреЗ рдХрд┐рд╕реА рддрд░рд╣ рдмрд╛рд╣рд░реА рджреБрдирд┐рдпрд╛ рдХреЗ рд╕рдВрдкрд░реНрдХ рдореЗрдВ рдЖрдирд╛ рдкрдбрд╝рд╛ред рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рд╡реАрдкреАрдПрди рдФрд░ рдкреНрд░реЙрдХреНрд╕реА рдкрд░ рднрд░реЛрд╕рд╛ рдирд╣реАрдВ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдкреНрд░реЙрдХреНрд╕реА рдХреЗ рд╕рд╛рде 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
    • :
      • - UUID,
      • - Device,

. , 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 .


:


  • , ,
  • , letsencrypt

reverse-proxy nginx

, тАФ mydomain.com. nginx /etc/nginx, /etc/nginx/autocompile.


compile_apps_configs.sh
#!/bin/bash

# Use "-pl" key in subname to make it like https://hostname/subname.
# E.g.: for https://my.domain/example will be used "-pl example"

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)
# HOSTNAMES=()

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

# FIRST ARG IS DOMAIN BASE

DOMAIN_BASE="$1"
shift

# THIRD ARG IS PROXY_PASS

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.conf
server {
    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. :


#    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 рдЦрд░реАрджрдирд╛ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛

рдореБрдЭреЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдФрд░ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдкрд░ рдЦреБрд╢реА рд╣реЛрдЧреАред

Source: https://habr.com/ru/post/undefined/


All Articles