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