Skip to content

Instantly share code, notes, and snippets.

@zmts
Last active March 27, 2026 06:36
Show Gist options
  • Select an option

  • Save zmts/b601410b532a0e6e5b38e0c5e9d2b90c to your computer and use it in GitHub Desktop.

Select an option

Save zmts/b601410b532a0e6e5b38e0c5e9d2b90c to your computer and use it in GitHub Desktop.
Первичная настойка Debian Linux/Разворачиваем серверную инфраструктуру на Digital ocean

Первичная настойка Debian Linux/Разворачиваем серверную инфраструктуру на Digital ocean

Для проектов среднего и небольшого размера не всегда оправданно использовать AWS/Kubernetes подобную технологию. Для проектов нуждающихся в нескольких серверах отлично подходит Digital ocean. Который к тому же предоставляет средства вертикального скейлинга(увеличение производительной мощности уже существующих серверов).

SSH cертификат

Создаем сертификат под которым будем логинится на сервера нашего проекта (на локальной машине)

ssh-keygen -t rsa -b 4096 -f /Users/alex/.ssh/myproject_test -C "myproject comment"

Не забываем сделать его бекап

Первичная настройка сервера/дроплета. Настройка ssh сертификата

  • Создаем новый Droplet (one-time password)
  • Логинимся под рутом
  • Создаем пользователя(superuser) под которым мы в дальнейшем будем ходить по ssh
adduser superuser

Добавляем его в рутовую группу

usermod -aG sudo superuser

Добавляем публичный SSH ключ для superuser на удаленный сервер. И если в проекте несколько серверов, дабы не создавать сертификат для каждого, можем переиспользовать его на каждом из серверов. То есть проделываем данную процедуру для каждого сервера.

ssh-copy-id -i /Users/alex/.ssh/myproject_test.pub [email protected]

Теперь публичный ключ размещен на сервере в файле /home/superuser/.ssh/authorized_keys. Можем логинится через сертификат.

Обрати внимание логинимся через СЕКРЕТНЫЙ ключ, не публичный!

ssh -i /Users/alex/.ssh/myproject_test [email protected]

Приступим к остальной настройке системы

Заходим под рутом и в бой...

su

Задать FQDN серверу

nano /etc/hostname

mysuperdomain

nano /etc/hosts

127.0.1.1 mysuperdomain.com mysuperdomain
127.0.0.1 localhost

Мета данные сервера

hostnamectl

Установить свое имя сервера вместо имени DO

hostnamectl set-hostname my-server-name

Время

date --set hh:mm

nano /etc/ssh/sshd_config

  • Запрещаем логинится по паролю
  • Запрещаем руту ходить по ssh
  • Меняем дефолтный ssh порт
PasswordAuthentication no
PermitRootLogin no
Port 2222
sudo service ssh restart

Загрузить и установить последние обновления системы

apt update && apt upgrade

reboot or systemctl reboot

Настраиваем локаль

Правим конфиг локалей nano /etc/default/locale

LANGUAGE=en_US.UTF-8
LC_ALL=en_US.UTF-8
LANG=en_US.UTF-8
LC_TYPE=en_US.UTF-8

Реконфигурируем локали (из списка выбираем en_US.utf8 и ru_RU.utf8, далее по умолчанию ставим en_US.utf8)

sudo dpkg-reconfigure locales
sudo reboot

Ставим необходимые утилиты

sudo apt install -y zsh htop git curl wget unzip zip mc iftop psmisc screen

Oh-my-zsh

sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"

Zsh custom config

autoload -U +X bashcompinit && bashcompinit

alias ls='ls -FGA'
alias ll='ls -FGAhl'
alias x='clear'
alias rm='rm -i'
alias rmdir='rm -rfi'
alias cp='cp -i'
alias mv='mv -i'

PROMPT='${ret_status} %{$fg[cyan]%}%n::%m[%d]%{$reset_color%} $(git_prompt_info)'
RPROMPT='[%T]'

%m - hostname

# Keep 1000 lines of history within the shell and save it to ~/.zsh_history:
HISTSIZE=1000
SAVEHIST=1000
HISTFILE=~/.zsh_history

export PROMPT='%n@MY_SERVER_NAME >> %/> '
export RPROMPT='[%T]'

alias ls='ls -lpa'
alias x='clear'
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'


# Включить автодополнение
autoload -U compinit promptinit
compinit
promptinit

# При совпадении первых букв слова вывести меню выбора
zstyle ':completion:*' menu select=long-list select=0
zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS}

# Ignore Uppercase
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'

bindkey "^[OB" down-line-or-search
bindkey "^[OC" forward-char
bindkey "^[OD" backward-char
bindkey "^[OF" end-of-line
bindkey "^[OH" beginning-of-line
bindkey "^[[1~" beginning-of-line
bindkey "^[[3~" delete-char
bindkey "^[[4~" end-of-line
bindkey "^[[5~" up-line-or-history
bindkey "^[[6~" down-line-or-history
bindkey "^?" backward-delete-char


#unpack
extract () {
  if [ -f $1 ] ; then
    case $1 in
      *.tar.bz2) tar xvjf $1   ;;
      *.tar.gz)  tar xvzf $1   ;;
      *.tar.xz)  tar xvfJ $1   ;;
      *.bz2)     bunzip2 $1    ;;
      *.rar)     unrar x $1    ;;
      *.gz)      gunzip $1     ;;
      *.tar)     tar xvf $1    ;;
      *.tbz2)    tar xvjf $1   ;;
      *.tgz)     tar xvzf $1   ;;
      *.zip)     unzip $1      ;;
      *.Z)       uncompress $1 ;;
      *.7z)      7z x $1       ;;
      *)         echo "'$1' cannot be extracted via >extract<" ;;
    esac
  else
    echo "'$1' is not a valid file"
  fi
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment