Перейти к содержанию

Cockpit

sudo apt update
sudo apt install -y cockpit
sudo systemctl enable --now cockpit.socket
sudo apt install -y cockpit-storaged
sudo apt install -y cockpit-networkmanager
sudo apt install -y cockpit-packagekit packagekit packagekit-tools
sudo systemctl enable --now packagekit
sudo apt install -y cockpit-pcp pcp
sudo systemctl enable --now pmcd pmlogger
sudo apt install -y cockpit-machines qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils
sudo systemctl enable --now libvirtd
sudo usermod -aG libvirt,kvm $USER
sudo apt install -y cockpit-podman podman
systemctl --user enable --now podman.socket
loginctl enable-linger $USER
sudo apt install -y cockpit-sosreport
sudo systemctl restart cockpit.socket

Docker

sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
sudo systemctl enable --now docker
sudo systemctl status docker
sudo usermod -aG docker $USER
newgrp docker
docker --version
docker run --rm hello-world
sudo curl -L "https://github.com/docker/compose/releases/download/$(curl -s https://api.github.com/repos/docker/compose/releases/latest | jq -r .tag_name)/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version

sudo apt update && sudo apt install -y lm-sensors htop smartmontools i7z dstat sysstat btop python3-pip nvtop glances iotop iftop nload

sudo sensors-detect

sensors htop

Заменить /dev/sda на нужный диск sudo smartctl -a /dev/sda

sudo i7z dstat iostat mpstat pidstat btop

pip3 install s-tui s-tui

nvtop glances sudo iotop sudo iftop nload

Деплой сервисов в linux

Nextcloud

Docker deploy

docker-compose.yml

services:
  nextcloud:
    image: nextcloud:28.0
    container_name: nextcloud
    restart: unless-stopped
    ports:
      - "21103:80"
    volumes:
      - /mnt/vortex/nextcloud/config:/var/www/html/config
      - /mnt/vortex/nextcloud/data:/var/www/html/data
      - /mnt/vortex/nextcloud/apps:/var/www/html/custom_apps
      - /mnt/vortex/nextcloud/themes:/var/www/html/themes
    environment:
      - POSTGRES_HOST=nextcloud_db
      - POSTGRES_DB=nextcloud
      - POSTGRES_USER=nextcloud
      - POSTGRES_PASSWORD=210605
      - NEXTCLOUD_ADMIN_USER=ramil
      - NEXTCLOUD_ADMIN_PASSWORD=210605
    depends_on:
      - nextcloud_db
    networks:
      - nextcloud_network

  nextcloud_db:
    image: postgres:16.3
    container_name: nextcloud_db
    restart: unless-stopped
    volumes:
      - /mnt/vortex/nextcloud/postgres:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=nextcloud
      - POSTGRES_USER=nextcloud
      - POSTGRES_PASSWORD=210605
    networks:
      - nextcloud_network

networks:
  nextcloud_network:
    name: nextcloud_network

Можно указать в "127.0.0.1:8080:80" чтобы иметь доступ только в localhost

ports:
    - "127.0.0.1:8080:80"

Можно указать Trusted domains сразу через env

environment:
    - NEXTCLOUD_TRUSTED_DOMAINS=ваш-домен.com
    - NEXTCLOUD_TRUSTED_DOMAINS=ваш_домен.com,localhost,192.168.xxx.xxx

Запуск контейнера:

docker compose up -d --force-recreate

Добавить доверенные доменны для деплоя:

Добавить в vim /mnt/vortex/nextcloud/config/config.php

'trusted_domains' =>
  array (
    0 => 'cloud.ramil21.ru',
    1 => 'localhost',
    2 => '45.93.5.140',
  ),

После изменений в volumes - docker restart <container_name>

SSL сертификаты

Добавить в vim /mnt/vortex/nextcloud/config/config.php

'overwrite.cli.url' => 'https://example-domain.ru',
'overwriteprotocol' => 'https',

Добавить nginx конфиг стандартный сначала без ssl сертификатов

server {
        listen 80;
        server_name aze-umma.ru;
        location / {
                proxy_pass http://127.0.0.1:45001;
                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;
        }
}

sudo dnf install certbot python3-certbot-nginx - для fedora dnf install certbot

sudo pacman -S certbot certbot-nginx - для archlinux

Выдать сертификат

sudo certbot --nginx

sudo certbot --nginx -d cloud.domain-example.ru

Проверка

openssl s_client -connect cloud.ramil21.ru:443

sudo ss -tulnp | grep 9090

После выдачи ssl сертификата на сайт конфиг поменяется на

server {
        server_name cloud.ramil21.ru;
        location / {
                proxy_pass http://127.0.0.1:21103;
                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;
        }
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/cloud.ramil21.ru/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/cloud.ramil21.ru/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
    if ($host = cloud.ramil21.ru) {
        return 301 https://$host$request_uri;
    } # managed by Certbot
        listen 80;
        server_name cloud.ramil21.ru;
    return 404; # managed by Certbot
}

Ошибка загрузки больших данных - ограничение nginx body

http {
    client_max_body_size 10G;
    types_hash_max_size 2048;
    types_hash_bucket_size 128;
    ...

Gitlab

docker run --detach --publish 443:443 --publish 80:80 --publish 22:22 --name gitlab --restart always --shm-size 256m gitlab/gitlab-ee:-ee.0

пароль из гитлаб по умолчанию sudo docker exec -it cat /etc/gitlab/initial_root_password

Wireguard

Docker deploy

docker-compose.yml

Задать хэшированный пароль

docker run --rm -it ghcr.io/wg-easy/wg-easy wgpw '210605'
docker run --detach \
--name wg-easy \
--env LANG=ru \
--env WG_HOST=45.93.5.140 \
--env PASSWORD_HASH='$2a$12$K/hAkEbJhkE2HFtpVQ.Ly.YofSCJCmkCg6Vuu/YbFt653h1X1VQTS' \
--env PORT=51821 \
--env WG_PORT=51820 \
--volume ~/.wg-easy:/etc/wireguard \
--publish 51820:51820/udp \
--publish 51821:51821/tcp \
--cap-add NET_ADMIN \
--cap-add SYS_MODULE \
--sysctl 'net.ipv4.conf.all.src_valid_mark=1' \
--sysctl 'net.ipv4.ip_forward=1' \
--restart unless-stopped \
ghcr.io/wg-easy/wg-easy

Включить IP forwarding на хосте напрямую:

sudo sysctl -w net.ipv4.ip_forward=1
sudo sysctl -w net.ipv6.conf.all.forwarding=1

Либо добавить в /etc/sysctl.conf:

net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1

Чтобы получить доступ к админке роутера, на клиенте в конфиг вручную надо добавить в AllowedIPs:

AllowedIPs = 0.0.0.0/0, ::/0, 192.168.0.0/24

НО, иногда не работает, и придется прокидывать порт через ssh -L

motd

статический MOTD cat /etc/motd

(Все исполняемые скрипты из этой директории выполняются по порядку) ls -l /etc/update-motd.d/

run-parts /etc/update-motd.d/ bash /etc/update-motd.d/99-harbor

sudo chmod -x /etc/update-motd.d/* sudo chmod +x /etc/update-motd.d/99-justheader-harbor

входы и юзеры

who - Кто в системе прямо сейчас w - Кто в системе прямо сейчас подробнее с ip и idle users - Быстрый список логинов last -a - История успешных логинов (и ребутов) last -a | grep -E "sshd|pts/" - только ssh сессии lastlog - кто логинился последний раз lastlog -u ramil - по конкретному юзеру

Неудачные попытки входа

sudo grep -i "failed password" /var/log/auth.log | tail -n 50
sudo grep -i "invalid user" /var/log/auth.log | tail -n 50

Список активных SSH-сессий из логов

sudo journalctl -u ssh -S today | egrep "Accepted|session opened|session closed" | tail -n 200

Процессы конкретного пользователя

ps -u ramil -o pid,tty,stat,lstart,etime,cmd --sort=-lstart | head -n 30

Fail2ban

sudo fail2ban-client status - Какие jail’ы активны sudo fail2ban-client status sshd - Статус конкретного jail (обычно sshd)

логи:

sudo tail -n 200 /var/log/fail2ban.log
sudo journalctl -u fail2ban -n 200 --no-pager

Снять бан с IP sudo fail2ban-client set sshd unbanip 101.91.192.9

Посмотреть, какие IP сейчас в nft-наборе (реально забанены)

sudo nft list set inet f2b-table addr-set-sshd
sudo fail2ban-client status sshd | sed -n '/Banned IP list/p' - что делает команда?

Создание ключей под мой sshd конфиг:

На локальной машине ssh-keygen -t ed25519 -a 64 -f ~/.ssh/id_ed25519_harbor -C "ramil@harbor"

приватный ключ: ~/.ssh/id_ed25519_harbor (никому не показывать) публичный ключ: ~/.ssh/id_ed25519_harbor.pub (его можно копировать)

на сервер: ssh-copy-id -i ~/.ssh/id_ed25519_harbor.pub ramil@harbor Он сам добавит ключ в: /home/ramil/.ssh/authorized_keys

либо

cat ~/.ssh/id_ed25519_harbor.pub

На сервере:

mkdir -p ~/.ssh
chmod 700 ~/.ssh
nano ~/.ssh/authorized_keys

Вставить одной строкой публичный ключ, сохранить, затем:

chmod 600 ~/.ssh/authorized_keys

Настроить на локальной машине удобный вход (config)

vim ~/.ssh/config

Host harbor
  HostName harbor
  User ramil
  IdentityFile ~/.ssh/id_ed25519_harbor
  IdentitiesOnly yes