diff --git a/src/content/blog/02-KMS-service.md b/src/content/blog/02-KMS-service.md new file mode 100644 index 0000000..5965e7c --- /dev/null +++ b/src/content/blog/02-KMS-service.md @@ -0,0 +1,209 @@ +--- +title: "Активация Windows в организации через KMS server" +summary: "Небольшой гайд об активации операционной windows 7/8/10/11 server без установки crack и отключения антивируса." +date: "June 11 2024" +draft: false +tags: +- Windows 11 +- Windows 10 +- Windows server +- KMS +- Активация windows +--- +> Дисклаймер. Данная статья предоставляется в образовательных целях и не предполагает использование рассмотренного продукта для незаконной активации Windows или Office. Мы не поддерживает использование нелицензионного ПО ни в каком виде. + +В данной статье будет описан процесс настройки сервера активации продуктов Microsoft в небольшой корпоративной сети с использованием дистрибутива от @Wind4, доступного на GitHub по ссылке . Для этого потребуется операционная система Debian/Ubuntu, CentOS/Fedora или любая другая по вашему усмотрению, включая даже BusyBox, если вы имеете достаточные навыки для работы с ним. +# Установка +### Система требований +| | | +| --------- | ----------------- | +| Процессор | 1 ядро / > 2 Ггц | +| Озу | > 1Гб | + +Этого достаточно для создания только KMS-сервера, но ничто не мешает использовать этот сервер для размещения ботов и других полезных инструментов, не забудьте увеличить мощность по потребности. + +- Далее все делаем из под **root** прав. + +## Шаг первый, подготовка +### CentOS\Fedora\RHEL +``` sh +dnf update +dnf install git gcc make netstat +``` +### debian\Ubuntu +``` sh +apt update +apt install git gcc make netstat +``` +#### Установки сетевого экрана (firewall) +``` sh +apt install iptables +``` + +или + +``` sh +apt install firewalld +``` + +смотря кому что нравиться, **можно и без него**. + +## Шаг второй +``` sh +git clone https://github.com/Wind4/vlmcsd +cd vlmcsd +make +cd bin +./vlmcsd +``` +Далее наблюдаем ответ сервера +>Connecting to 127.0.0.1:1688 ... successful +>Sending activation request (KMS V6) 1 of 1 -> 55041-00206-559-475403-03-1076-6002.0000-1482020 (3A1C049600B60076) + +По умолчанию vlmcsd слушает на стандартном порту KMS — TCP/1688. + +## Шаг третий firewall + +Если вы не хотите затруднять себя настройкой firewalld\iptables, можно пропустить этот шаг. Однако, если вам необходимо разрешить подключения клиентов к серверу через firewalld\iptables, вам нужно выполнить следующие команды: + +**firewall-cmd** +``` sh +firewall-cmd --list-port +firewall-cmd --zone=public --add-port=1688/tcp +firewall-cmd --reload +netstat -ntlp | grep LISTEN +``` +**iptables** +``` sh +iptables -A INPUT -p tcp --dport 1688 -j ACCEPT +service iptables save +service iptables restart +netstat -ntlp | grep LISTEN +``` + +## Шаг четвертый Автозапуск демона + +Делаем автоматический старт при запуске сервера +``` sh +cp vlmcsd /usr/bin +cp vlmcs /usr/bin +touch /etc/systemd/system/kms-autostart.service +chmod 664 /etc/systemd/system/kms-autostart.service +nano /etc/systemd/system/kms-autostart.service +``` + +Добавляем в файл следущие параметры +``` sh +[Unit] +Description=Microsoft KMS Server +After=network.target +After=network-online.target +Wants=network-online.target + +[Service] +Type=oneshot +ExecStart=/usr/bin/vlmcsd +RemainAfterExit=yes +LimitNOFILE=65536 + +[Install] +WantedBy=multi-user.target +``` + +Выпускаем демона +``` sh +systemctl daemon-reload +systemctl start kms-autostart.service +systemctl status kms-autostart.service +systemctl enable kms-autostart.service +``` +## Шаг пятый, запись на DNS сервер в доменной сети + +Команада для **PowerShell** +``` ps1 +Add-DnsServerResourceRecord -Srv -Name "_VLMCS._tcp" -ZoneName "fipi.pro" -DomainName "192.168.0.2" -Priority 0 -Weight 0 -Port 1688 +``` +Редактируйте под себя. +- ZoneName "fipi.pro" – Зона в вашей доменной сети. +- 192.168.0.2 – IP адрес вашего Linux сервера со службой KMS. + +Теперь все хосты Windows (и Office) в домене будут автоматически активироваться на KMS сервере, если на них установлен публичный ключ корпоративной активации (GVLK). + +### Вот краткий список часто исполбзуюмых ключей. +| Operating system edition | KMS Client Product Key | +| ------------------------------- | ----------------------------- | +| Windows Server 2022 Standard | VDYBN-27WPP-V4HQT-9VMD4-VMK7H | +| Windows Server 2022 Datacenter | WX4NM-KYWYW-QJJR4-XV3QB-6VM33 | +| Windows 11 \ 10 Pro | W269N-WFGWX-YVC9B-4J6C9-T83GX | +| Windows 8.1 Pro | GCRJD-8NW9H-F2CDX-CCM8D-9D6T9 | +| Windows 7 Professional | FJ82H-XT6CR-J8D7P-XQJJ2-GPDD4 | + +В для остальных версий ключи подбирайте здесь: +> +## Шаг активации клинтов + +Для ручной активации Windows нужно задать GVLK ключ для вашей версии Windows, адрес сервера KMS активации и выполнить команду активации. Используются следующие команды (например, для Windows Server 2022 Std): + +Команада для **PowerShell** от ***прав Администратора*** +``` ps1 +slmgr.vbs -ipk VDYBN-27WPP-V4HQT-9VMD4-VMK7H +slmgr.vbs -skms 192.168.0.2 +slmgr.vbs -ato +``` +Для Активации Microsoft Office 2021/2019 + +``` ps1 +cd C:\Program Files\Microsoft Office\Office16 +cscript ospp.vbs /sethst: 192.168.0.2 +cscript ospp.vbs /act +``` + +В некоторых версия windows команда будет такая + +``` ps1 +cd 'C:\Program Files\Microsoft Office\Office16\' +cscript ospp.vbs /sethst: 192.168.0.2 +cscript ospp.vbs /act +``` + +Для Активации Microsoft Office 2016 + +``` ps1 +cd C:\Program Files\Microsoft Office\Office15 +cscript ospp.vbs /sethst: 192.168.0.2 +cscript ospp.vbs /act +``` + +## Шаг активации Windows server 2022 + +Качаем оригинальную версию Winodws Server 2022 +> + +И до ввода ключа активации получаем ServerStandardEval + +Проверяем возможные версии для обновления: +``` ps1 +DISM /online /Get-TargetEditions +``` +В данном случае мы хотим выполнить апгрейд Eval редакции до Retail версии Windows Server 2022 Standard. Найдите и скопируйте GVLK ключ для этой версии и редакции Windows Server из таблицы и выполните команду: +``` ps1 +dism /online /set-edition:ServerStandard /productkey:xxxxx-xxxxx-xxxxx-xxxxx-xxxxx /accepteula +``` +Перезагружаемся и деалем активацию как было описанно выше. +``` ps1 +slmgr /skms 192.168.0.2:1688 +slmgr /ato +``` + +#### Вдруг пригодиться + +Удалите текущий GVLK ключ: +``` ps1 +slmgr.vbs /upk +slmgr.vbs /cpky +``` + +Проверьте, что Windows активирована: +``` ps1 +Get-CimInstance SoftwareLicensingProduct -Filter "Name like 'Windows%'" | where { $_.PartialProductKey } | select Description, LicenseStatus +``` diff --git a/src/content/blog/03-BOT-Support.md b/src/content/blog/03-BOT-Support.md new file mode 100644 index 0000000..7e6c059 --- /dev/null +++ b/src/content/blog/03-BOT-Support.md @@ -0,0 +1,243 @@ +--- +title: "Хватит терять заявки пользователей" +summary: "Пора сделать бота для принятия заявок от пользователей всем IT отделом." +date: "June 12 2024" +draft: false +tags: +- Python +- Telegram +- BOT +--- +# Бот техподдержки пользователя + +Пользователи пишут свои вопросы боту компании, бот пересылает эти сообщения в чат поддержки, сотрудники поддержки отвечают на эти сообщения через reply. Основной плюс - анонимизация сотрудников поддержки. + +Бот работает в режиме webhook, но может работать и в режиме polling. + +Для обхода запрета на пересылку сообщений у пользователя, бот копирует содержимое и уже затем отправляет его в чат поддержки. + +По умолчанию бот отправляет сообщения в один чат поддержки с id, указанным в переменных окружения .env. + +## Бот умеет + +- Пересылать сообщения, документы, аудио и видео от пользователя в группу к администраторам и обратно +- Выдавать информацию о пользователе из Telegram +- Выдавать месячный отчет и отчет за указанный интервал дат по количеству обращений и общему числу сообщений и ответов +- Банить и разбанивать пользователей + +## Типы контента, которые может пересылать бот + +- Текстовые сообщения +- Фотографии +- Группы фотографий (пересылаются по одной) +- Видео +- Аудиозаписи +- Файлы + +## Разворачивание образа на личном или vps сервере + +### Настройка Nignx + +Предполагается, что у вас есть готовый настроенный VPS сервер с установленным nginx. + +1. Перейти в каталог nginx `sites-available`: + +``` sh +cd /etc/nginx/sites-available/ +``` + +2. Создайте файл с именем вашего домена: + +``` sh +nano domain.example.com +``` + +3. Внутри файла напишите: + +``` sh +server { + listen 80; + + server_name domain.example.com; + + location /telegram/ { + proxy_set_header Host $http_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; + proxy_pass http://127.0.0.1:7772; + } +} +``` + +`server_name` - ваш домен с подключенным SSL сертификатом (например, Let's Encrypt). Вместо `/telegram/` можно написать любой путь, на который должны приниматься данные. Этот же путь нужно указать в `.env` файле. + +4. Создайте символическую ссылку в каталоге `sites-enabled` + +```sh +sudo ln -s /etc/nginx/sites-available/domain.example.com /etc/nginx/sites-enabled/ +``` +5. Проверьте конфигурацию nginx на ошибки: +```sh +sudo nginx -t +``` + +6. Перезапустить службу nginx: +```sh +sudo systemctl restart nginx +``` + +7. Установить certbot: +``` sh +sudo apt install -y certbot python3-certbot-nginx +``` + +8. Установите HTTPS соединение, выпустив SSL сертификат с помощью certbot для вашего домена: +```sh +sudo certbot --nginx +``` +9. Добавить автоматическое обновление сертификата: +```sh +sudo certbot renew --dry-run +``` + +Можно на всякий случай еще раз перезапустить nginx. + +### Запуск бота + +1. Создайте бота через BotFather (см. ниже), добавьте бота в группу с сотрудниками поддержки, дайте боту права администратора, узнайте id группы (см. ниже). +2. Скопируйте этот репозиторий на сервер любым удобным способом. +3. Создайте .env файл в корне со следующим содержанием: +```sh +TELEGRAM_TOKEN=<телеграм_токен_вашего_бота> +GROUP_ID= +WEBHOOK_DOMAIN=domain.example.com +WEBHOOK_PATH=/telegram/ +APP_HOST=0.0.0.0 +APP_PORT=7772 +DATABASE_URL=postgresql+asyncpg://:@:5432/support_bot_db +DB_HOST=<имя_контейнера_с_БД> +DB_PORT=5432 +POSTGRES_USER= +POSTGRES_PASSWORD= +START_MESSAGE=<Приветственное сообщение бота, когда клиент нажимает кнопку start> +``` +В качестве теста логин пользователя БД, пароль и название БД можно указать postgres. Только для теста, не для продакшена! + +4. Запустить сборку docker-образа и его запуск из файла `docker-compose`: +```sh +sudo docker-compose up -d --build +``` +Ключ `-d` для того чтобы контейнер запустился в фоне. + +5. Зайдите в контейнер с базой данных, создайте базу данных, выдайте права на нее пользователю (в данном случае postgres): +```sh +docker exec -it support-bot-db psql -U postgres +\l #убеждаемся, что базы данных нет +create database support_bot_db; +grant all privileges on database support_bot_db to postgres; +\q #выходим из psql +``` + +6. Применить миграции: +```sh +docker exec -it support-bot alembic upgrade head +``` + +### Где что брать +1. `WEBHOOK_DOMAIN` - домен с подключенным ssl сертификатом +2. `WEBHOOK_PATH` - URL путь после домена. В данном случае `WEBHOOK_DOMAIN` + `WEBHOOK_PATH` будет `domain.example.com/telegram/`. +3. Token получаем при создании бота через BotFather [BotFather](https://t.me/BotFather). +4. Свой личный id или id группы можно узнать через бота [myidbot](https://t.me/myidbot). Узнать свой id - написать боту в личку, узнать id группы - добавить бота в чат группы (например группы поддержки), затем ввести команду `/getgroupid`. +5. `APP_HOST` - IP, на котором будет работать приложение (по умолчанию на хосте `127.0.0.1`, `localhost` или можно указать `0.0.0.0`). +6. `APP_PORT` - порт, который приложение будет использовать. Порт должен быть уникальным и не дублировать порты других приложений, работающих на сервере или в Docker. + +## Запуск в режиме polling (на локальном компьютере) +1. Скопируйте репозиторий на локальный компьютер. +2. Создайте файл `.env` (см. выше). +3. В файле `.env` удалить (закомментировать) `WEBHOOK_DOMAIN`. Пропишите свои переменные окружения. Так же пропишите переменные окружения в файле `docker-compose-postgres-localhost.yaml` +4. Установить виртуальное окружение, активировать его, + установить зависимости из `requirements.txt`: +```sh +python -m venv venv +pip install -r requirements.txt +``` +5. В докере запустить контейнер с базой данных из файла `docker-compose-postgres-localhost.yaml`: +```sh +docker-compose -f docker-compose-postgres-localhost up -d +``` +6. Применить миграцию. +```sh +alembic upgrade head +``` +7. Если alembic ругается, что базы данных не существует, создайте ее вручную и выйдите из psql. Затем попробуйте выполнить миграцию повторно: +```sh +docker exec -it postgres psql -U postgres +# далее в psql +create database support_bot_db; +grant all privileges on database support_bot_db to postgres; +``` +8. Запустить `main.py`: +```sh +python main.py +``` +Для запуска необходим python 3.9 или выше. + +## Команды бота +В **чате поддержки** доступны следующие команды: + +`/info` - Команда вводится через reply на вопрос пользователя и выдает информацию о нем (имя, фамилия, id, никнейм, а также количество сообщений от пользователя и ответов пользователю. Последние два берутся из созданной базы данных). + +`/report` - Отчет по количеству клиентов за месяц, сообщений от них и количество ответов администраторов. + +`/report 01.01.2020 15.06.2024` - Отчет за выбранный период. Две любые даты через пробел, по шаблону. + +`/ban` - Команда вводится через reply на вопрос пользователя. Банит пользователя. Сообщения от него будут игнорироваться ботом. +`/unban` - Команда вводится через reply на вопрос пользователя. Разбанивает пользователя. + +`/banlist` - Список забаненных пользователей. Выводит список пользователей в формате `id - имя_фамилия`. + +`/registeradmin` - Регистрирует нового администратора в чате поддержки. Также администратор регистрируется автоматически, если ответит на сообщение клиента через reply. Это сделано на случай, если забыли зарегистрировать администратора, а он уже отвечает на сообщения. + +`/deleteadmin` - Удаляет права администратора у пользователя в чате поддержки. После удаления прав администратора нужно вручную удалить пользователя из группы Telegram. + +## Автозапуск бота +1. Создание службы: +Создайте файл службы для вашего бота, например `my_bot.service`: +```sh +sudo nano /etc/systemd/system/my_bot.service +``` +2. Редактирование службы: +Внесите следующие настройки в файл службы: +```sh +[Unit] +Description=My Python Telegram Bot +After=network.target + +[Service] +User=your_username +Group=your_groupname +WorkingDirectory=/path/to/your/bot +ExecStart=/path/to/your/python /path/to/your/bot/main.py +Restart=always + +[Install] +WantedBy=multi-user.target +``` +Замените `your_username`, `your_groupname`, `/path/to/your/bot`, и `/path/to/your/python` на соответствующие значения для вашей среды. Убедитесь, что `ExecStart` указывает на правильный путь к вашему скрипту Python бота. + +3. Перезагрузка systemd: +После того как вы сохранили изменения, перезагрузите systemd для применения новой службы: +```sh +sudo systemctl daemon-reload +``` +4. Управление службой: +Теперь вы можете управлять вашим ботом как службой. Например, чтобы запустить его и настроить автозапуск при загрузке системы, выполните следующие команды: +```sh +sudo systemctl start my_bot +sudo systemctl enable my_bot +``` +Чтобы проверить статус вашей службы, выполните: +```sh +sudo systemctl status my_bot +``` \ No newline at end of file diff --git a/src/content/blog/04-office-2021.md b/src/content/blog/04-office-2021.md new file mode 100644 index 0000000..c9bd485 --- /dev/null +++ b/src/content/blog/04-office-2021.md @@ -0,0 +1,82 @@ +--- +title: "Установливаем последний Microsoft Office с официального сайта." +summary: "Инструкция по установке последней версии Microsoft Office с официального сайта. В статье описаны шаги загрузки установочного файла, процесс установки и активации Office, а также советы по устранению возможных проблем." +date: "June 13 2024" +draft: false +tags: +- Microsoft Office +--- +> Дисклаймер. Данная статья предоставляется в образовательных целях и не предполагает использование рассмотренного продукта для незаконной активации Windows или Office. Мы не поддерживает использование нелицензионного ПО ни в каком виде. + +# Качаем + +Скачайте Microsoft Office Deployment Tool + +> + +Запускаем файл **officedeploymenttool_17531-20046.exe** и распакуйте содержимое Office Click-to-Run Administrator Tool в локальный каталог на компьютере. + +В каталоге установки находятся четыре XML файла с образцами конфигурации: __configuration-Office365-x64.xml__, __configuration-Office365-x86.xml__, __configuration-Office2021Enterprise.xml__ и __configuration-Office2021Enterprise.xml__. Программа setup.exe используется для загрузки дистрибутива и установки пакета Office на клиенте. + +Пример конфигурационного файла *.xml: +``` xml + + + + + + + + + + + + + + + + +``` + +Рассмотрим основные параметры: + +- `OfficeClientEdition="64"` – установка 64-битной версии Office 2021;; +- `Channel="PerpetualVL2021"` – установка Office 2021 по системе корпоративного лицензирования (Volume License); +- `` — установка английской версии Office. Для русской версии укажите ru-ru; +- `` — удаление старых версий Office, установленных через Windows MSI. Этот параметр закомментирован, но его нужно включить перед установкой Office 2021, чтобы избежать ошибок; +- `` — указание компонентов пакета Office (например, ProPlus2021Volume, ProjectPro2021Volume, VisioPro2021Volume), которые нужно установить. В параметре `PIDKEY=""` можно указать ваш корпоративный ключ (обычно это MAK ключ); +- Используя директиву ``, можно установить только выбранные приложения Office (по умолчанию установщик C2R устанавливает все приложения пакета Office). + +Подробное описание всех параметров: + +> + +Создание файла конфигурации под ваши конкретные параметры: + +> + +После создания XML файла, скачайте дистрибутив для установки Office 2021. Выполните команду: + +``` bash +Setup.exe /download configuration-Office2021Enterprise.xml +``` +- В случае неудачи скачивания, запустите VPN, можете воспользоваться нашим сервисом. + +> + +После завершения загрузки в каталоге Microsoft Office Deployment Tool появится папка Office (содержит cab и dat файлы для установки Office 2021) размером около 2 Гб. + +## Локальная установка +Для начала установки Office 2021 выполните команду: +``` bash +Setup.exe /configure configuration-Office2021Enterprise.xml +``` +После завершения установки Office 2021 Enterprise или любого другого пакета, вы можете активировать продукт. + +## Сетевая установка +Полученный пакет можно использовать для установки Office 2021 на компьютеры пользователей. Чтобы каждый компьютер не загружал установочные файлы Office 2021 из сети CDN, а использовал локальную копию, укажите путь к каталогу с файлами установки Office в XML файле. Например: + +``` xml + +``` +Теперь вы можете скопировать каталог Microsoft Office Deployment Tool с XML файлами и дистрибутивом Office 2021 в сетевой каталог или на сервер SCCM. diff --git a/src/layouts/ArticleTopLayout.astro b/src/layouts/ArticleTopLayout.astro index 5e121df..6498dae 100644 --- a/src/layouts/ArticleTopLayout.astro +++ b/src/layouts/ArticleTopLayout.astro @@ -1,6 +1,6 @@ --- -import type { CollectionEntry } from "astro:content" import { formatDate, readingTime } from "@lib/utils" +import type { CollectionEntry } from "astro:content" type Props = { entry: CollectionEntry<"projects"> | CollectionEntry<"blog"> @@ -21,7 +21,7 @@ const repoUrl = collection === "projects" ? data.repoUrl : null
- Back to {collection} + Вернуться в {collection}
diff --git a/src/lib/utils.ts b/src/lib/utils.ts index 067d9f6..141aeb6 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -6,7 +6,7 @@ export function cn(...inputs: ClassValue[]) { } export function formatDate(date: Date) { - return Intl.DateTimeFormat("en-US", { + return Intl.DateTimeFormat("ru-RU", { month: "short", day: "2-digit", year: "numeric" diff --git a/src/pages/work/index.astro b/src/pages/work/index.astro index c645d98..a60bc5d 100644 --- a/src/pages/work/index.astro +++ b/src/pages/work/index.astro @@ -1,9 +1,9 @@ --- -import { getCollection } from "astro:content" +import { WORK } from "@consts" +import BottomLayout from "@layouts/BottomLayout.astro" import PageLayout from "@layouts/PageLayout.astro" import TopLayout from "@layouts/TopLayout.astro" -import BottomLayout from "@layouts/BottomLayout.astro" -import { WORK } from "@consts" +import { getCollection } from "astro:content" const collection = await getCollection("work") @@ -19,7 +19,7 @@ const work = await Promise.all( function formatWorkDate(input: Date | string) { if (typeof input === "string") return input - const month = input.toLocaleDateString("en-US", { + const month = input.toLocaleDateString("ru-RU", { month: "short", })