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

Сайт за споделяне на списъци с желани подаръци – част 2

Вече е на лице и новия домейн на сайта. Стария също е наличен, редиректва към новия домейн.

Новия домейн е my-wishlist.eu.

Съобщенията от сайта вече се получават от имейл info@my-wishlist.eu.

Други новости в сайта да, че вече има и функционалност за събития. Вече може да създадете събитие и да го споделите с приятелите си. Сайта вече е многоезичен, наличен е на български, английски, френски и немски. Наличен е и тъмен режим на сайта, за хората предпочитащи dark mode.

Сайт за споделяне на списъци с желани подаръци

Покрай празниците, се стига до дилемата „какво да му/и купя?“. Какво по-досадно от това да избираш подарък за някого, който си има всичко. Приятелски семейства с деца, какво да купим на децата? От какво имат нужда? А ако и друг близък им купи същото? А ако няколко наши познати ни подарят еднакви подаръци?

И покрай всички тези въпроси, реших, че в 21 век е най-логично да има сайт, който да ни помогне с всички тези проблеми. Някои интернет магазини имат възможност за Wishlist, но те са обвързани с конкретния магазин. Поради тази причина реших да създам собствен сайт за решаване на този въпрос.

Първата версия на сайта е вече готова и готова за тестване от истински хора, а не само от автоматизирани тестове.

Понеже все още не съм избрал домейн за сайта, за сега е достъпен на https://wishlist.danaildr.eu.
На по-късен етап, ще бъде закупен и самостоятелен домейн. Цялата информация ще си остане, защото така е редно. Регистрираните потребители ще имат своите профили, просто самия сайт ще бъде достъпен на друг домейн.

Какво представлява сайта? Сайта е базиран на Laravel и има възможност за регистрация на потребители. Всеки регистриран потребител може да създаде един или повече списъци с желани подаръци. Съответно всеки списък може да съдържа един или повече желани подаръци (все пак е списък нали).
Всеки списък може да бъде споделен. Всеки списък може да бъде видим от всички, само от приятели или само от собственика. Да, сайта има и семпла форма на приятелства, чрез която потребителите могат да изградят мрежа от приятели, чиито списъци с подаръци могат да виждат.

Сайта има и семпла система за нотификации. Така когато някой Ви изпрати покана за приятелство или приеме/отхвърли Вашата покана, ще бъдете уведомени. Когато някой Ваш приятел създаде нов списък с подаръци, то Вие ще узнаете това веднага, без да е нужно той да Ви изпраща линк.

Да, списъка с подаръци може да бъде споделен и чрез линк. който е наличен в страницата на списъка.

В сайта има и възможност да резервираме даден подарък. Така всички други потребители ще знаят че този подарък вече е резервиран.

При създаването на списък можем да изберем повода, за който искаме да получим тези подаръци (например сватба или рожден ден), датата на събитието и кой може да вижда списъка. При добавянето на подарък в списъка, можем да добавим снимка, описани и дори линк към сайт от който може да бъде закупен.