Първият ми Docker image (с малко помощ от AI): WebSSH в контейнер

От известно време си играя с Docker. Първо започнах както повечето хора – с готови контейнери, docker-compose файлове от GitHub и леко променяне на конфигурации. В един момент обаче реших, че е време да направя нещо собствено.

Така се появи първият ми публичен Docker image:

https://hub.docker.com/r/danaildr/webssh

Не е революционен проект. Не е и някакъв сложен софтуер. Но е нещо, което съм направил сам… или по-точно сам + AI.


Каква е идеята

Image-ът представлява web базиран SSH клиент, който можеш да достъпиш през браузър.

Тоест:

  • отваряш браузър
  • виждаш терминал
  • връзваш се към SSH сървър

Без локален SSH клиент, без допълнителен софтуер.

Подобни неща има доста. Причината да си направя собствен не беше, че светът има нужда от още един WebSSH клиент, а че исках да разбера как работи и как се прави Docker image от нулата.


Защо изобщо реших да го направя

Честно казано, първоначалната идея беше доста практична.

Имам няколко сървъра и устройства в хомелаба и понякога е удобно да имам SSH достъп директно през браузър. Особено когато съм на чужд компютър или на машина, на която не искам да инсталирам нищо.

Но има и още една много важна причина.

Ако контейнерът работи на машина, която има отворен към интернет порт 8080 (портът на Web интерфейса), той на практика може да се използва като SSH gateway към вътрешната мрежа.

Това означава следното:

  • не е необходимо да се отваря порт 22 към интернет
  • SSH достъпът до вътрешните машини остава само вътре в локалната мрежа
  • отвън се вижда само Web интерфейсът

На практика получаваш нещо като малък web базиран bastion host.

С други думи:

Така SSH портовете на вътрешните машини не се експонират към интернет, което добавя една допълнителна доза сигурност.

Разбира се, това не е пълноценна security архитектура и не заменя неща като VPN, но за хомелаб или малка инфраструктура е доста удобен компромис между достъп и сигурност.


Ролята на AI (или как да не се правим на герои)

Няма да се правя на велик програмист.

Истината е, че голяма част от кода е написана с помощта на AI. Аз по-скоро играех ролята на:

  • човекът, който задава въпросите
  • човекът, който чупи нещата
  • човекът, който казва „това не работи“

и после заедно с AI ги оправяхме.

Това не означава, че всичко става магически. Всъщност доста време отиде в:

  • дебъгване
  • промени по Dockerfile
  • тестване
  • разбиране защо нещо не работи

AI е мощен инструмент, но ако не разбираш поне малко какво се случва, бързо се озоваваш в хаос.


Какво има вътре в image-а

Контейнерът предоставя прост web интерфейс за SSH достъп.

Технически погледнато:

  • Python backend
  • SSH връзка чрез библиотеката Paramiko
  • терминал в браузъра
  • минимален Docker image

Опитах се Dockerfile-ът да е сравнително чист:

  • базиран на python:3.11-slim
  • използва non-root user
  • оптимизиран build процес
  • минимални зависимости

Целта беше лек и сравнително сигурен контейнер, който може да се използва в реална среда.


Как да го стартираш

Най-простият начин е:

След това отваряш:

и получаваш терминал директно в браузъра.

Инсталиране с Docker Compose

Ако предпочиташ да управляваш контейнерите си чрез Docker Compose (което честно казано е по-удобният вариант, особено ако вече имаш повече услуги на машината), можеш да стартираш контейнера и по този начин.

Създай файл docker-compose.yml със следното съдържание:

След това стартирай контейнера с:

И след няколко секунди Web интерфейсът ще бъде достъпен на:

Предимството на този подход е, че конфигурацията остава записана във файл. Това означава, че:

  • контейнерът може лесно да се стартира отново
  • конфигурацията е лесна за промяна
  • може да се добавят допълнителни услуги по-късно

А ако вече използваш Docker Compose за други неща (reverse proxy, база данни, monitoring и т.н.), този контейнер спокойно може да стане част от същия stack.


Какво научих от този проект

Няколко неща станаха доста ясни:

1. Docker изглежда прост, но има доста детайли
Dockerfile, layers, permissions, networking – всичко това има значение.

2. Debug-ването на контейнер понякога е… интересно
Особено когато нещо работи на локалната машина, но не и в контейнера.

3. AI е страхотен помощник, но не е заместител на мисленето
Понякога предлага решения, които изглеждат логични, но просто не работят.

4. Най-добре се учи чрез малки реални проекти


Какво следва

Този image е по-скоро първа версия / експеримент.

В бъдеще може да добавя:

  • authentication слой
  • reverse proxy интеграция
  • HTTPS
  • multi-user support
  • по-добър интерфейс

А може и просто да го оставя като първия си Docker проект и да продължа към следващия.


И така, за финала

Не съм топ програмист.
Не съм DevOps инженер.
Просто човек, който обича да си човърка по сървъри и да си прави малки инструменти.

С малко търпение, експерименти и помощ от AI можеш да стигнеш доста по-далеч, отколкото си мислиш.

Равносметка 2024

Ето и равносметката за 2024-та.

Продължавам да играя шах, като в един момент започнах да играя не само на chess.com ами и на lichess.org. Има доста големи разлики в двата сайта. Поредицата от решени последователни ежедневни пъзели, без прекъсване от 189 набъбна на 555 на 31.12.2024, като днес вече е 558.Ето тук може да се види прогреса ми в chess.com .

А тук може да се види и този в lichess.org.

Графиката с жълт цвят е т.нар. кореспондентски шах, който е еквивалента на ежедневния пах в chaess.com, светлосиния цвят е за bullet а тъмносиния за blitz, зеления за rapid.

Другото което се случи през тази година е 1 публикувана статия. Записах курсовете за А категория свидетелство за управление на МПС. Издържах изпита и вече имам и тази категория.

Не съм стрелял нито веднъж с лъка през 2024-та година, което не е добре.

Продължавам да подобрявам уменията си в програмирането. Очаквам скоро да започна работа по обещаната от миналата равносметка уеб апликация за личните финанси. Гугъл таблицата вече стана доста сложна и с доста функции.

Равносметка 2023

Дойде края на годината и с него – равносметките.

Всеки се опитва да направи своя версия. Някои се справят по-добре от други, някои са забавни, други трогателни … ето я и моята.

2023 започна за мен, със записване в клуб по стрелба с лък. Стрелбата с recurve лък ми допадна повече от compound. вече съм собственик на лък и въпреки че още има какво да се желае от техниката ми, успявам да уцеля мишената. През 2024 се надявам да подобря техниката и може би някое състезание.

Лятото започнах отново да играя шах, това става главно на сайта chess.com. Като резултата е следния :
Ежедневен шах: 35 игри, 26 победи 9 загуби, персентил 70.2%, най-добра победа срещу противник с рейтинг 1200, най-висок рейтинг 858, рейтинг към 31.12.2023 – 858.
Ежедневен 960: 4 игри, 4 победи, персентил 96%, най-добра победа срещу противник с рейтинг 723, най-висок рейтинг 858, рейтинг към 31.12.2023 – 858.
Скоростен шах: 234 игри, 104 победи, 117 загуби, 13 равенства, персентил 83.6%, най-добра победа срещу противник с рейтинг 1162, най-висок рейтинг 1236, рейтинг към 31.12.2023 1027.
Блиц шах: 465 игри, 228 победи, 228 загуби, 9 равенства, персентил 69.7%, най-добра победа срещу противник с рейтинг 1028, най-висок рейтинг 1024, рейтинг към 31.12.2023 – 821.
Булит шах: 51 игри, 22 победи, 28 загуби, персентил 42.4%, най-добра победа срещу противник с рейтинг 625, най-висок рейтинг 544, рейтинг към 31.12.2023 – 503.
Решени ежедневни пъзели 189 последователни и общо 222.
Рейтинг на пъзели (около 660 решени пъзела) 1459.
Играл съм с играчи от 117 различни държави.

Започнах да уча езика Rust, като съм още в самото начало, също така опитвам да науча и малко повече за docker.

akaunting.com спряха безплатните акаунти и се наложи да мигрирам към друг софтуер за лични финанси. За сега обаче не намерих подходящ, който да покрива моите нужди, а akaunting е много повече от моите нужди, аз използвам около 20% от функционалностите му, за това не съм преминал към платен акаунт. За сметка на това, си направих нещо като мини приложение в google sheets където мога да контролирам финансите си. Доста дървено изглежда, но ми върши работа. Следващата стъпка е да се превърне в уеб апликация.

За съжаление, не написах/публикувах нито една статия/пост, а имах толкова много идеи. Да се надяваме 2024 да е по-ползотворна е това отношение.

Като за финал, този блог се премества от https://danaildr.wordpress.com на https://blog.danaildr.eu

Moto G 100 + USB-C to HDMI dongle + Hama X300 = Desktop PC

Moto G 100 е доста добър телефон, който предлага много екстри на сравнително ниска цена (ниска спрямо флагманите на Samsung и Apple). Най-хубавото на този телефон е, че може да бъде използван и като настолен десктоп компютър.

На пазара има много преходници USB-C to HDMI които да направят това възможно. Другити което ни трябва е bluetooth клавиатура и мишка (мишката не е задължителна, самия телефон може да служи като тъчпад).

В моя случай ползвах клавиатура Hama KEY4ALL X300 и Sandberg SNB-136-34 dongle. Резолюцията се определя в зависимост от дисплея и неговата разделителна способност. При 4к диплей иконите са малко дребнички, но при 1080p всичко изглежда доста по-добре. Надявам се на по-късен етап, да има възможност за избор на работната разделителна способност.

Ето и малко снимки