Skip to content

Commit 5717301

Browse files
authored
Merge pull request #2 from gpas45/claude/happy-euler-ah9ry7
Реорганизация репозитория и консолидация RouterOS, proxmox и win
2 parents e63eb5e + 59d9b10 commit 5717301

14 files changed

Lines changed: 598 additions & 2 deletions

README.md

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
# scripts
22

3-
Коллекция скриптов для администрирования серверов: PostgreSQL для 1С, Windows-инфраструктура (1С, RD Gateway), мониторинг Zabbix.
3+
Коллекция скриптов для администрирования инфраструктуры: PostgreSQL для 1С, Windows (1С, RD Gateway, развёртывание), MikroTik RouterOS, Proxmox, мониторинг Zabbix.
4+
5+
Сюда консолидировано содержимое репозиториев `RouterOS`, `proxmox` и `win` — теперь всё в одном месте.
46

57
## Структура
68

79
```
8-
windows/ PowerShell-скрипты для Windows
10+
windows/ PowerShell-скрипты для Windows (+ oobe/ — автоустановка Windows)
911
pgsql/ PostgreSQL: установка, бэкапы, отказоустойчивость
12+
routeros/ Скрипты и конфиги MikroTik RouterOS (+ docs/)
13+
proxmox/ Скрипты для Proxmox VE
1014
linux/ Linux: тесты железа, конфиги окружения
1115
zabbix/ Шаблоны Zabbix
1216
```
@@ -18,6 +22,18 @@ zabbix/ Шаблоны Zabbix
1822
| `1CDefenderExclusion.ps1` | Добавляет исключения 1С в Windows Defender: каталоги платформы и файловых баз (из `ibases.v8i` всех профилей), расширения и процессы. Запуск от администратора. |
1923
| `Replace-1C-Ibases.ps1` | Раздаёт эталонный `ibases.v8i` (список баз 1С) пользователям группы `1C_all` с бэкапом старых файлов. Интерактивный выбор пользователей. |
2024
| `Update-RDGWCertificate.ps1` | Получение/продление сертификата Let's Encrypt через Posh-ACME (DNS-плагин Beget) и установка на RD Gateway. Для планировщика: одно задание раз в сутки с наивысшими правами. Сохранять в UTF-8 with BOM. |
25+
| `1CDefenderExclusion.bat` | Лаунчер для `1CDefenderExclusion.ps1` (запуск двойным кликом). |
26+
27+
### windows/oobe/
28+
29+
Автоматизация чистой установки Windows.
30+
31+
| Файл | Назначение |
32+
|---|---|
33+
| `AutoUnattend.xml` | Файл ответов для автоустановки Windows: локали, пропуск сетевой настройки, создание локального администратора `Admin`. |
34+
| `oobe.ps1` | Автоматизация этапа OOBE через скачивание файла ответов. |
35+
36+
> ⚠️ Создаётся локальный администратор `Admin/Admin` — сразу после установки смените пароль. Заглушки `CHANGE_ME` в конфиге замените своими значениями.
2137
2238
## pgsql/
2339

@@ -42,6 +58,27 @@ zabbix/ Шаблоны Zabbix
4258

4359
> ⚠️ Перед использованием замените в конфигах и скриптах IP-адреса, пароль keepalived и учётные данные репликации на свои (пароль репликации — через `~postgres/.pgpass`, права 600).
4460
61+
## routeros/
62+
63+
Скрипты и конфиги для MikroTik RouterOS.
64+
65+
| Файл | Назначение |
66+
|---|---|
67+
| `autorun.scr` | Шаблон первичной настройки роутера: адресация, отключение небезопасных сервисов (telnet, ftp, api и т.д.), NTP, часовой пояс. Замените `CHANGE_ME` на свой пароль. |
68+
| `check-isp.rsc` | Проверка доступности двух провайдеров пингом и сброс соединений упавшего канала (для dual-WAN). |
69+
| `cloudflare-ip-updater.rsc` | Обновление address-list `CF` актуальными IPv4-подсетями Cloudflare (по расписанию). |
70+
| `telegram-ip-updater.rsc` | Обновление address-list `TG` актуальными IPv4-подсетями Telegram (по расписанию). |
71+
| `ospf_filter_rules` | Фильтры OSPF: принимать только частные подсети (RFC 1918). |
72+
| `routerboard_fwupgrade` | Задание планировщика: автообновление прошивки RouterBOARD с перезагрузкой. |
73+
| `routerboard_starwars` | Имперский марш на системном динамике после загрузки. |
74+
| `docs/` | Документы: чек-лист настройки роутера, продуктовая матрица MikroTik. |
75+
76+
## proxmox/
77+
78+
| Скрипт | Назначение |
79+
|---|---|
80+
| `chr_install.sh` | Развёртывание VM с MikroTik CHR на Proxmox VE: скачивание образа нужной версии, создание диска и виртуальной машины. Интерактивный. |
81+
4582
## linux/
4683

4784
| Файл | Назначение |

proxmox/chr_install.sh

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
#!/bin/bash
2+
3+
#vars
4+
version="nil"
5+
vmID="nil"
6+
7+
echo "############## Start of Script ##############
8+
9+
## Checking if temp dir is available..."
10+
if [ -d /root/temp ]
11+
then
12+
echo "-- Directory exists!"
13+
else
14+
echo "-- Creating temp dir!"
15+
mkdir /root/temp
16+
fi
17+
# Ask user for version
18+
echo "## Preparing for image download and VM creation!"
19+
read -p "Please input CHR version to deploy (6.38.2, 6.40.1, etc):" version
20+
# Check if image is available and download if needed
21+
if [ -f /root/temp/chr-$version.img ]
22+
then
23+
echo "-- CHR image is available."
24+
else
25+
echo "-- Downloading CHR $version image file."
26+
cd /root/temp
27+
echo "---------------------------------------------------------------------------"
28+
wget https://download.mikrotik.com/routeros/$version/chr-$version.img.zip
29+
unzip chr-$version.img.zip
30+
echo "---------------------------------------------------------------------------"
31+
fi
32+
if [ ! -f /root/temp/chr-$version.img ]
33+
then
34+
echo "-- Error downloading CHR $version image file!"
35+
exit 0
36+
fi
37+
# List already existing VM's and ask for vmID
38+
echo "== Printing list of VM's on this hypervisor!"
39+
qm list
40+
echo "== Printing list of CT's on this hypervisor!"
41+
pct list
42+
echo ""
43+
read -p "Please Enter free vm ID to use:" vmID
44+
echo ""
45+
# Create storage dir for VM if needed.
46+
if [ -f /etc/pve/nodes/pve/qemu-server/$vmID.conf ]
47+
then
48+
echo "-- VM exists! Try another vm ID!"
49+
exit 0
50+
fi
51+
if [ -f /etc/pve/nodes/pve/lxc/$vmID.conf ]
52+
then
53+
echo "-- CT exists! Try another vm ID!"
54+
exit 0
55+
fi
56+
echo "-- Creating VM image dir!"
57+
mkdir /var/lib/vz/images/$vmID
58+
# Creating qcow2 image for CHR.
59+
read -p "Please input image size, GB:" imgsize
60+
echo "-- Converting image to qcow2 format "
61+
qemu-img convert \
62+
-f raw \
63+
-O qcow2 \
64+
/root/temp/chr-$version.img \
65+
/var/lib/vz/images/$vmID/vm-$vmID-disk-1.qcow2
66+
if [ $imgsize -ne 0 ]
67+
then
68+
echo "-- Resize image to $imgsize GB"
69+
qemu-img resize \
70+
/var/lib/vz/images/$vmID/vm-$vmID-disk-1.qcow2 +${imgsize}G
71+
fi
72+
# Creating VM
73+
echo "-- Creating new CHR VM"
74+
qm create $vmID \
75+
--name chr-$version \
76+
--net0 virtio,bridge=vmbr0 \
77+
--bootdisk virtio0 \
78+
--ostype l26 \
79+
--memory 256 \
80+
--onboot no \
81+
--sockets 1 \
82+
--cores 1 \
83+
--virtio0 local:$vmID/vm-$vmID-disk-1.qcow2
84+
echo "############## End of Script ##############"

routeros/autorun.scr

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/ip address
2+
add address= interface=ether1 network=10.0.0.1
3+
/ip route
4+
add dst-address=0.0.0.0/0 gateway=10.0.0.1
5+
/ip dhcp-client
6+
add interface=ether1 disabled=yes
7+
/user
8+
set 0 password="CHANGE_ME"
9+
/ip service
10+
set telnet disabled=yes
11+
set ftp disabled=yes
12+
set www disabled=yes
13+
set api disabled=yes
14+
set api-ssl disabled=yes
15+
/ip neighbor discovery-settings
16+
set discover-interface-list=none
17+
/tool mac-server
18+
set allowed-interface-list=none
19+
/tool mac-server mac-winbox
20+
set allowed-interface-list=none
21+
/tool mac-server ping
22+
set enabled=no
23+
/ipv6 settings
24+
set disable-ipv6=yes
25+
/system clock
26+
set time-zone-name=Asia/Yekaterinburg
27+
/system ntp client
28+
set enabled=yes
29+
/system ntp client servers
30+
add address=pool.ntp.org

routeros/check-isp.rsc

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
:local PingCount 5;
2+
:local CheckIp1 77.88.8.8;
3+
:local CheckIp2 77.88.8.1;
4+
:local isp1 [/ping $CheckIp1 count=$PingCount interface="ether1"];
5+
:local isp2 [/ping $CheckIp2 count=$PingCount interface="ether2"];
6+
7+
:if ($isp1=0) do={
8+
:delay 2
9+
:log warning "ISP1 down";
10+
/ip firewall connection remove [ find where connection-mark="con-isp1"];
11+
:delay 2
12+
:log warning "ISP1 connection reset";
13+
}
14+
:if ($isp2=0) do={
15+
:delay 2
16+
:log warning "ISP2 down";
17+
/ip firewall connection remove [ find where connection-mark="con-isp2"];
18+
:delay 2
19+
:log warning "ISP2 connection reset";
20+
}

routeros/cloudflare-ip-updater.rsc

Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
# CloudFlare IP Address List Updater (IPv4 only)
2+
# Работает на RouterOS 6.x и 7.x
3+
# Скачивает и обновляет список IPv4-адресов CloudFlare
4+
#
5+
# Установка:
6+
# /system script add name=cloudflare-ip-updater source={ ... код ... }
7+
# /system script run cloudflare-ip-updater
8+
#
9+
# Автозапуск:
10+
# /system scheduler add name=cloudflare-update interval=7d on-event=cloudflare-ip-updater start-time=03:31:00
11+
12+
:local url "https://www.cloudflare.com/ips-v4/#"
13+
:local listName "CF"
14+
:local tempFile "cloudflare-ips.txt"
15+
16+
# --- 1. Удаляем старый файл ---
17+
:do {
18+
/file remove $tempFile
19+
:delay 1s
20+
} on-error={}
21+
22+
:log info "CloudFlare IP updater: Downloading $url..."
23+
24+
# --- 2. Скачиваем файл ---
25+
:do {
26+
/tool fetch url=$url dst-path=$tempFile
27+
} on-error={
28+
:log error "CloudFlare IP updater: Fetch command failed"
29+
:error "Fetch failed"
30+
}
31+
32+
# --- 3. Ждём завершения загрузки ---
33+
:local maxWait 30
34+
:local waited 0
35+
:while ([:len [/file find name=$tempFile]] = 0 && $waited < $maxWait) do={
36+
:delay 1s
37+
:set waited ($waited + 1)
38+
}
39+
40+
:if ($waited >= $maxWait) do={
41+
:log error "CloudFlare IP updater: Download timeout"
42+
:error "Download timeout"
43+
}
44+
45+
:delay 2s
46+
47+
# --- 4. Проверка файла ---
48+
:if ([:len [/file find name=$tempFile]] = 0) do={
49+
:log error "CloudFlare IP updater: File not found after download"
50+
:error "Download failed"
51+
}
52+
53+
:local fileSize [/file get $tempFile size]
54+
:if ($fileSize = 0) do={
55+
:log error "CloudFlare IP updater: Downloaded file is empty"
56+
/file remove $tempFile
57+
:error "Empty file"
58+
}
59+
60+
:log info "CloudFlare IP updater: File downloaded successfully ($fileSize bytes)"
61+
62+
# --- 5. Очищаем старые записи ---
63+
:local oldCount [:len [/ip firewall address-list find list=$listName]]
64+
:if ($oldCount > 0) do={
65+
/ip firewall address-list remove [find list=$listName]
66+
:log info "cloudflare IP updater: Removed $oldCount old entries from '$listName'"
67+
}
68+
69+
# --- 6. Читаем файл и добавляем новые записи ---
70+
:local content [/file get $tempFile contents]
71+
:local start 0
72+
:local len [:len $content]
73+
:local count 0
74+
:local skipped 0
75+
76+
:while ($start < $len) do={
77+
:local pos [:find $content "\n" $start]
78+
:if ([:typeof $pos] = "nil") do={
79+
:set pos $len
80+
}
81+
82+
:local line [:pick $content $start $pos]
83+
84+
# Убираем \r
85+
:local crPos [:find $line "\r"]
86+
:if ([:typeof $crPos] != "nil") do={
87+
:set line [:pick $line 0 $crPos]
88+
}
89+
90+
# Убираем пробелы в начале
91+
:while ([:len $line] > 0 && [:pick $line 0 1] = " ") do={
92+
:set line [:pick $line 1 [:len $line]]
93+
}
94+
95+
# Убираем пробелы в конце
96+
:while ([:len $line] > 0 && [:pick $line ([:len $line] - 1)] = " ") do={
97+
:set line [:pick $line 0 ([:len $line] - 1)]
98+
}
99+
100+
# Пропускаем пустые строки и комментарии
101+
:if ([:len $line] > 0 && [:pick $line 0 1] != "#") do={
102+
# Простая проверка: если есть двоеточие - это IPv6, пропускаем
103+
:local colonPos [:find $line ":"]
104+
105+
:if ([:typeof $colonPos] = "nil") do={
106+
# Нет двоеточия - пробуем добавить как IPv4
107+
:do {
108+
/ip firewall address-list add list=$listName address=$line comment="cloudflare IPv4"
109+
:set count ($count + 1)
110+
} on-error={
111+
:set skipped ($skipped + 1)
112+
:log warning "cloudflare IP updater: Skipped invalid IPv4 line: '$line'"
113+
}
114+
} else={
115+
:set skipped ($skipped + 1)
116+
}
117+
}
118+
:set start ($pos + 1)
119+
}
120+
121+
# --- 7. Убираем временный файл ---
122+
/file remove $tempFile
123+
124+
# --- 8. Финальный лог ---
125+
:if ($count > 0) do={
126+
:log info "cloudflare IP updater: Successfully added $count IPv4 entries to address list '$listName' (skipped $skipped IPv6 entries)"
127+
} else={
128+
:log warning "cloudflare IP updater: No valid IPv4 entries found! (skipped $skipped entries)"
129+
}
359 KB
Binary file not shown.
50 KB
Binary file not shown.

routeros/ospf_filter_rules

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
/routing filter rule
2+
add chain=ospf-in disabled=no rule="if (dst in 192.168.0.0/16 && dst-len in 16-32) {accept;}"
3+
add chain=ospf-in disabled=no rule="if (dst in 10.0.0.0/8 && dst-len in 8-32) {accept;}"
4+
add chain=ospf-in disabled=no rule="if (dst in 172.16.0.0/12 && dst-len in 12-32) {accept;}"
5+
add chain=ospf-out disabled=no rule="if (dst in 192.168.0.0/16 && dst-len in 16-32) {accept;}"
6+
add chain=ospf-out disabled=no rule="if (dst in 10.0.0.0/8 && dst-len in 8-32) {accept;}"
7+
add chain=ospf-out disabled=no rule="if (dst in 172.16.0.0/12 && dst-len in 12-32) {accept;}"

routeros/routerboard_fwupgrade

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
/system scheduler
2+
add name=routerboard_fwupgrade on-event="if ([/system routerboard get current-firmware] != [/system routerboard get upgrade-firmware]) do={\r\
3+
\n/system routerboard upgrade\r\
4+
\n:delay 15s\r\
5+
\n/system reboot\r\
6+
\n}" policy=reboot,read,write,sensitive start-time=startup

routeros/routerboard_starwars

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/system scheduler
2+
add name=starwars on-event=":delay 15;\r\
3+
\n \r\
4+
\n:beep frequency=500 length=500ms;:delay 500ms;\r\
5+
\n:beep frequency=500 length=500ms;:delay 500ms;\r\
6+
\n:beep frequency=500 length=500ms;:delay 500ms;\r\
7+
\n:beep frequency=400 length=500ms;:delay 400ms;\r\
8+
\n:beep frequency=600 length=200ms;:delay 100ms;\r\
9+
\n:beep frequency=500 length=500ms;:delay 500ms;\r\
10+
\n:beep frequency=400 length=500ms;:delay 400ms;\r\
11+
\n:beep frequency=600 length=200ms;:delay 100ms;\r\
12+
\n:beep frequency=500 length=500ms;:delay 1000ms;\r\
13+
\n \r\
14+
\n:beep frequency=750 length=500ms;:delay 500ms;\r\
15+
\n:beep frequency=750 length=500ms;:delay 500ms;\r\
16+
\n:beep frequency=750 length=500ms;:delay 500ms;\r\
17+
\n:beep frequency=810 length=500ms;:delay 400ms;\r\
18+
\n:beep frequency=600 length=200ms;:delay 100ms;\r\
19+
\n:beep frequency=470 length=500ms;:delay 500ms;\r\
20+
\n:beep frequency=400 length=500ms;:delay 400ms;\r\
21+
\n:beep frequency=600 length=200ms;:delay 100ms;\r\
22+
\n:beep frequency=500 length=500ms;:delay 1000ms;" policy=reboot,read,write \
23+
start-time=startup

0 commit comments

Comments
 (0)