apt е актуален. Звучи тривиално, но колко пъти съм губил минути, защото някой пакет не е бил намерен, а причината е била стара кеш памет на пакетния мениджър.
1. Обновяване на системата и базови пакети
Още в първия момент след инсталацията на Ubuntu изпълнявам тези две команди:
sudo apt update && sudo apt upgrade -y-y автоматично потвърждава всички промени. За лични инсталации ползвам винаги така, защото не ми се иска да стоя и да натискам Y на всеки пакет. В production сървъри бих бил по-внимателен, но тук говорим за моята локална среда.
След обновяването инсталирам набор от пакети, без които не мога:
sudo apt install -y git curl wget vim htop build-essential unzip zip
sudo apt install -y ca-certificates gnupg lsb-release- git — основният ми инструмент за работа с код.
- curl и wget — за сваляне на файлове и тестване на API-та.
- vim — за бърза редакция на конфигурации.
- htop — за следене на ресурсите, особено когато Docker започне да яде памет.
- build-essential — за компилиране на софтуер от сорс.
- unzip/zip — архивите са навсякъде.
2. Смених bash с Zsh — и това промени всичко
Bash е ок, но Zsh с Oh My Zsh ми спестява часове. Auto-suggestions, цветове, плъгини за git — правят терминала много по-приятен.
sudo apt install -y zsh
sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"Инсталацията ще попита дали искам да направя Zsh моята shell по подразбиране. Казвам Y. След това рестартирам терминала и вече виждам Oh My Zsh промпта.
Добавям още няколко плъгина, които използвам постоянно:
# Редактирам ~/.zshrc и добавям:
plugins=(git docker docker-compose kubectl history sudo)
- git — съкращения за често използвани git команди.
- docker и docker-compose — auto-completion за контейнери.
- sudo — двойно натискане на ESC добавя sudo пред текущата команда.
- history — по-лесно търсене в историята.
3. Настройка на Git – идентичност и SSH ключове
Git без правилна конфигурация е най-честата причина за неуспешни push-ове. Настройвам си името и имейла:
git config --global user.name "Федя Серафиев"
git config --global user.email "[email protected]"
git config --global core.editor "vim"
git config --global init.defaultBranch mainСлед това генерирам SSH ключ и го добавям в GitHub / GitLab / Bitbucket:
ssh-keygen -t ed25519 -C "[email protected]"
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
cat ~/.ssh/id_ed25519.pubКопирам публичния ключ и го добавям в настройките на съответния git хост. Това е един от онези моменти, които ако пропусна, после се чудя защо не мога да клонирам репозитори.
4. Docker в WSL — моят предпочитан подход
Докер е тема за цяла книга, но ще споделя как го инсталирам и ползвам аз.
Има два основни варианта:
- Docker Desktop с WSL2 backend — удобно, с GUI, но понякога тежи и прави странни неща с мрежата.
- Docker Engine директно в WSL дистрибуцията — лек, бърз и пълен контрол. Това използвам аз.
Ето как инсталирам Docker Engine в Ubuntu:
# Добавям официалния GPG ключ
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# Добавям репозиторито
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Инсталирам Docker
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-pluginЗа да не пиша винаги sudo пред всяка docker команда, добавям потребителя си към групата docker:
sudo usermod -aG docker $USERСлед рестарт проверявам, че Docker работи:
docker run hello-worldАко видя съобщението "Hello from Docker!", значи всичко е наред.
5. Моите проекти — организация и workflow
Създавам основна директория за всички проекти:
mkdir -p ~/projects
cd ~/projectsВътре всяко нещо си има папка:
~/projects/work/— проекти за клиенти и работа.~/projects/personal/— лични експерименти и open source.~/projects/tools/— всякакви помощни скриптове и инструменти.
Клонирам репозитории само в тези папки. Никога не работя в /mnt/c/, защото вече съм платил цената на бавните build-ове.
\\wsl$\Ubuntu-24.04\home\fedia\projects. После закачам тази папка като бърз достъп. Така мога лесно да отварям файлове с Windows приложения, когато ми трябва.
6. Работа с Python, Node и други езици
Не инсталирам глобално всичко. Ползвам pyenv за Python и nvm за Node.js. Това ми позволява да сменям версиите без да си бъркам системата.
Python с pyenv
sudo apt install -y make build-essential libssl-dev zlib1g-dev libbz2-dev \
libreadline-dev libsqlite3-dev wget curl llvm libncursesw5-dev xz-utils \
tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev
curl https://pyenv.run | bashСлед инсталацията добавям следното в ~/.zshrc:
export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"Рестартирам терминала и вече мога да инсталирам Python версии:
pyenv install 3.11.0
pyenv global 3.11.0Node.js с nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bashДобавям в ~/.zshrc и рестартирам:
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"След това инсталирам LTS версията на Node:
nvm install --lts
nvm use --lts7. Конфигурации, които помня наизуст
Някои неща ги повтарям на всяка инсталация, защото ми спестяват главоболия.
.wslconfig – ограничаване на ресурсите
Вече споменах този файл в първата част, но тук го повтарям, защото е ключов за стабилност.
[wsl2]
memory=6GB
processors=4
swap=2GB
localhostForwarding=trueСлед всяка промяна в този файл изпълнявам wsl --shutdown от PowerShell и стартирам WSL отново.
.gitignore_global
Създавам глобален .gitignore, за да не виждам винаги едни и същи временни файлове:
# Python
__pycache__/
*.py[cod]
*.pyo
*.pyd
.env
venv/
# Node
node_modules/
npm-debug.log
.env
# IDE
.vscode/
.idea/
*.swpПосле го настройвам в git:
git config --global core.excludesfile ~/.gitignore_global8. Бърз скрипт за автоматизация
За да не повтарям ръчно всичко това при всяка нова инсталация, съм написал скрипт. Ето го и него:
#!/bin/bash
set -e
echo "🔧 Обновяване на системата..."
sudo apt update && sudo apt upgrade -y
echo "📦 Инсталиране на базови пакети..."
sudo apt install -y git curl wget vim htop build-essential unzip zip ca-certificates gnupg lsb-release
echo "🐚 Инсталиране на Zsh и Oh My Zsh..."
sudo apt install -y zsh
sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended
echo "🔑 Настройка на Git..."
git config --global user.name "Федя Серафиев"
git config --global user.email "[email protected]"
git config --global core.editor "vim"
echo "🐳 Инсталиране на Docker..."
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
sudo usermod -aG docker $USER
echo "✅ Настройката приключи. Рестартирайте терминала, за да активирате всички промени."
Пускам го с bash ~/setup-wsl.sh и след няколко минути имам работеща среда. Разбира се, ръчно си добавям SSH ключовете, но скриптът върши 80% от работата.
9. Най-честите ми грешки в началото
За да не повтаряте моите грешки, ето какво съм правил и какво ме е учило:
| Грешка | Какво научих |
|---|---|
Работех в /mnt/c/ и build-овете бяха бавни |
Винаги работя в ~/projects. Това удвои скоростта на компилациите. |
| Забравих да добавя потребителя си към docker групата | Сега го правя веднага и рестартирам сесията. |
| Инсталирах Python глобално и си счупих системата | Ползвам pyenv и никога не пипам системния Python. |
Не ограничих RAM в .wslconfig |
WSL2 може да изяде всичката налична памет. Сега винаги слагам лимит. |
10. Как поддържам тази среда чиста
След първоначалната настройка, поддръжката е проста:
- Веднъж седмично пускам
sudo apt update && sudo apt upgrade -y. - От време на време
docker system prune -af, за да изчистя неизползвани контейнери и образи. - Правя backup на важните конфигурации (SSH ключове, .zshrc, .gitconfig).
- Експортирам цялата дистрибуция с
wsl --export, когато съм направил големи промени.
wsl --shutdown, стартирам отново и в 90% от случаите проблемът изчезва.
11. Какво следва?
С тази настройка вече имам стабилна и бърза работна среда. В следващите части ще разгледам:
- Мрежови настройки и отстраняване на проблеми с интернет в WSL.
- Работа с GUI приложения чрез WSLg.
- Интеграция с Windows Terminal — профили, теми и клавишни комбинации.
- Как да използвам WSL за автоматизация на административни задачи в Windows.
Ако имате конкретен въпрос или нещо не ви е ясно, пишете ми — винаги се радвам да споделя опит.