Microsoft SQL Server Express Edition — автоматические бекапы базы данных

Microsoft SQL Server Express Edition — бесплатная версия Microsoft SQL Server, в которой многий функционал порезан.

Например отсутствует SQL Server Agent или Maintenance Plans, которые облегчают создание автоматических бэкапов баз данных.

В связи с этим, приходится выбирать другие пути. Один из них описан ниже.

Исходные данные для наших настроек:

  • имя базы данных: db_name
  • путь для хранения скриптов и бэкапов базы данных db_name: «d:\projects\db_backups»
  • периодичность создания бэкапов: раз в 1 день
  • срок хранения бекапов: 3 дня

Разделим скрипт бекапов на 2 шага:

  1. создание и сохранение бекапа
  2. очистка папки от старых бэкапов

Для первого шага:

a) Запускаем нижеследующий скрипт, например в Management Studio, чтобы записалась хранимая процедура на master базе данных

USE [master]
GO
/****** Object:  StoredProcedure [dbo].[sp_BackupDatabases]    Script Date: 8/12/2021 6:26:34 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================  
-- Author: Microsoft  
-- Create date: 2010-02-06 
-- Description: Backup Databases for SQLExpress 
-- Parameter1: databaseName  
-- Parameter2: backupType F=full, D=differential, L=log 
-- Parameter3: backup file location 
-- ============================================= 
CREATE PROCEDURE [dbo].[sp_BackupDatabases]   
            @databaseName sysname = null, 
            @backupType CHAR(1), 
            @backupLocation nvarchar(200)  
AS  
       SET NOCOUNT ON;  
            DECLARE @DBs TABLE 
            ( 
                  ID int IDENTITY PRIMARY KEY, 
                  DBNAME nvarchar(500) 
            ) 
             -- Pick out only databases which are online in case ALL databases are chosen to be backed up 
             -- If specific database is chosen to be backed up only pick that out from @DBs 
            INSERT INTO @DBs (DBNAME) 
            SELECT Name FROM master.sys.databases 
            where state=0 
            AND name= ISNULL(@databaseName ,name)
            ORDER BY Name
            -- Filter out databases which do not need to backed up 
            IF @backupType='F' 
                  BEGIN 
                  DELETE @DBs where DBNAME IN ('tempdb','Northwind','pubs','AdventureWorks') 
                  END 
            ELSE IF @backupType='D' 
                  BEGIN 
                  DELETE @DBs where DBNAME IN ('tempdb','Northwind','pubs','master','AdventureWorks') 
                  END 
            ELSE IF @backupType='L' 
                  BEGIN 
                  DELETE @DBs where DBNAME IN ('tempdb','Northwind','pubs','master','AdventureWorks') 
                  END 
            ELSE 
                  BEGIN 
                  RETURN 
                  END 
            -- Declare variables 
            DECLARE @BackupName nvarchar(100) 
            DECLARE @BackupFile nvarchar(300) 
            DECLARE @DBNAME nvarchar(300) 
            DECLARE @sqlCommand NVARCHAR(1000)  
	        DECLARE @dateTime NVARCHAR(20) 
            DECLARE @Loop int                   
            -- Loop through the databases one by one 
            SELECT @Loop = min(ID) FROM @DBs 
      WHILE @Loop IS NOT NULL 
      BEGIN 
-- Database Names have to be in [dbname] format since some have - or _ in their name 
      SET @DBNAME = '['+(SELECT DBNAME FROM @DBs WHERE ID = @Loop)+']' 
-- Set the current date and time n yyyyhhmmss format 
      SET @dateTime = REPLACE(CONVERT(VARCHAR, GETDATE(),101),'/','') + '_' +  REPLACE(CONVERT(VARCHAR, GETDATE(),108),':','')   
-- Create backup filename in path\filename.extension format for full,diff and log backups 
      IF @backupType = 'F' 
            SET @BackupFile = @backupLocation+REPLACE(REPLACE(@DBNAME, '[',''),']','')+ '_FULL_'+ @dateTime+ '.BAK' 
      ELSE IF @backupType = 'D' 
            SET @BackupFile = @backupLocation+REPLACE(REPLACE(@DBNAME, '[',''),']','')+ '_DIFF_'+ @dateTime+ '.BAK' 
      ELSE IF @backupType = 'L' 
            SET @BackupFile = @backupLocation+REPLACE(REPLACE(@DBNAME, '[',''),']','')+ '_LOG_'+ @dateTime+ '.TRN' 
-- Provide the backup a name for storing in the media 
      IF @backupType = 'F' 
            SET @BackupName = REPLACE(REPLACE(@DBNAME,'[',''),']','') +' full backup for '+ @dateTime 
      IF @backupType = 'D' 
            SET @BackupName = REPLACE(REPLACE(@DBNAME,'[',''),']','') +' differential backup for '+ @dateTime 
      IF @backupType = 'L' 
            SET @BackupName = REPLACE(REPLACE(@DBNAME,'[',''),']','') +' log backup for '+ @dateTime 
-- Generate the dynamic SQL command to be executed 
       IF @backupType = 'F'  
                  BEGIN 
               SET @sqlCommand = 'BACKUP DATABASE ' +@DBNAME+  ' TO DISK = '''+@BackupFile+ ''' WITH INIT, NAME= ''' +@BackupName+''', NOSKIP, NOFORMAT' 
                  END 
       IF @backupType = 'D' 
                  BEGIN 
               SET @sqlCommand = 'BACKUP DATABASE ' +@DBNAME+  ' TO DISK = '''+@BackupFile+ ''' WITH DIFFERENTIAL, INIT, NAME= ''' +@BackupName+''', NOSKIP, NOFORMAT'         
                  END 
       IF @backupType = 'L'  
                  BEGIN 
               SET @sqlCommand = 'BACKUP LOG ' +@DBNAME+  ' TO DISK = '''+@BackupFile+ ''' WITH INIT, NAME= ''' +@BackupName+''', NOSKIP, NOFORMAT'         
                  END 
-- Execute the generated SQL command 
       EXEC(@sqlCommand) 
-- Goto the next database 
SELECT @Loop = min(ID) FROM @DBs where ID>@Loop 
END 

b) В папке бэкапов создаем исполняемый файл с расширение bat (например, sql_db_backup.bat) и содержимым

sqlcmd -S .\SQLEXPRESS -E -Q "EXEC sp_BackupDatabases @backupLocation='d:\projects\db_backups', @databaseName='db_name', @backupType='F'"

где ‘d:\projects\db_backups‘ — здесь будем хранить бэкапы, db_name — имя базы данных (из условий выше)

с) создаем в Расписании Виндовс (Task Scheduler) задачу для выполнения скрипта c параметрами

  • Create Basic Task…
  • Run whether user is logged on or not’ выбранный, затем выбираем ‘Do not store password…
  • Trigger: Daily, и время, когда будет выполняться скрипт
  • Actions: Start a program — и указываем путь к bat файлу, созданному ранее — sql_db_backup.bat
  • Остальные параметры второстепенны

Уже на этом шаге у нас будут создаваться ежедневные бэкапы, но мы пойдем дальше и будем очищать старые бекап, чтобы освобождать место на жестов диске.

Для второго шага:

a) создадим скрипт с расширением bat (например, sql_clean_backups.bat) и содержимым

forfiles -p d:\projects\db_backups\ -m *.bak* /D -3 /C "cmd /c del /q @path"

который будет удалять файлы с расширением .bak старше 3х дней

b) создаем в Расписании Виндовс (Task Scheduler) задачу для выполнения скрипта c параметрами аналогичными пункту (c) первого шага.

На этом все…

Jenkins — git — собираем проект из приватного репозитория

Генерируем на целевом сервере SSH ключ

Чтобы Jenkins на нашем сервере смог получить доступ к коду из репозитория — необходимо сгенерировать приватный и публичный ключ и раздать их в соответствии с назначением.
Для генерации ключей, в терминате (консоли) сервера вводим команду

$ ssh-keygen

При этом видим предложение сгенерировать ключ по стандартному для этого случая пути

Generating public/private rsa key pair.
Enter file in which to save the key (/Users/user01/.ssh/id_rsa):

Рекомендуется выбирать дефолтный путь — жмем Enter, но вы можете и поменять путь.

Далее система попросит ввести passphrase. Для простоты можем оставить это поле пустым, как и следующее (подтверждающее ввод)

Enter passphrase (empty for no passphrase):
Enter same passphrase again:

Успешная генерация ключа сопровождается следующим выводом в консоли

Your identification has been saved in /Users/emmap1/.ssh/id_rsa.
Your public key has been saved in /Users/emmap1/.ssh/id_rsa.pub.
The key fingerprint is:
4c:80:61:2c:00:3f:9d:dc:08:41:2e:c0:cf:b9:17:69 emmap1@myhost.local
The key’s randomart image is:
+—[ RSA 2048]—-+
|*o+ooo.          |
|.+.=o+ .         |
|. *.* o .        |
| . = E o         |
|    o . S        |
|   . .           |
|     .           |
|                 |
|                 |
+——————+

Выведем сгенерированные файлы списком на экран

$ ls ~/.ssh
id_rsa id_rsa.pub

Выводится 2 файла:

id_rsa — приватный ключ, который понадобится нам для генерациия пользователя аутентификации в репозитории на cтороне Jenkins

id_rsa.pub — публичный ключ, который необходимо разместить в разделе access keys целевого репозитория

Добавляем публичный ключ в разделе ключей приватного репозитория

Например, в Bitbucket, публичный ключ можно добавить в разделе
Repository settingsAccess keysAdd key (настройки конкретного репозитория)

Добавляем приватный ключ в Jenkins

Заходим в раздел Управления Ключами (JenkinsManage JenkinsManage Credentials)

И добавляем приватный ключ (содержимое файла id_rsa.pub) в поле Private key, как проиллюстрировано ниже

Заполняем поле Username — имя для пользователя. Сохраняем.

Осталось подключится к репозиторию.

Перейдем в настройки ранее созданного проекта в Jenkins.

Source Code Management — выбираем Git (1)

Repositories — вставляем ссылку на репозиторий (2) и из выпадающего списка выбираем нашего только что созданного пользователя с приватным ключом (3)

Branches to build — обычно указывают мастер ветку — */master (4)

Сохраняем проект в Jenkins.

Теперь мы готовы собрать проект из приватного репозитория.

Установка WordPress на CentOS7 c PHP7.2 и MySQL 8

Это последняя статья из серии «Устанавливаем блог WordPress на CentOS 7 с веб-сервером Caddy, PHP 7.2 и MySQL 8.0».

Ранее, для установки блога на вордпресс, мы уже сконфигурировали CentOS 7, установили майскл восьмой версии, пхп и кэдди в качестве быстрого, современного веб-сервера. Последний элемент — сам блог wordpress

Итак, на нашем сервере, переходим в директорию для веб-сайтов

$ cd /var/www

Скачиваем последнюю версию WordPress

$ sudo curl -O https://wordpress.org/latest.tar.gz

Распаковываем (архиватор распакует автоматически в директорию wordpress)

$ sudo tar zxf latest.tar.gz

Удаляем архив с файлами блога вордпресс (он нам больше не нужен)

$ sudo rm latest.tar.gz 

Устанавливаем права на директорию wordpress для caddy пользователя (ранее сконфигурированного при установке Caddy web-сервера)

$ sudo chown -R caddy:caddy wordpress

Теперь, подключим и настроим сайт нашего вордпресса

В данном примере, используем текстовый редактор nano, который мы ставили ранее (при конфигурировании операционной системы CentOS 7), однако вы можете использовать другой редактор, в том числе стандартный vi

Итак, открываем конфишурационный файл веб-сервера кедди

$ sudo nano /etc/caddy/Caddyfile

Копируем код ниже и вставляем его в файл конфигурации (при это необходимо заменить «example.com», в двух местах, доменом, который мы создавали в статье по выбору и приобретению простого и недорогого домена для вашего блога)

example.com {

    tls admin@example.com

    root /var/www/wordpress

    gzip

    fastcgi / 127.0.0.1:9000 php

    rewrite {

        if {path} not_match ^\/wp-admin

        to {path} {path}/ /index.php?_url={uri}

    }

}

Сохраняем (CTRL+O и ENTER для текстового редактора nano) и закрываем файл (CTRL+X).

Перезагружаем веб-сервер Caddy, чтобы применить новую конфигурацию

$ sudo systemctl restart caddy

Теперь наш блог должен открыться через браузер (пока что интерфейс для дальнейшего конфигурирования) — вводим в строке урл любого браузера наш домен (в моем случае это questpro.club), выбираем язык интерфейса (мне удобнее будет английский, но советую выбрать русский).

Жмем кнопку Let’s go

В предлагаемых полях на следующем экране вводим следующие данные (из этого мануала)

Database Name = wordpress

Username = wordpressuser

Password = gHspvn@36nBA

Database Host — оставляем значения по умолчанию

Table Prefix — оставляем значения по умолчанию.

Происходит инсталляция…

По ее завершении, вводим необходимые данные админа, для входа в админский аккаунт в вордпрессе. И далее пробуем заходить в админку с только что сгенерированными данными.

WordPress установлен

В следующей статье опишу процесс создания вашей собственной первой статьи и расскажу про популярный seo-плагин для начальной сео-оптимизации.

Установка и настройка веб-сервера Caddy на Centos 7

Как альтернативу, ранее незыблемым, веб-серверам (Nginx, Apache), предлагаю использовать Caddy, который стал достаточно популярным, так как он гораздо легче разворачивается и конфигурируется, да и поддержка сертификатов тут «с коробки» (а это немаловажно в последние года, когда поисковики лучше ранжируют сайты с HTTPS, да и браузеры, ныне, показывают всякие бяки для HTTP сайтов рядом с урлом)

Подробно об установке Caddy на операционной системе CentOS можно посмотреть в официальной документации нашего облачного провайдера Digital Ocean (хостинг на котором мы настраивали ранее)

https://www.digitalocean.com/community/tutorials/how-to-host-a-website-with-caddy-on-centos-7

Но давайте опишу процесс ниже (и по-русски)

В одном из предыдущих туториалов мы использовали текстовый редактор vi, однако предлагаю поставить более удобный — nano

$ sudo yum install nano

Чтобы установить Caddy (не-коммерческая лицензия) запускаем

$ curl https://getcaddy.com | bash -s personal

Установка попросит ввести пароль для аккаунта операционной системы

Следующей командой можем проверить путь, куда был установлен Caddy:

$ which caddy

У меня это — /usr/local/bin/caddy

Далее, создадим пользователя, от имени которого будем работать с веб-сервером — caddy

$ sudo adduser -r -d /var/www -s /sbin/nologin caddy

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

Создаем директорию для главного конфигурационного файла веб-сервера (Caddyfile)

$ sudo mkdir /etc/caddy

Назначаем необходимые права на директорию

$ sudo chown -R root:caddy /etc/caddy

Создаем конфигурационный файл Caddyfile

$ sudo touch /etc/caddy/Caddyfile

(чуть позже его отредактируем)

Создадим директорию для хранения SSL приватных ключей и сертификатов

$ sudo mkdir /etc/ssl/caddy

И необходимые права для этой директории

$ sudo chown -R caddy:root /etc/ssl/caddy
$ sudo chmod 0770 /etc/ssl/caddy

Также, нам нужна директория для хранения кода нашего блога (да и других будущих сайтов)

$ sudo mkdir /var/www

И необходимые права на эту директорию

$ sudo chown caddy:caddy /var/www

Теперь необходимо сконфигурировать веб-сервер Кэдди (Caddy), чтобы запускался автоматически с загрузкой системы как сервис

Скачиваем необходимый для этого файл из официального репозитория Caddy

$ sudo curl -s https://raw.githubusercontent.com/caddyserver/dist/master/init/caddy.service -o /etc/systemd/system/caddy.service

(потребуется ввод пароля для аккаунта операционной системы)

Необходимо внести мелкие изменения в скачанный файл — открываем caddy.service с помощью редактора nano (или другого любимого редактора)

$ sudo nano /etc/systemd/system/caddy.service

Находим секцию с установкой User и Group, как указано ниже

User=caddy

Group=caddy

Если User или Group отличный от caddy — меняем на caddy как в примере выше.

Сохраняем файл и закрываем (в nano редакторе это CTRL+O и CTRL+X соответсвенно)

Подбираем наш новый сервис системой:

$ sudo systemctl daemon-reload

Добавляем Caddy в автозагрузку

$ sudo systemctl enable caddy.service

И, удостоверившись, что он загружен и может быть запущен

$ sudo systemctl status caddy.service

Вывод будет примерно такой

● caddy.service - Caddy

   Loaded: loaded (/etc/systemd/system/caddy.service; enabled; vendor preset: disabled)

   Active: inactive (dead)

     Docs: https://caddyserver.com/docs/

Что говорит о том, что сервис загружен и доступен.

Последним этапом можно запустить веб-сервер Кэдди, например, командой

$ sudo systemctl start caddy

Но это будет сделано в любом случае в следующей статье, где мы установим WordPress

Начальная конфигурация CentOS 7

Это третья статья из серии «Устанавливаем блог WordPress на CentOS с Caddy, PHP 7.2 и MySQL 8.0». Вот мы, как раз, и приступаем к настройке операционной системы центос.

Первый коннект к серверу выглядит следующим образом

$ ssh -i {/path/to/private/key} root@{IP-address}

(например ssh -i ~/.ssh/sy_blog_01a root@203.0.113.0 — т.е. без фигурных скобок) 

При самом первом соединении с сервером CentOS, когда удаленный сервер не «встречал» ранее ваш локальный сервер, он спросит уверены ли вы, что хотите законнектиться — набираем yes и жмем Enter.

После чего наш сервер сообщает, что добавляет локальный сервер в известные ему хосты.

Root юзер (супер-админский пользователь, генерируемый при создании сервера) обладает сверх-привилегиями, поэтому рекомендуется создать нового пользователя для дальнейшей работы с сервером.

Делается это просто (имя нового юзера может быть любое, в этом примере указываю имя droplet)

$ adduser droplet 

следующей коммандой устанавливаем юзеру пароль (как и в примере выше, у нас юзер droplet)

$ passwd droplet

вводим пароль и повторяем ввод пароля (обязательно сохраните, система может иногда запрашивать пароль)

Далее, чтобы можно было выполнять административные команды от имени нового юзера, добавим его в специальную группу wheel

$ gpasswd -a droplet wheel

Рекомендуется (с точки зрения безопасности) создать пользователю SSH ключ для доступа, плюс в конфигах операционной системы CentOS, по умолчанию, включен запрет на вход по паролю, разрешен только по файл-ключу. 

Ключ этот генерируем на локальном компьютере, а не на сервере. Ранее мы это делали для root пользователя (ссылка на предыдущую статью). Напоминаю, что делаю на macOS (для Windows процедура немного другая)

Открываем терминал и выполняем команду

$ cd ~/.ssh

для перехода в директорию ключей. Далее

$ ssh-keygen -t rsa

Для генерации ключа. В наем примере, имя будем использовать blog_02a, а поле passphrase оставляем пустое.

Распечатываем публичный ключ для переноса на наш сервер

$ cat ~/.ssh/blog_02a.pub

Мы готовы к переносу ключа на сервер и установки его для нового пользователя. Присоединяемся к серверу под root пользователем, как мы делали это в самом начале этой статьи. Далее, переключаемся на нашего нового пользователя

# su - droplet

Оказываемся в домашней директории пользователя droplet.

Создаем новую директорию для ключа и назначаем ей необходимые права

$ mkdir .ssh
$ chmod 700 .ssh

Следующей командой создаем и открываем файл для ввода ключа

$ vi .ssh/authorized_keys

Нажимает клавишу i чтобы перейти в режим редактирования в редакторе vi, вставляем ключ из буфера обмена, скопированный ранее, нажимаем ESC, чтобы выйти из режима редактирования. После этого набираем с клавиатуры 2 символа: символ «двоеточия» и английская буква x и жмем ENTER чтобы сохранить и закрыть файл.

И, так же, устанавливаем на созданный файл необходимые права

$ chmod 600 .ssh/authorized_keys

И выходим из сервера, чтобы проверить установку соединения по новому пользователю

$ exit
$ exit

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

$ ssh -i ~/.ssh/blog_02a droplet@203.0.113.0

(у вас будет точно другой IP после знака @, и, возможно, другие имя пользователя и путь к ключу)

Таким образом, у нас готовая операционна система для установки блога.

Хостинг Digital Ocean

Это первая статья из серии «Устанавливаем блог WordPress на CentOS с Caddy, PHP 7.2 и MySQL 8.0». В любом случае, нам понадобится хостинг для размещения блога.

Работая с бесплатными (условно-бесплатными) хостинг-провайдерами и платными, все таки, хочу отдать предпочтение платному с лучшей управляемостью и хорошим сервисом.

Имею достаточно большой и позитивный опыт с Amazon (AWS), хотя он, считается дорогим (заслуженно, так как инфраструктура там широчайшая). Зная, что есть альтернативы, решил остановить свой выбор на Digital Ocean (DO), так же широко известном.

Плюсом будет то, что у DO есть достаточный по характеристикам сервер стоимостью 5 у.е.

Итак, нужно зарегистрировать :

https://cloud.digitalocean.com/registrations/new

Процесс регистрации типичный, сложностей возникнуть не должно.

Далее, привязываем карту (или другой платежный инструмент).

В DO облачные сервера называются «дроплетами» (Droplet). С английского переводится, как «капля». Это, чтоли, отсылка к тому, что облако состоит из множества капелек?! =)

Итак, перейдем к созданию дроплета-сервера: CreateDroplets

Далее выбираем операционную систему. Исторически сложилось, что, в основном, приходилось работать со сборками CentOS (версии 6 и 7) — выбираем 7.6 версию

План — Standard

Тариф — 5 у.е. в месяц (1GB / 1CPU / 25GB SSD)

Датацентр (физическое расположение сервера) выбираем поближе к России. Я выбирал Frankfurt

Метод аутентификации, для пущей «секьюрности» выбрал SSH keys (в этом случае доступ к серверу будет осуществляться не по паре {логин + пароль}, а по паре {логин + файл-ключ}). При этом необходимо загрузить сгенерированные самостоятельно SSH-ключ. Это и сделаем далее…

Нажимаем тут кнопку New SSH Key и видим следующее диалоговое окно:

Сгенерированный файл-ключ необходимо вставить в левое поле (1 на скрине), а достаточно подробная инструкция по генерации этого файл-ключа находится в правой области (2 на скрине). Тем не менее, давайте опишу как это сделать на русском языке. 

Оговорюсь, что, при написании данной статьи, была использована операционная система macOS (процесс создания аналогичный для Linux систем, а для Windows постараюсь описать позже). Итак, открываем терминал и выполняем команду

$ cd ~/.ssh

для перехода в специальную директорию (для SSH ключей) внутри домашней директории для вашего текущего пользователя

Далее выполняем команду для генерации ключа

$ ssh-keygen -t rsa

Увидим следующую предложение для ввода имени ключа

Enter file in which to save the key (/home/user/.ssh/id_rsa):

вводим удобное для вас имя (чтобы далее его можно было найти), например blog_01a и подтверждаем ввод — ENTER

Для упрощения (уровень защита для блога с файлом-ключем — отличный уровень) оставляем поле passphrase пустым (нажимаем Enter при его запросе и Enter для повторного ввода ключ-фразы). В результате, видим сообщение об успешной генерации файл-ключа.

Чтобы вывести в консоль содержимое публичного ключа (а именно он нам необходим для ввода в интерфейсе создания Droplet-сервера) используем следующую команду

$ cat ~/.ssh/blog_01a.pub

Копируем полученное буквенно-цифровое выражение, а это будет что-то вроде…

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDi28juE0FufXdPwZmOUE+E+gQJSunhUmsE7mSnuPmwcb8VBVuly4Uarq3EkCYAXrjrPwq/FOQWDX1Yw2sC16gQLWECUUKmnVR3OPrZCW2iPOO/ZpSLvs0cMrAHZlobBrNOYLl22tnIuaZVl49GLCcwuEFIQuxcIO9fU8ZBD0fpJoOEl9niqg2n2/86IczTGhsxdjq+EXyYLTUv/F0GtEneQQCxiHRVRTL1dDNbSQZj1Y0UtKZHFNHsI6TbmhkUlFZX3jEmC+b6XxSmJM2UiTCKOERAKmImTwnDOyLPZmnKAbGrqLmQv/E1GQdAqyGJCEC7zThFxwPtkvcmo2NzFwsr

…и вставляем в ранее указанное поле в диалоговом окне добавления файла-ключа в интерфейсе создания Droplet. Даем имя в поле Name (например тоже, что и у файла-ключа — blog_01a) и жмем кнопку Add SSH Key

Готово. Осталось отметить его галочкой, оставить, как есть «1 Droplet» в поле «How many Droplets?» и дать ему имя в поле «Choose a hostname».

Tags — опционально, выбираем Project (если ранее не создавали проект — создаем, это просто), пока что отключаем backups (так как это лишние траты, если захотим — включим позже) и, наконец-то нажимаем кнопку Create Droplet. С удовольствием наблюдаем за процессом создания нашего сервера…

Теперь то мы научились достаточно многому, а в следующей статье мы создадим доменное имя и привяжем к нашему серверу.