Първият ми 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 можеш да стигнеш доста по-далеч, отколкото си мислиш.

AI като помощник в избора на лаптоп!

Преди време за да избере човек машина, трябваше да разчита на т.нар. продавач консултанти в магазините, на близък с познания в компютрърните технологии или на себе си и необятния интермет.

Днес тази задача е много по-лесна. Ако искаме да закупим лаптоп, но се колебаем какъв да е той и дали ще ни свърши работа. Най-лесния начин е да впрегнем ИИ да свърши цялата работа за нас.

Например, може да попитаме Gemini (бившия Bard) директно, какво ни трябва. Той ще ни даде няколко предложения. Можем в последствие да допълваме нашите критерии.

Защо това е по-добре от методите които използвахме преди? Защото ИИ има достъп до цялата информация и бързо може да провери кои машини отговарят на нашите изисквания. Всичко става много по-бързо. Представете си само ако трябва да проверим параметрите на всеки един компютър и да ги сравним с това което искаме. Времето което ще ни отнеме ще бъде много. Накрая ще си изберем нещо и няма да знам дали това е оптималното.
А какво да кажем за продавач консултантите? Те отлично познават (в повечето случаи) техниката в магазина, но те отлично знаят и кои машини трябва да продадат бързо. За това винаги ще остане съмнението, че това което ни предлагат, не е точно това което търсим. Това ще е по-скоро това което те трябва да продадат.
Ако разчитаме на познат, който е запознат с новите технологии, пак трябва да вземем предвид, че той надали ще направи обстойно и огромно проучване по въпроса, той ще провери няколко десетки варианта и ще ви препоръча нещо от тях.

Ето какви бяха изискванията ми, които зададох на ИИ

Избери от серията thinkpad от моделите т последните 5 години, лаптоп който има процесор а хардуерна виртуализация, поне 16GB рам памер, с възможност за последващо увеличаване, nvme m.2 ssd, да е по-лек или около 1кг, разделителна способност поне 1920x1080 и цената да е под 1000 лв

Въпреки правописната грешка, ИИ беше достатъчно интелигентен, да разбере какви са изискванията ми и ми изведе следните 5 резултата

1. ThinkPad X1 Carbon Gen 7 (2020)
2. ThinkPad X13 Gen 1 (2020)
3. ThinkPad X1 Yoga Gen 5 (2020)
4. ThinkPad T14 Gen 1 (2020)
5. ThinkPad X280 (2018)

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

Зададох същия въпрос и на ChatGPT и неговите 5 предложения бяха:
1. Lenovo ThinkPad L14 Gen 2
2. Lenovo ThinkPad T14s Gen 2
3 Lenovo ThinkPad X1 Carbon Gen 9
4. Lenovo ThinkPad E15 Gen 2
5. Lenovo ThinkPad L13 Gen 2

3 от изброените обаче, бяха доста по-тежки и се наложи да попитам отново, като изрично да му кажа, да обърне внимание на масата на лаптопите и ето новите 5 резултата
1. Lenovo ThinkPad X1 Nano Gen 1
2. Lenovo ThinkPad X1 Carbon Gen 8
3. Lenovo ThinkPad X1 Carbon Gen 7
4. Lenovo ThinkPad T14s Gen 2
5. Lenovo ThinkPad X1 Carbon Gen 9

Както виждаме разлините ИИ дават различни резултати, но все пак ни предоставят няколко предложения, сред които да изберем нашият лаптоп.