Если вы работаете с PostgreSQL или только планируете - обратите внимание бесплатные курсы от компании Postgres Professional. Это один из немногих примеров, когда коммерческая компания делится полноценной учебной программой без ограничений.
Ссылка: https://postgrespro.ru/education/courses
DBA1 - базовое администрирование PostgreSQL
DBA2 - настройка и мониторинг
DBA3 - резервное копирование и репликация
QPT - оптимизация запросов
PGPRO - возможности Postgres Pro Enterprise
Каждый курс - это набор подробных презентаций и видео, охватывающих реальные задачи администрирования. Проходить можете в любом порядке, если нужно что-то точечно узнать - добро пожаловать.
Хотите разобраться с резервным копированием и репликацией?
Перейдите в DBA3, тема 2. Базовая резервная копия. Вы узнаете про холодные и горячие бэкапы, различия подходов, используемые инструменты и проверку восстановления.
#postgresql #database
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤3🔥1
В linux есть встроенный механизм изоляции системных ресурсов - namespaces. Именно на нем основаны контейнеры вроде docker и LXC. Но namespaces можно использовать и напрямую без всяких надстроек.
Namespace - это способ ядра linux изолировать разные части системы: процессы, сеть, точки монтирования, пользователей и т.д.
Каждое приложение может жить в своем отдельном пространстве, не видя другие процессы и ресурсы.
unshare --pid --mount --fork --mount-proc /bin/bash
ps aux
USER PID %CPU %MEM COMMAND
root 1 0.0 0.0 /bin/bash
root 18 0.0 0.0 ps aux
Здесь процесс bash получил PID 1 - он главный в своем изолированном пространстве. Теперь создадим изолированное монтирование:
mkdir /tmp/testdir /mnt/testdir
mount --bind /tmp/testdir /mnt/testdir
mount | grep testdir
/dev/sda3 on /mnt/testdir type ext4 (rw,relatime)
На хосте это монтирование вы не увидите, оно существует только внутри namespace.
lsns:
lsns
NS TYPE NPROCS PID USER COMMAND
4026532480 pid 3 123 root unshare --pid --mount --fork --mount-proc /bin/bash
4026532481 mnt 3 123 root └─/bin/bash
Тут видны PID и MOUNT пространства, созданные нашей командой
unshare. Если у вас работают контейнеры, их namespaces тоже будут отображены здесь.Предположим, у нас есть процесс bash с PID 123. Подключимся к нему и запустим команду top:
nsenter -t 123 -p -m top
Теперь top выполняется внутри того же PID и mount namespace, что и процесс bash.
unshare - создает новые namespaces.nsenter - позволяет войти в уже существующие.systemd-nspawn - мини-контейнерная система от systemd.Пример запуска простого контейнера через
systemd-nspawn:
systemd-nspawn -D /var/chroot/debian bash
#linux #namespaces
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11😁2
Please open Telegram to view this post
VIEW IN TELEGRAM
😁17❤2
Как современные дистрибутивы управляют сетями
В последние годы сетевой стек linux стал удобнее и гибче. Вместо громоздких init-скриптов и ручной правки
▪️ Netplan: YAML-конфигурации и единая точка входа. Netplan появился в Ubuntu начиная с 17.10 и задумывался как универсальный слой конфигурации.
Его роль проста:
▪️ читать YAML-файлы из
▪️ транслировать их в настройки сетевого бэкенда (NetworkManager или systemd-networkd)
▪️ выполнять примененную конфигурацию при загрузке
Сам Netplan не поднимает сети, он лишь управляет настройками. Пример конфигурации для systemd-networkd:
Применение:
▪️ Используется на серверах Ubuntu;
▪️ Простой, декларативный, без лишних зависимостей;
▪️ Отлично подходит для headless-сред, VPS, Kubernetes-нод и любых серверных задач.
▪️ NetworkManager: Wi-Fi, VPN и десктопные сценарии. NetworkManager - это полноценный сетевой менеджер с интерактивными инструментами:
nmcli (CLI);
nmtui (TUI-интерфейс);
GUI в GNOME/KDE;
Пример настройки интерфейса статикой через nmcli:
▪️ Стандарт для десктопов
▪️ Основной сетевой менеджер в Fedora, CentOS и др.
▪️ Удобен при сложных сетевых сценариях и динамических подключениях
▪️ Как Netplan и NetworkManager работают вместе
В Ubuntu Desktop схема следующая:
Netplan читает конфигурацию
В YAML указано renderer: NetworkManager
NetworkManager реально поднимает сеть
Пример:
После этого весь контроль переходит NetworkManager, а Netplan становится лишь точкой начальной конфигурации.
#netplan #networkmanager
🧑💻 NetworkAdmin
В последние годы сетевой стек linux стал удобнее и гибче. Вместо громоздких init-скриптов и ручной правки
/etc/network/interfaces сейчас используются более современные инструменты - netplan и networkmanager. Часто они сосуществуют в одной системе, и админам важно понимать, когда и что использовать. Поделюсь, как работает каждый из этих инструментов и чем они отличаются.Его роль проста:
/etc/netplan/Сам Netplan не поднимает сети, он лишь управляет настройками. Пример конфигурации для systemd-networkd:
network:
version: 2
renderer: networkd
ethernets:
ens33:
dhcp4: no
addresses: [192.168.1.50/24]
gateway4: 192.168.1.1
nameservers:
addresses: [1.1.1.1, 8.8.8.8]
Применение:
sudo netplan apply
nmcli (CLI);
nmtui (TUI-интерфейс);
GUI в GNOME/KDE;
Он умеет управлять:
Wi-Fi
VPN
Bonding/LACP
VLAN
Bridge
PPPoE
мобильными модемами
и многим другим.
Пример настройки интерфейса статикой через nmcli:
nmcli connection add type ethernet ifname ens33 con-name static-ens33 \
ip4 192.168.1.50/24 gw4 192.168.1.1
nmcli connection modify static-ens33 ipv4.dns "1.1.1.1 8.8.8.8"
nmcli connection up static-ens33
В Ubuntu Desktop схема следующая:
Netplan читает конфигурацию
В YAML указано renderer: NetworkManager
NetworkManager реально поднимает сеть
Пример:
network:
version: 2
renderer: NetworkManager
После этого весь контроль переходит NetworkManager, а Netplan становится лишь точкой начальной конфигурации.
#netplan #networkmanager
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤1👎1
На GitHub есть готовый способ запустить windows прямо в контейнере docker, без ручной настройки виртуалок. Все автоматизировано и работает поверх KVM. Ссылка: https://github.com/dockur/windows
Разворачивать все на виртуальной машине с включенной вложенной виртуализацией. Выставляется тип процессора в host и на этом все. Дальше - стандартный старт:
git clone https://github.com/dockur/windows
cd windows
docker compose up
Контейнер создался и попытался загрузить образ windows 11. Но тут ошибка: microsoft заблокировала скачивание ISO с моего IP. Выход есть - можно скачать ISO вручную и передать контейнеру, но можно и проще: переключить версию на windows 10.
docker-compose.yml достаточно задать переменную окружения:
version: "3"
services:
windows:
environment:
VERSION: "win10"
После этого запускаем снова:
docker compose up
Контейнер скачивает ISO Windows 10, разворачивает его и устанавливает систему в автоматическом режиме. Через 30 минут будет готовая, неактивированная, но полностью легальная Windows.
http://<ip_сервера>:8006
После установки доступ к системе:
через браузер (встроенный VNC),
или по RDP (пользователь docker, пароль — пустой).
2 CPU
4 GB RAM
64 GB диска
Все параметры можно менять в environment. Важно следить за свободным местом!
Не нужно вручную поднимать виртуалки, скачивать ISO или прописывать драйверы. Просто запускаете контейнер и получаете готовую Windows, работающую поверх KVM. Docker тут используется не ради контейнеризации, а ради автоматизации всего процесса.
#docker #windows
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍17🔥3🗿1
Systemd давно стал стандартом для запуска, управления и наблюдения за сервисами. Но многие используют его только для управления уже существующими демонами и не создают собственные unit-файлы, а ведь это удобный способ автоматизировать любые скрипты, фоновые процессы или приложения.
/etc/systemd/system/
Пример простого сервиса, который запускает bash-скрипт:
/etc/systemd/system/myapp.service
[Unit]
Denoscription=My custom app
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/myapp.sh
Restart=on-failure
User=myuser
Group=myuser
[Install]
WantedBy=multi-user.target
Несколько рекомендаций по параметрам:Type=simple- подходит для скриптов и обычных демоновRestart=on-failure- перезапуск при сбояхUser=…- всегда запускайте сервисы НЕ от root, если это возможноAfter=network.target- ожидаем сеть перед запуском
указываем shebang (#!/bin/bash);
используем абсолютные пути к бинарникам;
перенаправляем вывод в syslog или файл (если нужно);
завершаемся с кодами ошибок.
Пример:
#!/bin/bash
set -e
echo "Service started"
ping -c 1 8.8.8.8
Не забываем:
chmod +x /usr/local/bin/myapp.sh
systemctl daemon-reload
systemctl enable --now myapp.service
Проверяем статус:
systemctl status myapp.service
Посмотреть логи сервиса:
journalctl -u myapp.service -f
Проверить последнюю ошибку:
systemctl status myapp.service
Проверить, что systemd видит изменения:
systemctl daemon-reload
Принудительно перезапустить сам процесс:
systemctl restart myapp.service
LimitNOFILE - увеличить максимальное количество файлов
LimitNOFILE=65535WorkingDirectory - задать рабочую директорию
WorkingDirectory=/opt/myappEnvironment - задать переменные окружения
Environment="APP_ENV=prod"
ProtectSystem=full
ProtectHome=true
PrivateTmp=true
NoNewPrivileges=true
#linux #systemd
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11❤1
Хотя многие админы по привычке используют /etc/fstab, у systemd есть собственный механизм монтирования, который во многом удобнее и современнее.
📍 Почему systemd лучше, чем fstab?1️⃣ Автомонтирование при обращении - устройство подключается только тогда, когда к нему обращаются, и может автоматически отключаться по заданному таймауту.2️⃣ Автосоздание точек монтирования - systemd сам создает нужные директории, администратору не нужно следить за их наличием.3️⃣ Гибкая работа с таймаутами - если устройство недоступно, загрузка системы не повиснет, как это иногда бывает с fstab.4️⃣ Зависимости от сервисов - можно задать, что монтирование произойдёт только после старта VPN или другого сервиса, который необходим для доступа к диску.
/etc/systemd/system/mnt-backup.mount:
[Unit]
Denoscription=Disk for backups
[Mount]
What=/dev/disk/by-uuid/f774fad3-2ba0-47d1-a20b-0b1c2ae1b7d6
Where=/mnt/backup
Type=ext4
Options=defaults
[Install]
WantedBy=multi-user.target
cfdisk /dev/sdb #создаем раздел
mkfs -t ext4 /dev/sdb1 #форматируем
blkid #смотрим UUID
systemctl daemon-reload
systemctl start mnt-backup.mount
systemctl enable mnt-backup.mount
/etc/systemd/system/mnt-backup.mount:
[Unit]
Denoscription=NFS share
[Mount]
What=srv.example.com:/backup/nfs_share
Where=/mnt/backup
Type=nfs4
Options=rw
TimeoutSec=15
/etc/systemd/system/mnt-backup.automount:
[Unit]
Denoscription=NFS share
Requires=network-online.target
BindsTo=openvpn@client.service
After=openvpn@client.service
[Automount]
Where=/mnt/backup
TimeoutIdleSec=60
[Install]
WantedBy=graphical.target
Включаем:
systemctl daemon-reload
systemctl enable --now mnt-backup.automount
Теперь:
при старте системы диск не монтируется сразу;
при первом обращении к /mnt/backup - идет подключение NFS через VPN;
при остановке
openvpn@client.service диск автоматически отмонтируется.#systemd #fstab
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13
Для администраторов windows есть небольшой, очень быстрый и почти олдовейший по духу инструмент - Terminal Services Manager от LizardSystems. Размер всего ~4 МБ, работает мгновенно, интерфейс простой и предельно функциональный. Изначально утилиту делали для терминальных серверов, но по факту она отлично подходит для любой Windows-машины: от серверов до обычных рабочих станций.
Программа платная, но условно. Для персонального использования доступна полностью бесплатная версия без ограничений.
- Просмотр всех подключённых пользователей
- Видно, кто активен, кто в состоянии Disconnected
- Подключение к пользовательской сессии
- Принудительный logout или завершение всех сессий
- Отправка сообщений прямо в их RDP-сессии
- Быстрый просмотр нагрузки CPU, RAM, диска
- Просмотр процессов на удалённой машине
- Завершение зависших приложений
- Видно процессы по пользователям
- Перезагрузка и выключение удалённых серверов
- Очистка профилей пользователей
- Быстрое включение/отключение RDP-доступа
Если вы часто управляете RDP-серверами, разгребаете зависшие сессии, мониторите пользователей, то эта утилита сильно экономит время.
#windows #RDP
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
SMB-сервер на Python
▪️ Установка на Debian/Ubuntu:
▪️ Пример запуска (встроенный примерный скрипт):
Если нужна простая авторизация, можно указать логин/пароль:
⚠️ Важно: windows иногда пытается автоматически подключиться под текущей учеткой и не показывает диалог ввода пароля, в таких случаях полезно явно указать в проводнике «Connect using different credentials» или подключаться по IP с параметром учётных данных. С linux таких проблем нет, smbclient прекрасно работает:
➕ Плюсы:
супер быстрый старт (одна команда);
нет необходимости править конфиги и заводить службу;
удобен для тестов и одноразовой передачи файлов.
➖ Минусы:
пакет impacket - большой и ориентирован в основном на сетевые инструменты (pentest/ssc), так что для постоянной работы лучше все же samba или ksmbd;
не для продакшена: минимальная безопасность, упрощенные механизмы аутентификации.
Для быстрых переносов файлов или тестов - это будет шикарный инструмент.
#SMB
🧑💻 NetworkAdmin
impacket - идеален для одноразовых задач: поднимаешь за пару команд, кидаешь файлы и завершаешь процесс.
apt install python3-impacket
cd /usr/share/doc/python3-impacket/examples/
python3 smbserver.py share /mnt/share -smb2support
Пояснения:share- имя шары;/mnt/share- директория, которую расшариваем (не забудьте права, для анонимного доступа удобно chmod 777 /mnt/share);-smb2support- включить SMB2 (без этого Windows 10/11 иногда не подключаются).
Если нужна простая авторизация, можно указать логин/пароль:
python3 smbserver.py share /mnt/share -smb2support -username demo -password pass
smbclient -L 192.168.55.15 --user demo%pass
smbclient //192.168.55.15/share --user demo%pass
супер быстрый старт (одна команда);
нет необходимости править конфиги и заводить службу;
удобен для тестов и одноразовой передачи файлов.
пакет impacket - большой и ориентирован в основном на сетевые инструменты (pentest/ssc), так что для постоянной работы лучше все же samba или ksmbd;
не для продакшена: минимальная безопасность, упрощенные механизмы аутентификации.
Для быстрых переносов файлов или тестов - это будет шикарный инструмент.
#SMB
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤1
tcpdump - легкий и быстрый способ посмотреть сетевой трафик прямо в терминале, когда GUI-инструменты недоступны.
Быстрые параметры:
-i eth0 - интерфейс-nn - без DNS/порт-резолва-s 0 - захватывать пакет полностью-w file.pcap - сохранить трафик-r file.pcap - прочитать файлФильтры:
tcpdump -i eth0 -nn host 10.0.0.5
tcpdump -i eth0 -nn tcp port 443
tcpdump -i eth0 -nn 'tcp and dst port 22'
HTTP-запросы в ASCII:
tcpdump -i any -nn -s 0 -A 'tcp port 80'
DNS-трафик:
tcpdump -i any -nn -s 0 -A 'udp port 53'
Сохранение дампа:
tcpdump -i eth0 -nn -s 0 -w capture.pcap
Новые TCP-подключения (SYN):
tcpdump -i eth0 -nn 'tcp[tcpflags] & tcp-syn != 0'
MAC-адреса:
tcpdump -i eth0 -nn -e
Посчитать активность:
timeout 10 tcpdump -i eth0 -nn icmp | wc -l
Просмотреть SNI в HTTPS (если не шифруется):
tcpdump -i any -nn -s 0 -A 'tcp port 443' | grep -i 'server name'
#tcpdump #network
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥2❤1
acme.sh - это полностью bash-скрипт для работы с Lets Encrypt и другими ACME-совместимыми центрами сертификации. Он не требует python, библиотек или дополнительных пакетов, достаточно стандартного окружения linux. Именно легкость, автономность и гибкость сделали его популярной альтернативой certbot.
curl https://get.acme.sh | sh -s email=you@networkadmin.ru
Инсталлятор делает все автоматически:
Размещает скрипт в
~/.acme.sh/Добавляет алиас
acme.sh в .bashrcСоздает cron задачу для автообновления сертификатов
После перезапуска среды можно сразу работать.
acme.sh --issue --server letsencrypt -d networkadmin.ru -w /var/www/html
Для каждого домена создается отдельная директория
~/.acme.sh/networkadmin.ru/, где хранятся:приватный ключ
сертификат
конфигурация домена
acme.sh:
acme.sh --install-cert -d networkadmin.ru \
--key-file /etc/nginx/certs/key.pem \
--fullchain-file /etc/nginx/certs/cert.pem \
--reloadcmd "systemctl reload nginx"
Теперь при автообновлении сертификатов
acme.sh сам скопирует файлы и перезагрузит веб-сервер.acme.sh? Главные преимущества:~/.acme.sh, не трогают системные каталоги.#letsencrypt #ssl
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥1
Многие знают про
tree, но мало кто знает про broot. Это консольный инструмент для навигации по файловой системе, который сочетает просмотр дерева, поиск, переходы и фильтры в одном интерфейсе.
curl -fsSL https://dystroy.org/broot/install.sh | bash
После установки появится командный алиас
br, запускающий интерактивный браузер.
nginx
cd ../../../../../.открыть в редакторе (e)
удалить (:rm)
показать подробности (:p)
копировать путь (:pp)
- Показать размеры каталогов:
br -s- Открывать сразу в режиме изменения (как F2 в файловых менеджерах):
br -c :focus- Фильтровать только директории:
type:d#linux #tools
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6👍3
Если после обновления, кривой установки windows или повреждения разделов linux перестал загружаться, то почти всегда можно вернуть систему к жизни, просто восстановив GRUB.
lsblk
Ищем раздел, где стоит linux, например
/dev/sda2.Если отдельный
/boot существует, то запомните и его.
sudo mount /dev/sda2 /mnt
Если есть отдельный
/boot:
sudo mount /dev/sda1 /mnt/boot
И обязательно системные каталоги:
for i in /dev /proc /sys /run; do sudo mount --bind $i /mnt$i; done
sudo chroot /mnt
Теперь вы внутри установленной системы, как будто загрузились в нее.
BIOS/Legacy
grub-install /dev/sda
update-grub
UEFI
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=GRUB
update-grub
Если каталог
/boot/efi не смонтирован, то смонтируйте нужный EFI-раздел (lsblk -f покажет FAT32):
mount /dev/sda1 /boot/efi
exit
sudo reboot
Если все сделано правильно система загрузится снова.
Если после восстановления GRUB старая windows не отображается, выполните:
os-prober && update-grub
Если GRUB ставится, но меню не появляется, включите отображение:
GRUB_TIMEOUT_STYLE=menu
При поврежденном ядре можно вручную выбрать старое в меню Advanced options.
#linux #grub
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤2🔥1
Хочу поделиться полезным инструментом, который часто упоминают в контексте пентестов, но который одинаково удобен и администраторам: Chisel. Это один бинарник (на Go) и для сервера, и для клиента доступный для linux, windows, macOS. Работает поверх HTTP, поэтому его очень просто поднять там, где открыт веб-порт.
./chisel server --port 80 --socks5
На клиенте (локальная машина, откуда хотите выходить в интернет через сервер):
./chisel client http://server.example.com:80 socks
После этого в браузере можно указать SOCKS5 proxy 127.0.0.1:1080, трафик пойдет через сервер.
На публичном сервере:
./chisel server --port 80 --reverse
На внутреннем хосте (тот, к которому хотим подключиться):
./chisel client http://server.example.com:80 R:2222:localhost:22
Теперь на публичном сервере можно подключиться к внутреннему хосту:
ssh -p 2222 root@127.0.0.1
--reverse. На внутреннем клиенте даем правило:
./chisel client http://server.example.com:80 33306:127.0.0.1:3306
После этого на клиенте MySQL будет доступен локально на порту 33306.
Аутентификация: есть опция
--auth user:pass и на сервере, и на клиенте, используйте для защиты туннеля.Маскировка:
--backend позволяет прятать chisel-сервер за обычным веб-сервером (перенаправлять чужие HTTP-запросы), что облегчает развертывание в средах с ограничениями.Один бинарник, удобно распространять и для разных ОС.
#network #security
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤2
Полезное напоминание в преддверии новогодних праздников - проверить бэкапы и свободное место
df -h
du -h -d 1 / | sort -hr
du -hs /* | sort -hr
Ограничиваем вывод:
du -h -d 1 / | sort -hr | head -10
Топ 20 самых объемных директорий:
du -hcx --max-depth=6 / | sort -rh | head -n 20
Топ 20 самых больших файлов:
find / -mount -ignore_readdir_race -type f -exec du -h "{}" + 2>&1 \
| sort -rh | head -n 20
df -ih
du показывает меньше, чем df, виноваты могут быть процессы, держащие удалённые файлы:
lsof | grep '(deleted)'
lsof +L1
Если видите большие файлы - перезапустите сервис или убейте зависший процесс:
kill -9 <pid>
Классическая ловушка: данные пишутся в
/mnt/backup, но диск в момент копирования не смонтирован. Файлы падают на корневую ФС, а после монтирования становятся невидимыми, но место продолжают занимать.Если суммарный размер файлов меньше занятого места, а удаленных файлов нет, то почти наверняка проблема в такой ложной точке монтирования.
#linux #storage
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥3
Встроенный брандмауэр windows по умолчанию не пишет логи о входящих и исходящих соединениях, которые он блокирует. Из-за этого сложно понять, кто виноват: само приложение, сеть или firewall. Многие в такой ситуации просто отключают защиту целиком, но это плохая практика.
Куда правильнее включить логирование DROP-пакетов, посмотреть, что именно блокируется (порт, IP, протокол), и уже после этого создать точечное правило.
Set-NetFireWallProfile -Profile Public `
-LogBlocked True `
-LogMaxSize 20480 `
-LogFileName "%systemroot%\system32\LogFiles\Firewall\pfirewall.log" `
-Verbose
После включения логи будут появляться в файле
pfirewall.log. В них видно источник, порт, направление и действие (DROP/ALLOW).
Auditpol /set /category:"System" /SubCategory:"Filtering Platform Packet Drop" /failure:enable
После этого записи о блокировках появятся в:
Event Viewer → Windows Logs → Security#windows #firewall
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15❤2
This media is not supported in your browser
VIEW IN TELEGRAM
Я думаю, что все устали и всем пора отдыхать, набираться сил. Все дедлайны позади, а о будущих думать пока не стоит!
Я пожелаю Вам хороших каникул, счастья, здоровья, поменьше выгорания и успехов в новом году!
С наступающим, 2026!
Please open Telegram to view this post
VIEW IN TELEGRAM
😁9🍾9💩3❤2
Small HTTP Server - программа родом из эпохи Windows 95 и NT, но до сих пор развивается. Написана на C++, невероятно компактная - установщик весит всего около 1 МБ.
Программа доступна под Windows, Linux и ARM, отличный вариант для маломощных одноплатников.
Все службы настраиваются через удобный веб-интерфейс со статистикой. Конфигурация хранится в обычном текстовом файле. На Windows сервер запускается просто запуском EXE, по умолчанию работает как файловый листинг каталога. Можно установить как службу.
#utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11❤2🔥2