DNS-хостинг в Digital Ocean
В ноябре 2014 года Digital Ocean анонсировала обновленную услугу DNS-хостинга . Помимо быстрой и надежной работы пользователи почти мгновенно обновляют записи DNS. Любой разработчик или системный администратор может оценить преимущества этого: больше не нужно ждать обновления IP-адресов во время миграции системы. В этом руководстве мы собираемся расширить функциональность консольного приложения, которое мы создали в прошлый раз, чтобы включить управление службой DNS Digital Ocean.
Опять же, вы можете скачать бесплатное консольное приложение из репозитория Tuts + Github . Я разместил подробное руководство по установке консольного приложения на своем веб-сайте. Вы также можете ознакомиться с моим общим руководством по установке приложений Digital Ocean .
Хотя вы можете использовать веб-консоль Digital Ocean для управления своими записями DNS, вам может оказаться полезным программно управлять ими через API.
Документация по службам DNS API Digital Ocean расположена в двух основных областях:
Сначала мы сконцентрируемся на настройке ваших доменов, а затем добавим отдельные записи DNS.
Направьте свое имя на услуги Digital Ocean
Прежде чем вы сможете активировать собственные службы DNS Digital Ocean, вам необходимо перенести свои доменные серверы имен на серверы имен Digital Ocean:
- ns1.digitalocean.com
- ns2.digitalocean.com
- ns3.digitalocean.com
Я собираюсь добавить свой домен StarWars.io для демонстрации этого урока. Вот мое изменение сервера имен у моего регистратора доменов:
Вы также можете найти, как указывать на серверы имен DigitalOcean от обычных регистраторов доменов .
Использование сайта Digital Ocean для управления DNS
Во-первых, давайте добавим домен к DNS Digital Ocean через веб-интерфейс пользователя. В левой части навигационного меню нажмите на DNS:
Нажмите Добавить домен :
Вот как Digital Ocean отображает вашу запись DNS. Хорошо, что он показывает вам сгенерированный файл зоны ниже:
Далее мы добавим запись домена A для www.starwars.io :
Теперь давайте рассмотрим API, начав с загрузки некоторых доменов и записей доменов, которые мы только что создали.
Синхронизируйте ваши записи DNS
Во-первых, давайте загрузим список наших доменов, используя API. В нашем консольном приложении нажмите Домены на панели навигации и выберите Синхронизация в правом меню.
Код DomainController
выглядит следующим образом:
1
2
3
4
5
|
public function actionSync() {
$domain = new Domain();
$domain->sync();
$this->redirect(‘/domain/admin’);
}
|
Затем модель домена вызывает наши функции компонента Ocean и добавляет каждый найденный домен в нашу локальную базу данных:
1
2
3
4
5
6
7
|
public function sync() {
$ocean = new Ocean();
$domains = $ocean->getDomains();
foreach ($domains as $d) {
$domain_id = $this->add($d);
}
}
|
Вот код API из компонента Ocean для получения списка доменов:
1
2
3
4
5
6
7
|
public function getDomains() {
// return the action api
$action = $this->digitalOcean->domain();
// return a collection of Action entity
$actions = $action->getAll();
return $actions;
}
|
Вот метод доменной модели Add:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
public function add($domain) {
$d = Domain::model()->findByAttributes(array(‘name’=>$domain->name));
if (empty($d)) {
$d = new Domain;
}
$d->name = $domain->name;
$d->ttl = $domain->ttl;
$d->zone = $domain->zoneFile;
$d->active =1;
$d->created_at = $d->created_at;
$d->modified_at =new CDbExpression(‘NOW()’);
$d->save();
return $d->id;
}
|
Вы должны увидеть что-то вроде этого после завершения:
Нажмите на значок управления в строке звездных войн, и вы увидите что-то вроде этого:
Затем давайте синхронизируем записи домена для starwars.io. Нажмите Sync Domain Records — это SyncRecords
действие SyncRecords
в DomainController
:
1
2
3
4
5
|
public function actionSyncrecords($id) {
$dr = new DomainRecord();
$dr->sync($id);
$this->redirect(‘/domain/view/’.$id);
}
|
Метод DomainRecord
модели DomainRecord
выглядит следующим образом. Он делает запрос на записи доменного имени и добавляет каждую в таблицу DomainRecord
в нашей локальной базе данных:
1
2
3
4
5
6
7
8
9
|
public function sync($id) {
// lookup domain
$d = Domain::model()->findByPk($id);
$ocean = new Ocean();
$records = $ocean->getDomainRecords($d->name);
foreach ($records as $r) {
$record_id = $this->add($id,$r);
}
}
|
Вот метод getDomainRecords
компонента getDomainRecords
:
1
2
3
4
5
|
public function getDomainRecords($name) {
$action = $this->digitalOcean->domainRecord();
$actions = $action->getAll($name);
return $actions;
}
|
DomainRecord
добавления DomainRecord
немного более детален:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
public function add($domain_id,$record) {
$dr = DomainRecord::model()->findByAttributes(array(‘record_id’=>$record->id));
if (empty($dr)) {
$dr = new DomainRecord;
}
$dr->domain_id = $domain_id;
$dr->record_id = $record->id;
$dr->record_name = $record->name;
$dr->record_type = $record->type;
$dr->record_data = $record->data;
if (isset($record->priority))
$dr->priority = $record->priority;
else
$dr->priority = null;
if (isset($record->port))
$dr->port = $record->port;
else
$dr->port = null;
if (isset($record->weight))
$dr->weight = $record->weight;
else
$dr->weight = null;
$dr->active =1;
$dr->created_at =new CDbExpression(‘NOW()’);
$dr->modified_at =new CDbExpression(‘NOW()’);
$dr->save();
return $dr->id;
}
|
Вот как это будет выглядеть после синхронизации записей домена:
Добавление доменов из нашей консоли
Вы также можете добавить домены и доменные записи из нашей консоли вручную.
Вот код в модели Домена, который вызывает запрос API для добавления домена:
1
2
3
4
5
6
|
public function remote_add() {
$ocean = new Ocean();
$domain = $ocean->createDomain($this->name, $this->ip_address);
$this->save();
return true;
}
|
Вот метод addDomain
компонента addDomain
:
1
2
3
4
5
|
public function createDomain($name,$ip_address) {
$action = $this->digitalOcean->domain();
$create = $action->create($name,$ip_address);
return $create;
}
|
Затем синхронизируйте записи домена и добавьте свои собственные:
Вот метод DomainRecord
модели DomainRecord
:
01
02
03
04
05
06
07
08
09
10
11
12
|
public function remote_add($id) {
$d = Domain::model()->findByPk($id);
$ocean = new Ocean();
$record = $ocean->createDomainRecord($d->name,$this->record_type,$this->record_name,$this->record_data,$this->priority,$this->port,$this->weight);
$this->domain_id = $id;
$this->record_id = $record->id;
$this->active =1;
$this->created_at =new CDbExpression(‘NOW()’);
$this->modified_at =new CDbExpression(‘NOW()’);
$this->save();
return true;
}
|
Вот компонент Ocean, createDomainRecord
метод createDomainRecord
:
1
2
3
4
5
6
7
8
9
|
public function createDomainRecord($domain_name,$type,$name,$data,$priority,$port,$weight) {
$domainRecord = $this->digitalOcean->domainRecord();
if ($priority==») $priority=null;
if ($port==») $port=null;
if ($weight==») $weight=null;
// return the created DomainRecord entity of the domain ‘bar.dk’
$created = $domainRecord->create($domain_name,$type, $name, $data,$priority,$port,$weight);
return $created;
}
|
Вы должны увидеть что-то подобное в нашей консоли:
Вот что показывает веб-консоль Digital Ocean — обратите внимание, что наше локальное представление и удаленное представление теперь идентичны:
Как вы могли заметить, в этом коде отсутствует надежная проверка ошибок, синхронизация, обновление, удаление и другие помехи. Я оставляю это вам, чтобы продлить, как вы хотите.
Я надеюсь, что вы нашли это исследование DNS API Digital Ocean полезным.
Пожалуйста, не стесняйтесь оставлять свои вопросы и комментарии ниже. Вы также можете связаться со мной в Twitter @reifman или написать мне напрямую. Следуйте за моей страницей инструктора Tuts +, чтобы видеть будущие статьи на связанные темы