Files
Das-OS/TODO.md
T
dasandClaude Sonnet 5.5 8db767efb9
build / build (push) Successful in 21m56s
publisher, deployer: report ssh failure instead of BrokenPipeError (0.9.8)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 18:34:29 +02:00

24 KiB
Raw Blame History

Das OS — що зробити далі

Стан на 2026-10-25: версія 0.9.8 (не закомічено), етапи 1–8 готові (live ISO, власний репозиторій, оформлення, інсталятор Calamares зі знімками Btrfs, Go-утиліти das-update і das-welcome, серверний образ з консольним інсталятором, менші ISO, консольні помічники, профіль розробника), CI (етап 9: пакети й обидва ISO збираються на власному runner, ~45 хв).

Етап 5. Go-утиліти (готово, лишилися перевірки)

  • das-update: вікно, значок у треї (лише коли є оновлення), консольний режим --cli, знімок snapper pre/post, встановлення через pkexec, підказка про відкат.
  • das-welcome: вікно першого входу (встановлення в live-сесії, мова, теки, оновлення, налаштування, довідка).
  • Англійські назви тек: xdg-user-dirs 0.20 шукає переклади лише в першій теці XDG_DATA_DIRS з підкаталогом locale (порожня /usr/local/share/locale). Виправлено в das-settings (/etc/X11/xinit/xinitrc.d/50-das-user-dirs), уже створені теки перейменовує das-welcome.
  • Тести go test ./... (make test і під час збирання пакета).
  • Перевірено у встановленій системі на Btrfs (QEMU, UEFI): оновлення з вікна й --cli створює пару знімків pre/post, вони з'являються в меню GRUB, завантаження в знімок і snapper-rollback повертають попередню версію пакета; вибір мови в das-welcome діє після перезавантаження.
  • Виправлено після перевірки: версія в Calamares береться з VERSION; значок у треї ховається, коли оновлення встановлено поза ним (стежить за базою пакетів xbps); інструменти VirtualBox прибираються з не-VirtualBox машин (у KVM було повідомлення при кожному вході); live-сесія не блокує екран під час встановлення.
  • Live ISO 0.4.0: екран не блокується під час встановлення.
  • Вікно автентифікації polkit (xfce-polkit) англійською: перекласти або замінити агент.
  • Повідомити авторів xdg-user-dirs про помилку з XDG_DATA_DIRS.
  • Пункт «Профіль розробника» в das-welcome (етап 8).

Етап 6. Серверний образ (готово)

Live ISO без графіки з консольним інсталятором: dasos-server-<версія>-x86_64.iso.

  • Профіль server/ поруч із live/; build-iso.sh [desktop|server], цілі make iso-server і make qemu-server. Kernel cmdline console=tty0 console=ttyS0,115200, вхід і на послідовній консолі.
  • Метапакет das-server: openssh, chrony, dhcpcd, NetworkManager, docker + docker-compose, nftables, fail2ban, socklog-void, python3, curl, lazydocker, lazygit, mc, tmux, htop, das-snapshots, das-update, das-helpers, xtools-minimal.
  • Налаштування: nftables «закрито все, крім SSH» (лише своя таблиця inet das, правила Docker і fail2ban не чіпає), jail sshd через nftables з розбором журналу socklog, sshd PermitRootLogin prohibit-password, журнали Docker з ротацією (local).
  • dsv: list, status, enable, disable, start, stop, restart, logs [-f], автодоповнення bash; є й на десктопі.
  • das-update окремим підпакетом без GTK (вікно й трей — /usr/libexec/das/das-update-gui у das-tools).
  • das-server-install: TUI на dialog українською й англійською (диск, ім'я, користувач і пароль, SSH-ключ і заборона паролів, часовий пояс, розкладка, мова, dhcpcd/NetworkManager) і режим без запитань --config. GPT + Btrfs з тими ж підтомами, GRUB для UEFI (і запасний BOOTX64.EFI) та BIOS.
  • Спільний пакет das-install-common (mount-source, postinstall) для обох інсталяторів; das-snapper-setup вмикає dbus, без нього snapper не працює.
  • scripts/run-qemu.sh --serial.
  • Перевірено в QEMU: встановлення через TUI на UEFI (з SSH-ключем) і BIOS (з паролем, NetworkManager, ua-utf), вхід по SSH лише за ключем, docker run hello-world, опублікований порт nginx, fail2ban бачить невдалі входи, das-update --cli зі знімками pre/post, dsv.
  • das-server-install --config перевірено (0.5.0, UEFI).
  • Розмір ISO: див. нижче.
  • Запрошення до входу (/etc/issue) показувало версію ядра (\r agetty, 6.18): тепер версія Das OS з VERSION (@VERSION@ у branding/issue), серверний інсталятор переносить перший рядок у встановлену систему (0.9.2).
  • Українська в das-server-install на консолі показувалася латиницею («Ukra■ns'ka»): стандартний шрифт підміняє кирилицю схожими латинськими літерами, а setfont не спрацьовував, бо sudo запускає інсталятор у власному pty (tty → /dev/pts/N). Тепер setfont -C /dev/tty0 cyr-sun16 до вибору мови (перевірено в QEMU: «Гаразд їєіґ»).
  • Серед дисків для встановлення був дисковод /dev/fd0: тепер пропускається.
  • Перевірено серверний ISO 0.9.2 у QEMU: «Das OS Server 0.9.2 (tty1)» у запрошенні, «Українська» в меню мови, /dev/fd0 немає серед дисків.

Розмір ISO: 0.4.0 → 0.5.0

Десктоп 1,96 → 1,72 ГБ, сервер 1,57 → 1,14 ГБ.

  • initrd live-образу без драйверів amdgpu/radeon/nouveau/i915/xe і їхніх прошивок (--omit-drivers у виклику dracut у mklive): 245 → 89 МБ в обох ISO. Драйвери завантажуються з кореневої системи; десктоп у QEMU доходить до робочого столу.
  • Сервер без linux-firmware-nvidia, sof-firmware, alsa-firmware: mklive -g і /etc/xbps.d/das-server.conf (ignorepkg), тож оновлення їх не повертають. Службовий mklive-ignore.conf інсталятори видаляють.
  • squashfs з блоком 1 МБ і фільтром BCJ x86: десктоп −5 %; сервер разом із прошивками 1274 → 999 МБ.
  • Перевірити на реальному залізі з AMD/Intel/NVIDIA, що графіка вмикається після switch_root (у QEMU — virtio-gpu).
  • Переклади /usr/share/locale (265 МБ на десктопі, 98 МБ на сервері) лише для uk і en через noextract у xbps: ≈ −60…80 МБ на десктопі. Мінус: інші мови інтерфейсу доведеться доставляти перевстановленням пакетів.
  • Десктоп: зайві варіанти Papirus (ePapirus*, Papirus-Light) з 294 МБ іконок; з'ясувати, хто тягне gtk4, flite, ghostscript.
  • Не чіпати: Firefox (299 МБ), ядро й модулі (180 МБ), LLVM для Mesa (141 МБ), мережеві прошивки (442 МБ, Wi-Fi та мережеві карти).

Етап 7. Консольні помічники (готово)

Пакет das-helpers (на десктопі й сервері), спільні функції в /usr/lib/das/helpers.sh, українська й англійська, автодоповнення bash, запитання в терміналі й аргументи для скриптів.

  • dsv переїхав у das-helpers; dsv new (команда, користувач, каталог, змінні, журнал svlogd, перевірка, що служба не падає) і dsv rm (лише не з пакетів).
  • duser: list, add (групи як у Calamares, --admin, ключ, пароль), del, passwd, lock/unlock (і вхід за ключем), key add|list|rm, groups +/-; захист від видалення чи блокування себе та єдиного адміністратора.
  • dfw: status, allow, deny, reload; набори tcp_ports/udp_ports у таблиці inet das, порти в /etc/nftables.d/dfw.nft, перевірка nft -c; показує порти Docker і заблоковані fail2ban адреси.
  • dsys: info, hostname, timezone, locale, keymap.
  • xtools-minimal (xi, xq, xrs, xcheckrestart) в обох образах.
  • Виправлено: коментар у nftables.conf радив dsv restart nftables, а finish служби Void робить nft flush ruleset і стирає правила fail2ban та Docker. Тепер dfw reload.
  • Перевірено на встановленому сервері: dsv new з Python-сервером на 8080, доступ з хоста після dfw allow і закриття після dfw deny; duser add з ключем, вхід, lock блокує й вхід за ключем; dsys (часовий пояс, ім'я, мова, розкладка); dfw reload поруч із контейнером nginx.
  • Повідомлення наприкінці das-server-install згадує dsv, duser, dfw, dsys.

Етап 8. Профіль розробника (готово)

Не метапакет, а dprofile у das-helpers зі списком пакетів Void у /usr/share/das/profiles/dev.conf: встановлена система поки не бачить репозиторію Das OS, тож метапакет das-dev звідти не встановився б, а пакети Void доступні завжди.

  • dprofile install dev: base-devel, gdb, strace, git, git-lfs, github-cli, lazygit, go, gopls, delve, golangci-lint, python3-pip, virtualenv, uv, nodejs, docker, docker-compose, docker-buildx, lazydocker, podman, podman-compose, jq, ripgrep, fd, fzf, direnv, shellcheck, sqlite; на десктопі ще vscode (code-oss), meld, flatpak і портали. Пара знімків snapper pre/post, підказка про відкат; спершу оновлює xbps, якщо треба.
  • Налаштування: служба docker, група docker для того, хто запустив, /etc/subuid/subgid для rootless Podman, / як спільне монтування (/etc/runit/core-services/60-das-shared-root.sh; runit лишає його приватним, і Podman попереджає).
  • Flathub на вимогу (лише десктоп): Android Studio, IntelliJ IDEA Open/Ultimate, PyCharm, GoLand, WebStorm, VS Code від Microsoft; вибір номерами перед встановленням, dprofile app add|rm (з --unused, бо рантайми займають 1–4 ГБ). PyCharm Community на Flathub застарів (2024.3), тому PyCharm-Professional (безкоштовний режим).
  • Запитання й план — до sudo, пароль питається після них; --yes, --apps ID,...|all|none для скриптів.
  • das-welcome: рядок «Профіль розробника» відкриває xfce4-terminal з dprofile install dev; після встановлення — «Додати середовища».
  • Calamares packagechooser не додаємо: інсталятор копіює live-образ без мережі, а профіль завантажує ≈ 550 МБ.
  • Перевірено: сервер (QEMU) — go run, Node.js, uv, docker run, rootless podman run без попередження після перезавантаження; десктоп — встановлення з das-welcome, Code - OSS і VS Code з Flathub у меню після входу, dprofile app rm звільняє рантайми.
  • Повідомлення наприкінці das-server-install згадує dprofile install dev.

Етап 9. CI (готово)

  • Workflow .gitea/workflows/build.yml: make iso iso-server на власному runner dasci:host (push у main/dev, теги v*, ручний запуск).
  • CI-хост: Windows-машина (192.168.88.193), WSL2 Ubuntu 24.04 dasci у C:\DasOS\wsl (SSD), Docker Engine, gitea-runner 5.1.1 як служба systemd, автозапуск завданням планувальника (ci/runner).
  • DASOS_OUT у scripts/builder.sh: кеш out/ на CI-хості в /var/lib/dasos-ci/out.
  • Runner зареєстровано, перший запуск у Gitea (run 1) успішний за 46 хв.
  • Після перезавантаження Windows runner піднімається сам, без входу в систему (завдання S4U).
  • Тег v* публікує обидва ISO і SHA256SUMS як реліз Gitea (ci/release.sh). Ліміт вкладення релізу — 2 ГБ на файл ([repository.release] FILE_MAX_SIZE).
  • Перша публікація: реліз v0.8.0 з обома ISO і SHA256SUMS (завантаження ~9 хв). Перша спроба впала на 502: Traefik на git.das.org.ua обривав запити довші за 60 с, readTimeout піднято до 30m.

Етап 10. Термінал (0.9.1)

Пакет das-shell (десктоп і сервер), Python + Textual.

  • Запрошення bash за замовчуванням, як на робочому комп'ютері автора: ┌─[✗]─[user@host]─[дата]─[час]─[каталог] / └─╼ $ (/etc/bash/bashrc.d/das-prompt.sh, заміна PS1 зі /etc/skel/.bashrc Void).
  • dprompt: конструктор запрошень (5 готових, сегменти, кольори, живий перегляд), застосування для себе або для всіх.
  • dbanner: редактор банера при вході по SSH (7 готових, полотно з інструментами, поля зі змінними, віджети, служба das-banner для кешу), малюнки: логотип Das OS і тризуб (tools/art).
  • scripts/run-qemu.sh: SSH гостя на localhost:2222.
  • Запрошення за замовчуванням: └─╼ другого рядка міг бути білим, бо колір успадковувався з першого рядка, а readline перемальовує лише останній. Тепер кожен рядок задає колір заново (das-shell 0.2.0).
  • Перевірено автором на сервері (das-shell 0.3.0): └─╼ червоний, і після кольорового виводу, і після помилки.
  • dbanner: кнопки внизу стартового екрана перекривав рядок підказок клавіш (обидва були прикріплені до низу): тепер кнопки — звичайний рядок під списком.
  • У консолі Linux (TERM=linux) рамки кнопок, полів і списків dprompt/dbanner були квадратиками: Textual малює їх символами ▊▎▔▁, яких немає в жодному консольному шрифті (до 512 символів; перевірено cyr-sun16, default8x16, eurlatgr, Terminus). Тепер там рамки ┌─┐, а решта відсутніх символів замінюється на наявні. Символи палітри малювання (★ ☀ ♥…) лишаються як є: це вміст банера для SSH-клієнтів.
  • Перевірено автором у консолі сервера: dprompt і dbanner з рамками ┌─┐ без квадратиків, кнопки dbanner видно повністю.
  • Аліаси й функції для bash (das-shell 0.3.0, 0.9.3): на основі ~/.bash_aliases і ~/.bash_functions автора, переписані під Void (xbps, nftables, das-update), з виправленими помилками (rmhost, netinfo, todo -r, dirsize, extract), двомовними описами для lsfunc і новими функціями (up, bigfiles, pkgowner, please, serve, weather, cheat, genpass, скорочення Docker). Перейменовано те, що затіняло команди: gh → hgrep (GitHub CLI), install прибрано (є xi), mount → mounts, ed прибрано.
  • Аліаси й функції перевірено автором на сервері (das-shell 0.3.0 з локального репозиторію).
  • Аліаси й функції перевірено автором на десктопі (ISO 0.9.3).
  • Перевірено автором на реальному сервері (0.9.1): банер das-classic з IP при вході по SSH, свій банер і dbanner apply ukraine, dbanner apply dashboard вмикає службу das-banner (погода й оновлення з'являються), запрошення Das і в SSH, і в консолі (> замість ╼).
  • ssh host cmd виконується без банера (перевірено автором).
  • Десктоп: dprompt і dbanner перевірено автором (ISO 0.9.3).
  • Вихід з dprompt і dbanner однаково Ctrl+Q (у dbanner на стартовому екрані лишилась і q); 0.9.4.
  • Десктоп, xfce4-terminal: └─╼ сірий, а не червоний (у консолі сервера червоний). З'ясувати.
  • Узгодити решту клавіш: у dprompt Ctrl+S «застосувати», у dbanner Ctrl+S «зберегти», Ctrl+A «застосувати».

Репозиторій пакетів

  • Підпис через xbps-rindex --sign, ключ поза репозиторієм.
  • Хостинг репозиторію (власний сервер або GitHub Releases/Pages).
  • /etc/xbps.d/das.conf у встановленій системі, щоб пакети das-* оновлювалися. Зараз встановлена система бачить лише репозиторій Void.

Інсталятор

  • Перевірити встановлення десктопа на старий BIOS (MBR, grub-install --target=i386-pc); серверний інсталятор на BIOS перевірено.
  • Перевірити на реальному залізі: видалення гостьових інструментів VM, Wi-Fi, NVIDIA/AMD.
  • Шифрування диска (LUKS): luksbootkeyfile, crypttab, dracut, GRUB_ENABLE_CRYPTODISK.
  • Перевірити ручну розмітку з Btrfs (чи створюються підтоми) і встановлення на ext4/XFS (знімки мають вимкнутися без помилок).
  • Перевірити розкладку, відмінну від us,ua (автологін перевірено).

Знімки й відкат

  • Перевірити, що cron справді робить щогодинні знімки й очищує старі.
  • Графічний відкат (у das-update або окремою утилітою) замість sudo snapper-rollback N.
  • Прибирати старі корені @<дата>, які лишаються після відкату.

Оформлення та дрібниці

  • Світла тема: значки панелі (трей, звук, розкладка) були блідо-сірими на світлій панелі; тепер текст і значки #1f2430 (das-theme 0.2.0, 0.9.4; перевірити на ISO).
  • Значок кнопки меню на вибір: das-panel-icon star|trident (зірка das-logo за замовчуванням, тризуб das-trident жовтий із синім контуром); 0.9.4, перевірити на ISO.
  • Значки Wi-Fi і Bluetooth у треї лишались блідими: панельні значки Papirus (#dfdfdf) зроблені для темних панелей, а CSS їх не перефарбовує. Світла тема тепер на Papirus-Light (#444): xsettings.xml, index.theme, екран входу; das-theme 0.3.0, das-settings 0.6.0, 0.9.5; перевірити на ISO.
  • das-panel-icon help (-h, --help) показує підказку, а не ставить значок «?»; невідомі -ключі відхиляються.
  • На десктопний образ додано publisher (publish) і deployer (deploy): копії проєктів з ~/Dev/Projects/Python, конфіг у ~/.config/<назва>/ (створюється з прикладу при першому запуску), історія в ~/.local/state/<назва>/; перевірити на ISO.
  • Зміну шляхів конфігу та history.log перенесено в оригінальні publisher і deployer (config.default_path(), pipeline._history_path()): у checkout усе як було, у пакеті — ~/.config і ~/.local/state. Копії пакетів відрізняються від оригіналів лише значеннями за замовчуванням (localhost, user).
  • У десктопний образ і в das-server 0.5.0 додано nano: publish і deploy відкривають конфіг у редакторі за F2 ($VISUAL/$EDITOR, інакше nano), без нього завершувались; 0.9.6.
  • У десктопний образ додано curl (у das-server він уже був); 0.9.7.
  • publish і deploy падали з BrokenPipeError, коли ssh завершується одразу (недоступний хост): тепер це RemoteError з повідомленням ssh (код 255 завжди помилка), тест з фіктивним ssh; publisher/deployer 0.3.1, 0.9.8; виправлено й в оригіналах.
  • Прибрати значки томів live-носія («Том 6,6 ГБ») з робочого столу live-сесії.
  • Тема GRUB у встановленій системі (зараз стандартний чорний екран).
  • Перевірити меню Whisker вручну.
  • ncdu (аналіз зайнятого місця на диску в терміналі): у десктопному образі й у das-server 0.4.0.
  • Прискорити make packages: пакет перезбирається лише після змін у srcpkgs/<назва>, без бінарного пакета або коли у Void зникла потрібна йому бібліотека (xbps-install -n). DASOS_REBUILD=1 перезбирає все.

Відкладено

  • ARM-образ для Raspberry Pi.
  • Вбудувати текстовий редактор MultiText.
  • Перший стабільний реліз: злиття dev → main.