DevOps
Collection of instructions for server setup and manipulate
- Ubuntu server first steps
- Ubuntu server customization
- Send telegram message on every ssh login
- Custom domain on Keenetic router
- Postgres database dump and restore
- Local port forwarding
- Nvidia
- Монтирование самбы на Ubuntu server
Ubuntu server first steps
Client: Generate keys
This command generate a two files with private and public keys. The public-key file will end with .pub
extention, a private key file has no extention
ssh-keygen
Public key you may share with everyone, but private key must be keep in secret.
Client: Share key (publish)
Best way for Ubuntu is add public key to github ssh keys, then it will be avaidable at github.com/<username>.keys
Server: Install Ubuntu-server
Becouse you install a server version, the common way to interact is remote control (.ssh), but you need to create base authorization method via physical terminal. The public key made for this purpose, but type public key by hands is takes too long, so we were publish our public key with entire ethernet at github.com/<username>.keys
While install, select import identity and enter GitHub user name. Ubuntu will automaticaly read public key and save it.
It's strongly recommended use only ssh-keys and disable password authentification.
Connect
For connect from client use this command to connect:
ssh -i ~/.ssh/some_server_name username@my.domain.com -p 22
where -i
is identity path (private key path), where ~
- is home client user directory.
where -p
is target port (default: 22)
where username
- remote username (you enter while install)
where my.domain.com
- ip of target machine or domain name
First connection from clinet to server must be as created user (not root).
If connection sucseeded and keys are valid, system ask you to add connection to known_hosts
, type yes.
In case of server system reinstall old clients may see message, thats says that identity is changed. This problem rised becouse server keys stored on clinet machine is old. For fix this, in Windows, go to
userfolder/.ssh
and editknown_hosts
. Delete lines associated with server. And try to connect again.
Root login
After install public key will be stored in ~/.ssh/authorized_keys
where ~
is user directory: /home/username
.
For activate root, type this and enter password.
sudo su
Now you are login as root user and can go to /root/.ssh
, this folder is already has authorized_keys file, but file is empty. This means that nobody can use ssh for login as root. For fix this you need to copy public key from user authorized_keys to root authorized_keys.
You may use this: (cat is print file content, >> is redirect output to new file line).
cat /home/<username>/.ssh/authorized_keys >> /root/.ssh/authorized_keys
Now you can connet via ssh as root.
Setup after install and connect
Extend disk space
This step may be already done while install, but if not do this:
vgdisplay
lvextend -l +100%FREE /dev/mapper/ubuntu--vg-ubuntu--lv
resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv
df -h
For laptops:
Disable machine sleep if laptop lid is closed and reboot
for apply changes:
sudo sh -c 'echo "HandleLidSwitch=lock" >> /etc/systemd/logind.conf' && reboot
Change hostname
Check information about host:
hostnamectl
Change hostname:
sudo hostname new_hostname
Create users
useradd -m -s /bin/bash username
Cut maximum journal disk size
sudo journalctl --vacuum-size=100M
Nvidia
sudo apt-get purge nvidia-headless-no-dkms-535-server # Or your version
sudo apt-get install nvidia-driver-535 # Or your version
sudo reboot
nvidia-smi # Validate
Ubuntu server customization
Disable ssh login spam
Rename unnesessary files with @
at filename start at /etc/update-motd.d
cd /etc/update-motd.d && for file in *; do mv "$file" "@$file"; done # Rename all files
mv @00-header 00-header
also add neofetch as start message if you want to do next step.
cd /etc/update-motd.d && echo "neofetch" >> 00-header
Customize ssh login text
Message by SSH /etc/update-motd.d
: use neofetch:
apt install neofetch -y
Add this line to /etc/update-motd.d/00-header
neofetch --config /etc/update-motd.d/config.conf --source /etc/update-motd.d/ascii_art.txt
Config example:
# See this wiki page for more info:
# https://github.com/dylanaraps/neofetch/wiki/Customizing-Info
print_info() {
info title
info "OS" distro
info "Kernel" kernel
info "Packages" packages
info "Shell" shell
#info "Resolution" resolution
info "DE" de
info "WM" wm
info "WM Theme" wm_theme
info "Theme" theme
info "Icons" icons
info "Terminal" term
info "Terminal Font" term_font
info underline
info "Host" model
info "CPU" cpu
info "GPU" gpu
info underline
info "Uptime" uptime
info "Local IP" local_ip
info "Public IP" public_ip
info "Users" users
info underline
info "Memory" memory
#info "GPU Driver" gpu_driver # Linux/macOS only
info "CPU Usage" cpu_usage
info "Disk" disk
info "Battery" battery
#info "Font" font
#info "Song" song
# [[ "$player" ]] && prin "Music Player" "$player"
#info "Locale" locale # This only works on glibc systems.
#info cols
}
Colored root bash
Edit /root/.bashrc
and replace similar liens to this (append -256 color)
# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
xterm-color|*-256color) color_prompt=yes;;
esac
Beautiful screensaver
Screensaver for you server monitor
apt install cmatrix
cmatrix -s -b
Send telegram message on every ssh login
Add script
Create file /etc/login-notify.sh
Modify TELEGRAM_BOT_TOKEN and TELEGRAM_SEND_TO variables. Optional set EXCLUDE_USERS for users about whom a message will not be sent.
#!/bin/sh
TELEGRAM_SEND_TO=123456789
TELEGRAM_BOT_TOKEN=123456789:someLETTERS
EXCLUDE_USERS="some_excluded_user another_excluded_user"
if ! echo "${EXCLUDE_USERS}" | grep -q "\<${PAM_USER}\>"; then
if [ "$PAM_TYPE" != "close_session" ]; then
SSH_KEY=$(grep "Accepted publickey" /var/log/auth.log | tail -n 1 | awk '{print $NF}')
WHERE_KEY=$(grep "found at" /var/log/auth.log | tail -n 1 | awk '{print $NF}')
KEYS_PATH=$(echo "$WHERE_KEY" | cut -d ':' -f 1)
KEYS_LINE=$(echo "$WHERE_KEY" | cut -d ':' -f 2)
KEY_LINE=$(sed -n "${KEYS_LINE}p" "$KEYS_PATH")
KEY_NAME=$(echo "$KEY_LINE" | cut -d ' ' -f 3)
MESSAGE="Server: ${PAM_USER}@`hostname`%0ALogin: ${PAM_RHOST} ${KEY_NAME}"
curl -s -X POST https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage -d chat_id=${TELEGRAM_SEND_TO} -d text="$MESSAGE" > /dev/null
fi
fi
Modify to make it executable
chmod +x /etc/login-notify.sh
Add script to execute for every login
Do it by modifying file /etc/pam.d/sshd
, just add line to end of file by echo:
echo 'session optional pam_exec.so seteuid /etc/login-notify.sh' >> /etc/pam.d/sshd
Increase a log level
Script search for fingerprint, but doesn't know witch authorized_keys
file used for auth. For get authorized_keys
file location, we need to print location to /var/log/auth.log
Increase log level:
echo 'LogLevel VERBOSE' >> /etc/ssh/sshd_config
Restart ssh for updated log level:
sudo systemctl restart ssh
Custom domain on Keenetic router
Инструкция работает если у вас есть белый статичный ip-адрес и свой домен
Check settings:
-
Domain name
must EnabledRemote web interface connections
Setup certificate for domain
- Connect to CLI as
<router_ip>/a
- Check existing domains:
ip http ssl acme list
- Add your domain name:
ip http ssl acme get <subdomain>.annndruha.space
Setup proxy for subdomain
-
Check current proxy rules
show ip http proxy
-
Add new proxy route
(config)>
ip http proxy <subdomain>
(config-http-proxy)>
domain static annndruha.space upstream http 192.168.1.3 4242 allow public
Postgres database dump and restore
В этой короткой инструкции описывается как сделать бэкап базы данных PostgreSQL и восстановить его (на другом сервере);
Предполагается что PostgreSQL развёрнута в docker контейнере.
Dump
! Осторожно, если для докер-контейнера с БД не настроен volume который сохраняет состояние базы данных при перезапуске контейнера, то есть шанс потерять всё. (Но надюсь он настроен, потому что иначе жить нельзя).
Для начала добавьте в docker-compose.yml
в раздел volumes новый volume чтобы было удобно забрать с сервера дамп базы данных.
volumes:
- ./dumps/:/dumps/
Преезапустите контейнер:
docker compose down
docker compose up -d
Войдите внутрь контейнера с помощью команды (Выйти из контейнера: ctrl+d
):
docker exec -it postgres_db bash
Сделайте дамп вашей базы данных
pg_dump database_name > dumps/db.sql
Перенос
Старый сервер. Файл будет создан в примонтированной директории dumps
. Перенос файла дампа на новый сервер можно выполнить любым удобным способом, scp или winSCP (GUI для scp).
Новый сервер. Проделайте те же действия с docker-compose.yml
для создания volume и перезапустите контейнер. В директории рядом с docker-compose.yml
должна создастся папка dumps
. Перенесите файл дампа туда.
Restore
Войдите внутрь контейнера с помощью команды (Выйти из контейнера: ctrl+d
):
docker exec -it postgres_db bash
Тут существует два варианта.
- Вариант 1. Если база данных чистая, то выполните команду:
psql -d database_name < dumps/db.sql
- Вариант 2. Если база данных не чистая или вы сделали что-то не так и psql не даёт восстановить из дампа. Самый простой способ дропнуть базу и создать её заного.
После чего загрузите базу данных из дампа:psql -c "DROP DATABASE database_name;" psql -c "CREATE DATABASE database_name;"
psql -d database_name < dumps/db.sql
Поздравляю, вы великолепны!
Local port forwarding
Command explanation
To forward port of remote host use the following command
ssh -L <LOCAL_PORT>:<TUNNEL_IP>:<DESTINATION_PORT> <user>@<server_ip>
-L stands for local adress because we are tunneling connection on local machine, TUNNEL_IP is 127.0.0.1
ssh -L <LOCAL_PORT>:127.0.0.1:<DESTINATION_PORT> <user>@<server_ip>
Real life example
- I have a server with ip 69.69.69.69
- I have user on a server called gnumik
- My public key is recognized by this server and I can establish ssh connection like this:
ssh gnumik@69.69.69.69
- I have postgresql data base running on the server on port 5432
- I want to have access to this postgre instance from my local machine using local port 5433
- I need to execute the following command on my local machine:
ssh -L 5433:127.0.0.1:5432 gnumik@69.69.69.69
P.S. I use arch btw
Nvidia
TBD https://habr.com/ru/companies/hostkey/articles/835058/
Монтирование самбы на Ubuntu server
Чтобы подключить удаленную папку через SMB (версии 2 и выше) к Ubuntu с помощью консоли Bash, выполните следующие шаги:
1. Установите необходимые пакеты
sudo apt update
sudo apt install cifs-utils
2. Создайте точку монтирования
Создайте папку, куда будет монтироваться удаленный ресурс:
sudo mkdir -p /mnt/smb-share
3. Подключите удаленную папку
Используйте команду mount
для подключения:
sudo mount -t cifs -o username=USERNAME,password=PASSWORD,vers=2.0 //SERVER_ADDRESS/SHARE_NAME /mnt/smb-share
-
USERNAME
— имя пользователя для доступа к SMB-ресурсу. -
PASSWORD
— пароль пользователя. -
SERVER_ADDRESS
— IP-адрес или имя хоста SMB-сервера. -
SHARE_NAME
— имя общего ресурса на сервере. -
vers=2.0
— указание версии протокола SMB (можно заменить наvers=3.0
, если требуется версия 3).
Если вы хотите ввести пароль вручную или оставить его в безопасности, не указывайте его в команде, и вам будет предложено ввести его после выполнения команды.
4. Проверьте подключение
Проверьте доступ к монтированной папке:
ls /mnt/smb-share
5. Автоматическое монтирование (опционально)
Чтобы подключение выполнялось автоматически при загрузке системы:
- Откройте файл
/etc/fstab
для редактирования:sudo nano /etc/fstab
- Добавьте строку:
//SERVER_ADDRESS/SHARE_NAME /mnt/smb-share cifs username=USERNAME,password=PASSWORD,vers=2.0 0 0
- Сохраните файл и примонтируйте ресурсы:
sudo mount -a
Если хотите хранить пароль отдельно, создайте файл /etc/samba/credentials
:
sudo nano /etc/samba/credentials
Содержимое:
username=USERNAME
password=PASSWORD
Защитите файл:
sudo chmod 600 /etc/samba/credentials
И обновите запись в /etc/fstab
:
//SERVER_ADDRESS/SHARE_NAME /mnt/smb-share cifs credentials=/etc/samba/credentials,vers=2.0 0 0
Теперь монтирование будет происходить безопасно и автоматически.
Авто
Чтобы монтирование SMB-папки выполнялось автоматически при загрузке системы, выполните следующие шаги:
1. Настройка файла /etc/fstab
Откройте файл /etc/fstab
для редактирования:
sudo nano /etc/fstab
Добавьте строку в конец файла:
//SERVER_ADDRESS/SHARE_NAME /mnt/smb-share cifs credentials=/etc/samba/credentials,vers=2.0,iocharset=utf8 0 0
Расшифровка параметров:
-
//SERVER_ADDRESS/SHARE_NAME
— путь к SMB-ресурсу (например,//192.168.1.10/share
). -
/mnt/smb-share
— локальная точка монтирования. -
cifs
— тип файловой системы. -
credentials=/etc/samba/credentials
— путь к файлу с учетными данными. -
vers=2.0
— версия протокола SMB (можно использоватьvers=3.0
, если сервер поддерживает SMBv3). -
iocharset=utf8
— кодировка для корректного отображения имен файлов. -
0 0
— параметры для автоматического монтирования.
2. Создание файла с учетными данными
Создайте файл для хранения имени пользователя и пароля:
sudo nano /etc/samba/credentials
Добавьте следующие строки:
username=USERNAME
password=PASSWORD
Сохраните файл и закройте редактор.
Защитите файл от несанкционированного доступа:
sudo chmod 600 /etc/samba/credentials
3. Проверка монтирования
После настройки, выполните команду:
sudo mount -a
Если папка примонтировалась без ошибок, настройка выполнена правильно.
4. Перезагрузка системы
Перезагрузите компьютер, чтобы убедиться, что папка монтируется автоматически:
sudo reboot
После загрузки проверьте содержимое точки монтирования:
ls /mnt/smb-share
Теперь папка будет автоматически подключаться при каждой загрузке системы.