-
Notifications
You must be signed in to change notification settings - Fork 0
/
ruby-windows-bootstrap.html
607 lines (514 loc) · 52.7 KB
/
ruby-windows-bootstrap.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
<!DOCTYPE html>
<html class="no-js" lang="ru">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta charset="utf-8">
<title>Установка Ruby on Rails на Windows</title>
<meta content="Простое разворачивание полноценного linux окружения на Windows платформе
" name="description">
<meta content="2011, Andriy Malyshko, http://nashbridges.me" name="author">
<meta content="width=device-width, initial-scale=1.0" name="viewport">
<link href="/favicon.ico" rel="shortcut icon">
<link href="/stylesheets/site.css" rel="stylesheet">
<link href="/feed.xml" rel="alternate" title="Лента новостей" type="application/atom+xml">
<link href="http://nashbridges.me/ruby-windows-bootstrap" rel="canonical">
<script src="http://yandex.st/modernizr/1.7/modernizr.min.js"></script>
</head>
<body>
<div class="page-container">
<header><h1>Ruby и <dfn title="точка">.</dfn>
</h1>
<nav class="menu"><ul>
<li><a href="/">все статьи</a></li>
<li><a href="/tags">все теги</a></li>
<li><a href="/about">зачем и для кого</a></li>
<li class="atom-feed"><a href="/feed.xml">rss</a></li>
</ul></nav></header><article><h1>Установка Ruby on Rails на Windows</h1>
<section class="metadata"><p><span class="faded">сложность материала: </span>для начинающих</p>
<span class="faded">теги: </span><ul class="tags">
<li><a rel="tag" href="/tag/ssh">SSH</a></li>
<li><a rel="tag" href="/tag/git">Git</a></li>
<li><a rel="tag" href="/tag/linux">Linux</a></li>
</ul></section><nav class="table-of-contents"><ul>
<li><a href="#why-so-complex">Почему так сложно</a></li>
<li><ul>
<li><a href="#why-linux">Почему Ubuntu (Linux)</a></li>
<li><a href="#why-windows">Почему Windows</a></li>
<li><a href="#cons">Недостатки</a></li>
</ul></li>
<li><a href="#up-and-running-with-vagrant">Запуск сервера с помощью Vagrant</a></li>
<li><ul>
<li><a href="#virtualbox-and-vagrant">VirtualBox и Vagrant</a></li>
<li><a href="#putty">PuTTY</a></li>
<li><a href="#first-ror-project">Первый проект Ruby on Rails</a></li>
<li><a href="#git-ssh-setup">Настройка Git и SSH</a></li>
<li><ul>
<li><a href="#online-repositories">Онлайн-репозитории</a></li>
<li><a href="#heroku">Heroku</a></li>
</ul></li>
<li><a href="#rvm">RVM</a></li>
</ul></li>
<li><a href="#short-linux-faq">Что сразу понадобится в Linux</a></li>
<li><ul>
<li><a href="#bash">Консоль</a></li>
<li><a href="#using-file-system">Файловая система</a></li>
<li><a href="#sudo">Администраторские права</a></li>
<li><a href="#console-editors">Редактирование файлов</a></li>
<li><a href="#installing-software">Установка программ</a></li>
<li><a href="#ssh">SSH</a></li>
<li><a href="#links">Полезные ссылки</a></li>
</ul></li>
</ul></nav><p>Вопреки SEO-шному заголовку, статья затрагивает более обширную тему: разворачивание
и настройку полноценного <a href="http://www.ubuntu.com/business/server/overview">Ubuntu сервера</a>, на котором будут
запускаться все ваши Ruby приложения (в том числе Ruby on Rails), устанавливаться
джемы и дополнительная инфраструктура (например, базы данных), без которой
сложно представить современное веб-приложение.</p>
<p>При этом, благодаря тому, что сервер будет работать в отдельной виртуальной
машине, вам не придется отказываться от родной Windows, освоенного вдоль и поперек
Notepad++ и обожаемого Дьябло 3.</p>
<section><h2 id="why-so-complex">Почему так сложно</h2>
<section><h3 id="why-linux">Почему Ubuntu (Linux)</h3>
<p>Читатель, уже немного знакомый с Ruby, наверняка спросит «а как же
<a href="http://rubyinstaller.org/">RubyInstaller</a>?»</p>
<p>Без сомнения, простые инсталляторы вроде <a href="http://railsinstaller.org/">RailsInstaller</a>
позволяют поиграться с irb и запустить свой первый Магазин-на-Рельсах практически мгновенно.
Если закрыть глаза на то, что консоль Windows не способна отображать цвета, а вместо
кириллицы выводит знаки вопроса, и что некоторые джемы работают через пень-колоду, это
неплохой вариант для тех, кто хочет «пощупать».</p>
<p>Другое дело, если вы всерьез намереваетесь посвятить себя веб-разработке. Рано или поздно
придется столкнуться с выкладкой приложения на рабочий сервер, которые — сюрприз! — поголовно
работают на Ubuntu/Debian и прочих линуксах. Поэтому в ваших же интересах, чтобы эта встреча
случилась <em>рано</em>. Хотя Rails разработчик не обязан быть админом, на практике выходит, что
настройкой сервера и поднятием Rails окружения занимается именно он. И уж если на то пошло,
нельзя написать эффективное приложение, не понимая, как устроена операционная система, в
которой оно запускается.</p>
<p>Если вы верстаете под Ruby on Rails, крайне важно иметь идентичное с остальной командой
окружение. Поверьте, когда разработчик в разгар сдачи работы заказчику добавляет в проект
новый джем, который не устанавливается на вашей машине, а вам еще переверстывать полмакета, но
без злополучного джема даже сервер не запустить — это очень неприятно и для вас, и для разработчика,
которому придется эту проблему решать. Имея же у себя на машине
Linux-based сервер, вы можете рассчитывать на то, что всё, запускающееся «у них»,
гарантированно установится и запустится у вас.</p>
</section><section><h3 id="why-windows">Почему Windows</h3>
<div class="with-notes">
<p>Конечно, не стоит тут же сносить под корень Windows в надежде, что прогрессивные десктопные
дистрибутивы, вроде Ubuntu или Linux Mint, смогут заменить годами настраиваемую под себя
систему и парк привычных приложений. К сожалению, даже свежие версии Ubuntu приходится
«<a href="http://forum.ubuntu.ru/index.php?board=25">допиливать напильником</a>» (особенно это касается установок на ноутбуки).
Постигая тонкости
Linux философии и сражаясь с аппаратными и интерфейсными проблемами, вы рискуете потерять
интерес к тому, из-за чего всё началось,— Ruby.</p>
<aside><p>Mac OS X — совершенно иная история, и если у вас есть деньги
на <a href="http://www.apple.com/macbookpro/">железо от Apple</a>, берите, не раздумывая.</p>
</aside>
</div>
<p>Именно поэтому вариант с виртуальной машиной представляется наиболее разумным: вы ничем не
жертвуете, не рискуете потерять информацию и продолжаете использовать в работе знакомые
инструменты.</p>
</section><section><h3 id="cons">Недостатки</h3>
<div class="with-notes">
<p>Виртуальная машина требует гораздо больше ресурсов, чем Ruby интерпретатор, запущенный
непосредственно из-под Windows. Так, ко времени <em>первого</em> запуска Rails проекта придется
приплюсовать время старта самой операционной системы (Ubuntu), это же касается объема занимаемой
оперативной памяти: ≈400 Mb против 70-80.</p>
<aside><p>Будучи запущенной, виртуальная машина никак не повлияет на время последующих запусков/
перезагрузки Rails сервера.</p>
</aside>
</div>
<p>Однако, для нынешнего поколения компьютеров такие издержки — уже не что-то запредельное, тогда
как преимущества подобного подхода очевидны.</p>
</section></section><section><h2 id="up-and-running-with-vagrant">Запуск сервера с помощью Vagrant</h2>
<p>Давайте вначале разберемся, к чему мы в итоге должны прийти. Наша цель — установка и настройка
виртуальной машины, внутри которой будет крутиться серверный Linux дистрибутив
(конкретнее, Ubuntu 12.04 Server).</p>
<p>На сервере будет расшарена папка, поэтому все сохраненные в ней файлы будут
одновременно доступны и для редактирования в Windows, и для запуска интерпретатором
Ruby в Linux.</p>
<div class="with-notes">
<p>Для управления сервером будет использоваться удаленный доступ через SSH с помощью клиента PuTTY.
Визуально консоль PuTTY ничем не будет отличаться от родной командной строки Windows, но
все команды, конечно же, будут исполняться на стороне сервера, а значит, придется изучить
несколько расхожих, специфичных для Linux, команд.</p>
<aside><p>Несколько слов о том, <a href="#ssh">что такое SSH</a>, чуть ниже.</p>
</aside>
</div>
<p>Наконец, чтобы видеть результаты работы, порт 3000 на сервере (который по умолчанию использует
Rails) доступен в Windows под тем же номером. Таким образом, зайдя
в браузере по локальному адресу http://127.0.0.1:3000, вы на самом деле будете
обращаться к приложению, запущенному в этот момент на сервере в виртуальной машине.</p>
<p>Выглядит это примерно так:</p>
<p class="with-image"><img src="/images/ruby-windows-bootstrap/vm.png" alt="Ubuntu server в виртуальной машине"></p>
<section><h3 id="virtualbox-and-vagrant">VirtualBox и Vagrant</h3>
<p>Приятная новость: бóльшая часть работы по установке и настройке сервера уже сделана,
вам достаточно лишь скачать уже готовый образ виртуальной машины и запустить его.</p>
<ol>
<li>Копия виртуальной машины будет работать под управлением <a href="http://ru.wikipedia.org/wiki/VirtualBox">VirtualBox</a>, поэтому для начала
нужно убедиться, что у вас установлена версия не ниже 4.1 или <a href="https://www.virtualbox.org/wiki/Downloads">установить ее</a>.</li>
<li>Следующий шаг — установка консольной программы <a href="http://downloads.vagrantup.com/tags/v1.0.3">Vagrant</a>. Он (Vagrant) займется
распаковкой образа виртуальной машины, будет управлять ее запуском и остановкой, а также
позволит выполнить тонкую настройку с помощью файла <code>Vagrantfile</code>.
Собственно, вам никто не запрещает делать запуск и настройку вручную, Vagrant — просто удобная
оболочка для управления VirtualBox.</li>
<li>Скачиваете на жесткий диск т. н. <a href="http://clck.ru/d/vq6bX_RT14xu0">бокс</a> (box), который подготовил я. Vagrant box —
не что иное, как архив с образом уже созданной виртуальной машины.</li>
<li>Включение бокса в список доступных Vagrant'у. Эта операция выполняется единожды (если
быть точнее, каждый раз, когда вы скачиваете новый бокс). Для этого нужно в консоли (командной строке)
Windows набрать <code>vagrant box add ruby path\to\box</code>. Ruby — произвольное имя, которое вы даете
боксу, затем идет полный путь до ранее загруженного вами файла.</li>
<li>Поскольку вам часто придется открывать консоль с нужной текущей папкой, это удобнее
делать прямо из проводника через контекстное меню папки. Для этого нужно добавить в него <a href="http://superuser.com/a/98784/119457">пункт
«Открыть консоль здесь»</a>.</li>
<li>Создаете папку, в которой будут храниться ваши Rails проекты (содержимое этой папки будет
доступно серверу в запущенной виртуальной машине). Находясь в этой папке, выполняете в консоли
<code>vagrant init ruby</code>. Vagrant создаст в папке шаблонный файл настроек <code>Vagrantfile</code>, его пока не
трогаем.</li>
<li>Первый запуск виртуальной машины. Продолжая находиться в папке для будущих проектов, в консоли
выполняете <code>vagrant up</code>. В этот момент Vagrant находит <code>Vagrantfile</code> и проверяет, существует ли
<em>связанная с этой папкой</em> виртуальная папка, и если нет (а так оно и есть), то клонирует
указанный в <code>Vagrantfile</code> базовый бокс и запускает эту копию. Такой подход дает
возможность создать несколько независимых друг от друга
(и по-разному настроенных) виртуальных машин. Но самое главное, пожалуй, это то, что вы можете
без опаски исследовать и настраивать сервер: любые фатальные действия легко исправить, просто
удалив «испорченную» машину и создав ее заново из базового бокса.</li>
</ol>
<p>Второй и последующий запуски выполняются аналогично с помощью <code>vagrant up</code>, но они происходят намного
быстрее (используется уже скопированная виртуальная машина).</p>
<p>Обычно после запуска виртуальная машина висит в фоновом режиме вплоть до перезагрузки/выключения
Windows, но если вдруг понадобится освободить занимаемую оперативную память, для останова
используйте команду <code>vagrant halt</code>.</p>
</section><section><h3 id="putty">PuTTY</h3>
<p>На запущенном вами сервере уже создан один пользователь c именем vagrant. Чтобы действовать
от его имени и управлять системой, вы будете использовать популярный SSH клиент для Windows — PuTTY.</p>
<p>Я выполнил все необходимые настройки клиента, вам остается только <a href="http://clck.ru/d/-Cf8cPVg14pph">скачать его</a>.
Распакуйте архив в любую папку и запустите файл <code>ruby-bootstrap.reg</code>, чтобы импортировать
настройки в реестр.</p>
<div class="with-notes">
<p>После этого достаточно запустить <code>putty.exe</code>, загрузить сессию ruby-bootstrap и нажать Open.
Вы будете успешно аутентифицированы на сервере под учетной записью vagrant и можете выполнять
команды. Например, запустить интерактивный интерпретатор Ruby:</p>
<aside><p>Или можно создать ярлык для <code>putty.exe</code>, <a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/faq.html#faq-startsess">указав</a>
в командной строке <code>-load "ruby-bootstrap"</code>.</p>
<p>Тут и далее команды в серверной консоли будут записываться полностью, с
приглашением, чтобы не путать с командами для Windows консоли.</p>
</aside>
</div>
<pre><code class="slush_poppies">vagrant@precise32:~$ irb
1<span class="TagAttribute"><span class="TagAttribute">.</span>9</span><span class="TagAttribute"><span class="TagAttribute">.</span>3p194</span> :001 > 1 + 1
=> 2
</code></pre>
<p>Для нормального отображения текста в консоли очень рекомендую скачать и установить шрифт
<a href="http://dejavu-fonts.org/wiki/Download">DejaVu Sans Mono</a>.</p>
</section><section><h3 id="first-ror-project">Первый проект Ruby on Rails</h3>
<div class="with-notes">
<p>На сервере расшареной является корневая папка <code>vagrant</code>, поэтому все файлы, которые вы хотите
редактировать «снаружи», нужно создавать там. Последовательность для создания тестового проекта
Ruby on Rails может выглядеть так:</p>
<aside><p>Более подробно о <a href="#using-file-system">файловой системе</a> чуть ниже.</p>
</aside>
</div>
<div class="with-notes">
<pre><code class="slush_poppies">vagrant@precise32:~$ cd /vagrant/
vagrant@precise32:/vagrant$ rails new my-project
vagrant@precise32:/vagrant$ cd my-project
vagrant@precise32:/vagrant/my-project$ rails generate scaffold User name
vagrant@precise32:/vagrant/my-project$ rake db:migrate
vagrant@precise32:/vagrant/my-project$ rails server
</code></pre>
<aside><p>В первый раз, конечно, придется еще и установить сам джем командой <code>gem install rails</code></p>
</aside>
</div>
<p>После этого по адресу http://127.0.0.1:3000/users должна быть видна шаблонная страница для
просмотра и редактирования пользователей, а в папке Windows, где была выполнена команда <code>vagrant up</code>,
должна появиться подпапка <code>my-project</code>.</p>
</section><section><h3 id="git-ssh-setup">Настройка Git и SSH</h3>
<div class="with-notes">
<p>Каждый уважающий свой труд разработчик работает с кодом только через систему контроля
версий. В Ruby сообществе в 99% случаев для этого используется <a href="http://ru.wikipedia.org/wiki/Git">Git</a>, и если не хотите
быть белой вороной, придется его установить и освоить.</p>
<aside><p><em>TODO</em> статья о Git</p>
</aside>
</div>
<p>Поскольку рабочие файлы фактически будут доступны обеим операционным
системам, выбор, где настраивать и, собственно, работать с Git, за вами. По собственному
опыту могу сказать, что просматривать изменения в файлах удобнее в графическом клиенте, а не
в консоли, поэтому лучше это всё-таки делать в Windows.</p>
<div class="with-notes">
<p>Для этого нужно <a href="http://code.google.com/p/msysgit/downloads">установить msysgit</a> (настройки по умолчанию) и сохранить в настройках
Git информацию о себе, создав в корне вашей домашней директории файл <code>.gitconfig</code> (именно
с точкой в начале) примерно такого содержания:</p>
<pre><code class="slush_poppies">[user]
name = Flash Gordon
email = flash@gordon<span class="TagAttribute"><span class="TagAttribute">.</span>com</span>
</code></pre>
<aside><p>Эта персональная информация сохраняется с каждым изменением (коммитом), вносимым в проект,
и по сути является вашей подписью.</p>
</aside>
</div>
<p>Что касается графических клиентов, если ваш редактор — <a href="http://www.jetbrains.com/ruby/">Rubymine</a>, в нем уже
есть замечательная интеграция с Git, иначе могу порекомендовать
<a href="http://code.google.com/p/tortoisegit/">установить TurtoiseGit</a> (внедряется в проводник).</p>
<section><h4 id="online-repositories">Онлайн-репозитории</h4>
<p>Следующим шагом, еслы вы планируете использовать <a href="https://github.com/">Github</a> или <a href="https://bitbucket.org">BitBucket</a>,
будет генерация <a href="#ssh">SSH ключей</a>. Через <em>Пуск -> Программы -> Git -> Git Bash</em> открываете консоль
и там вводите (со своим e-mail, конечно же):</p>
<pre><code class="slush_poppies">ssh-keygen -t rsa -C "flash@gordon<span class="TagAttribute"><span class="TagAttribute">.</span>com</span>"
</code></pre>
<div class="with-notes">
<p>Соглашаетесь с папкой по умолчанию (жмете на ввод), затем еще дважды на ввод для создания
пустого пароля для секретного ключа. После этого переходите в созданную генератором папку
(<code>.ssh/</code> в корне вашей домашней директории) и копируете в буфер обмена содержимое публичного
ключа <code>id_rsa.pub</code> (про себя отмечаем, что рядом лежит секретный ключ <code>id_rsa</code>, вот его как
раз нужно бережно хранить). Скопированный текст нужно вставить в разделе профиля Github или
Bitbucket, который так и называется — SSH keys.</p>
<aside><p>Если одолевает страх, что секретным ключом в ваше отсутствие воспользуются близкие, тогда,
конечно, пароль задать надо :)</p>
</aside>
</div>
</section><section><h4 id="heroku">Heroku</h4>
<p>Если планируете использовать <a href="http://www.heroku.com">Heroku</a>, то эту же пару ключей нужно скопировать
на Ubuntu сервер (т. к. консольная утилита heroku будет установлена именно там). Одинаковая пара на обеих
машинах нужна, потому что отправка кода на Heroku будет происходить из Windows через Git, а
запуск обслуживающих команд (например, миграции) — на Ubuntu, при этом в обоих случаях
будет проводиться проверка подлинности, и конечно же, опознать вас должно как одну и ту
же учетную запись.</p>
<p>Для этого, находясь в Windows, нужно скопировать <code>.ssh/</code>
вместе с ключами в расшареную с сервером папку, затем подключиться к запущенной виртуальной
машине через PuTTY и там скопировать оба ключа в такую же папку <code>.ssh/</code>, только уже в домашней
директории пользователя vagrant (под которым вы, собственно, и работаете):</p>
<div class="with-notes">
<pre><code class="slush_poppies">vagrant@precise32:~$ cd /vagrant/
vagrant@precise32:/vagrant$ cp -r <span class="TagAttribute"><span class="TagAttribute">.</span>ssh</span> /home/vagrant
vagrant@precise32:/vagrant$ gem install heroku
vagrant@precise32:/vagrant$ heroku keys:add
</code></pre>
<aside><p>Последняя команда запросит у вас данные, использованные при регистрации
на Heroku (с <a href="#bash">паролем все ок</a>).</p>
</aside>
</div>
</section></section><section><h3 id="rvm">RVM</h3>
<p>На сервере уже установлен Ruby MRI 1.9.3 через <a href="http://rvm.io">RVM</a>. Последний позволяет держать на машине
несколько <a href="https://rvm.io/interpreters/">версий интерпретатора</a> Ruby и переключаться между ними.
Допустим, вам понадобится работать со старым проектом на Rails 2.3.X, тогда, чтобы установить
версию Ruby 1.8:</p>
<pre><code class="slush_poppies">vagrant@precise32:~$ rvm install 1<span class="TagAttribute"><span class="TagAttribute">.</span>8</span><span class="TagAttribute"><span class="TagAttribute">.</span>7</span>
</code></pre>
<p>После этого достаточно поместить в папку с проектом файл <code>.rvmrc</code> содержания:</p>
<pre><code class="slush_poppies">rvm use 1<span class="TagAttribute"><span class="TagAttribute">.</span>8</span><span class="TagAttribute"><span class="TagAttribute">.</span>7</span>
</code></pre>
<p>и каждый раз, когда вы будете переходить в эту папку <em>в серверной консоли</em> (а вам придется
это сделать, хотя бы для того, чтобы запустить <code>rails server</code>), RVM будет
менять текущую версию Ruby на 1.8.7.</p>
<p>Несмотря на то, что RVM поддерживает т. н. <a href="https://rvm.io/gemsets/basics/">gemset</a>'ы, я не рекомендую их использовать.
Лучше полагаться на <a href="http://nashbridges.me/gem-for-end-user#bundler">Bundler</a>, тем более, что на сервере уже включена его
интеграция с Rubygems, что позволяет запускать исполняемые файлы указанной в <code>Gemfile</code> версии
без префикса <code>bundle exec</code>.</p>
</section></section><section><h2 id="short-linux-faq">Что сразу понадобится в Linux</h2>
<section><h3 id="bash">Консоль</h3>
<div class="with-notes">
<p>Командная строка для человека, привыкшего к мышке-менюшкам, поначалу кажется настоящим адом.
Непонятно, <em>что</em> туда можно вводить вообще, команды (и их параметры!) нужно <em>запоминать</em>
(или лезть в справочник), и каждый раз <em>набирать</em> их на клавиатуре.
Ниже — самые очевидные вещи, знание которых спасет вам тонну времени и нервов.</p>
<aside><p>Тем не менее консоль на сервере — самый простой и в то же время очень гибкий
способ автоматизировать рутинные процедуры.</p>
</aside>
</div>
<section><h4>История команд</h4>
<p>Перемещаться по ней можно с помощью курсорных <strong><em>клавиш вверх/вниз</em></strong>. Например, вы опечатались
и набрали вместо <code>rails server</code>:</p>
<pre><code class="slush_poppies">vagrant@precise32:/vagrant/my-shop$ rals server
</code></pre>
<p>на что получите резонный ответ «не знаю такой команды» и пустое приглашение:</p>
<pre><code class="slush_poppies">rals: command not found
vagrant@precise32:/vagrant/my-shop$
</code></pre>
<p>Вместо того, чтобы вводить всё по-новой, нажмите клавишу вверх и исправьте в подставленной
команде опечатку.</p>
</section><section><h4>Автодополнение</h4>
<p>Для длинных команд очень полезным оказывается автодополнение по <strong><em>клавише Tab</em></strong>
после того, как набрано несколько начальных символов. Кроме названий исполняемых файлов
дополняются имена папок и файлов, и это очень спасает, когда в качестве параметра нужно
указать полный путь к файлу. </p>
<p>Если несколько команд начинаются одинаково (такое случается нередко), а набранных букв
недостаточно для однозначной подстановки, повторное нажатие на Tab покажет все возможные
варианты.</p>
<p>Например, в текущей папке лежат файлы <code>user.rb</code> и <code>uploader.rb</code>, и вы хотите запустить
последний в интерпретаторе Ruby.
Тогда достаточно набрать в консоли:</p>
<div class="with-notes">
<pre><code class="slush_poppies">vagrant@precise32:/vagrant/utils$ ruby up
</code></pre>
<aside><p>По понятным причинам команды <code>ruby u</code> будет недостаточно.</p>
</aside>
</div>
<p>нажать Tab (команда автоматически развернется до <code>ruby uploader.rb</code>), а затем на ввод.</p>
</section><section><h4>Ввод паролей</h4>
<p>Пароли при вводе не маскируются звездочками, как в Windows, они вообще не отображаются. Это
нормально, нужно просто ввести нужную фразу и нажать на ввод.</p>
</section><section><h4>Ctrl+C Ctrl+V</h4>
<p>Вставка из буфера обмена выполняется правой клавишей мыши, а чтобы скопировать туда текст,
нужно просто выделить его мышью.</p>
</section><section><h4>Запуск нескольких программ</h4>
<p>По умолчанию программы (процессы), запущенные в консоли (терминале), привязываются к нему.
С одной стороны это удобно, т. к. позволяет завершать процесс с помощью комбинации клавиш
Ctrl+C (или Ctrl+D), все сообщения выводятся в этот же терминал (например, логи Rails
сервера). С другой стороны — не очень удобно, потому что запущенное приложение блокирует
такой терминал и никаких других команд уже не введешь.</p>
<p>Обойти это ограничение просто: запуском еще одной консоли, в данном случае еще одного экземпляра
PuTTY. Если вас раздражает куча открытых окон, обратите внимание на <a href="http://superputty.cl0.vanillaforums.com/categories/announcements">SuperPutty</a>,
который добавляет поддержку табов.</p>
</section></section><section><h3 id="using-file-system">Файловая система</h3>
<p>В Linux у файлового дерева может быть только один корень (он обозначается
<dfn title="прямая косая черта">/</dfn>), тогда как в Windows их может быть несколько, в зависимости
от количества разделов: диски <code>C:\</code>, <code>D:\</code> и т. д. Поскольку корень один, то все остальные разделы
и устройства (например, DVD-Rom) видны как обычные папки, подключенные к нему (названия и
конкретное месторасположение целиком на совести пользователя).</p>
<p>Разделителем в файловых путях является прямая косая черта (<code>/</code>), например</p>
<pre><code class="slush_poppies">/vagrant/projects/my-shop/app/models/user.rb
</code></pre>
<p>Если путь начинается ею (а значит — с корня), то он является абсолютным, иначе — относительным
от текущей папки. Иногда для запуска исполнительных файлов требуется принудительно указать системе
искать файл относительно текущего местоположения, тогда путь начинают с точки (например, <code>./bin/start</code>).</p>
<p>Если точкой можно заменить текующую папку, то двоеточием (<code>..</code>) — родительскую, например,
путь <code>../recipes</code> означает: чтобы найти папку <code>recipes</code>, нужно подняться на уровень выше текущей.</p>
<p>Текущая папка всегда отображается в консоли после имени пользователя. По умолчанию (при
открытии нового терминала) это его домашняя директория (в вашей виртуальной машине это <code>/home/vagrant</code>),
для которой имеется краткий синоним: <dfn title="тильда">~</dfn>.</p>
<div class="with-notes">
<p>Чтобы сменить текущую директорию, используется команда <code>cd</code> (<strong>c</strong>hange <strong>d</strong>irectory),
она может принимать в качестве аргумента как абсолютный, так и относительный путь. Допустим,
в домашней директории пользователя vagrant есть две папки: <code>my_music</code> и <code>my_books</code>, тогда:</p>
<aside><p>Не забывайте про автодополнение по Tab.</p>
</aside>
</div>
<div class="with-notes">
<pre><code class="slush_poppies">vagrant@precise32:~$ cd my_music
vagrant@precise32:~/my_music$ cd
vagrant@precise32:~$ cd /home/vagrant/my_books
vagrant@precise32:~/my_books$ cd ..
vagrant@precise32:~$
</code></pre>
<aside><p><code>cd</code>, вызванная без аргумента, всегда перемещает в домашнюю директорию.</p>
</aside>
</div>
<p>Чтобы просмотреть содержимое папки, используют команду <code>ls</code> (<strong>l</strong>i<strong>s</strong>t). Если вызвать ее без аргументов,
увидите, что находится в текущей папке, иначе — в том месте, которое указали. Поскольку в Linux
файлы и папки, начинающиеся с точки, считаются скрытыми (например, <code>.ssh</code>), просмотреть <em>всё</em>
содержимое папки помогает вызов с ключом <code>a</code> (<strong>a</strong>ll): <code>ls -a</code>.</p>
</section><section><h3 id="sudo">Администраторские права</h3>
<p>Как и в любой другой операционной системе, некоторые важные действия (например, установку и
удаление программ глобально, на уровне системы) могут выполнять только пользователи
с администраторскими правами. В Linux в таком случае обычно подразумевают пользователя
с неограниченными правами (root user или superuser), однако, входить в систему
и постоянно работать под этой учетной записью крайне не рекомендуется из соображений
безопасности.</p>
<div class="with-notes">
<p>Вместо этого пользователю vagrant (под которым вы работаете в виртуальной машине) разрешено
в момент выполнения любой команды притвориться администратором с помощью
префикс-команды <code>sudo</code>. Например, чтобы увидеть содержимое папки <code>lost+found</code>, недостаточно
набрать <code>ls /lost+found</code>, нужно в этот момент быть суперпользователем: <code>sudo ls /lost+found</code>.</p>
<aside><p>Как правило, в <code>lost+found</code> всё равно пусто :), туда система восстановливает поврежденные после
некорректного завершения работы файлы.</p>
</aside>
</div>
<p>После ввода такой команды запрашивается пароль того пользователя, который ее <em>выполняет</em>
(а не того, <em>кем</em> он хочет стать), в вашем случае — пользователя vagrant (пароль — vagrant). В данной
системе запрос пароля отключен (что <em>категорически</em> запрещено делать на реальных серверах по
понятным причинам), но это не значит, что <code>sudo</code> достаточно ввести только для первой команды и
«переключиться в режим бога», <em>каждая</em> команда, требующая администраторских прав, должна
начинаться с <code>sudo</code>.</p>
</section><section><h3 id="console-editors">Редактирование файлов</h3>
<p>Иногда вам потребуется отредактировать файлы, которые лежат вне расшаренной папки <code>/vagrant</code>.
Вместо того, чтобы копировать их в расшаренную папку, редактировать там из-под Windows и копировать
обратно, гораздо проще использовать консольные текстовые редакторы.</p>
<p>В Ubuntu для этого можно использовать <code>nano</code> или <code>vim</code>. Первый практически ничем не отличается
от стандартного Блокнота, из второго нужно уметь выйти :)</p>
<p>Обе команды (редакторов) принимают в качестве аргумента полный или относительный путь к файлу.
Если он существует, то будет открыт для правки, иначе — будет создан во время первого сохранения,
например:</p>
<div class="with-notes">
<pre><code class="slush_poppies">vagrant@precise32:~$ nano notes
</code></pre>
<aside><p>Для правки/создания некоторых системных файлов может понадобиться <code>sudo</code>.</p>
</aside>
</div>
<p>или</p>
<pre><code class="slush_poppies">vagrant@precise32:~$ vim hello<span class="TagAttribute"><span class="TagAttribute">.</span>rb</span>
</code></pre>
<p>Редактор Nano проще для понимания тем, что открывается сразу в привычном режиме редактирования.
Внизу видны подсказки с командами, где <code>^</code> обозначает клавишу Ctrl. Таким образом, сохранить
изменения можно с помощью Ctrl+O, выйти — Ctrl+X.</p>
<p>Vim горазде сложнее, и я не рекомендую его для новичка, но может так статься, что система
принудительно откроет файл именно в нем. В этом случае нужно знать, что переход в режим
редактирования выполняется клавишей i. После того, как вы внесли правки, нужно выйти из
режима редактирования с помощью клавиши Esc, перейти в командный режим нажатием клавиши : (Shift+;)
и ввести wq (<strong>w</strong>rite <strong>q</strong>uit — сохранить и выйти). Чтобы выйти без сохранения, в командном
режиме нужно набрать q!</p>
</section><section><h3 id="installing-software">Установка программ</h3>
<p><em>TODO</em></p>
</section><section><h3 id="ssh">SSH</h3>
<p>SSH — это название протокола для безопасного (зашифрованного) соединения двух машин по
сети. Обычно под этим подразумевается удаленный доступ к консоли (оболочке, shell; собственно,
отсюда и название — Secure SHell) компьютера, но этим возможности SSH не ограничиваются.
Например, он же может использоваться для безопасного (с точки зрения перехвата злоумышленником)
копирования файлов между двумя машинами; <a href="https://github.com/">Github</a>, <a href="https://bitbucket.org">BitBucket</a>,
<a href="http://www.heroku.com">Heroku</a> используют SSH для проверки подлинности пользователя.</p>
<p>Пару в SSH соединении составляют сервер и клиент. На сервере имеется учетная запись (которая
обладает определенным набором прав), клиент же проходит процедуру опознания (аутентификации),
после чего действует от имени этой учетной записи.</p>
<p>SSH использует аутентификацию на базе <a href="http://ru.wikipedia.org/wiki/%D0%9A%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D1%81_%D0%BE%D1%82%D0%BA%D1%80%D1%8B%D1%82%D1%8B%D0%BC_%D0%BA%D0%BB%D1%8E%D1%87%D0%BE%D0%BC">системы шифрования с открытым ключом</a>.
Клиент предварительно создает особую пару «секретный ключ - публичный ключ», после чего
связывает публичный ключ со своей учетной записью на сервере. Эта привязка выполняется не через SSH,
например, в случае с Github нужно зайти в браузере на страницу своего профиля и загрузить
там содержание своего публичного ключа.</p>
<div class="with-notes">
<p>Пара «секретный ключ - публичный ключ» обладает несколькими важными свойствами. Во-первых,
она всегда уникальна. Во-вторых, имея на руках зашифрованное публичным ключом
сообщение, его практически невозможно расшифровать, даже получив доступ к публичному ключу.
Однако, хозяин секретного ключа <em>может</em> выполнить обратное преобразование. На основании этого сервер в процессе
«предварительного общения» с клиентом может сделать вывод, что удаленная машина, от которой он
получает ответы, действительно та, за кого себя выдает.</p>
<aside><p>Конечно же, у злоумышленника всегда остается метод грубого подбора, другое дело, сколько
компьютеро-лет это займет.</p>
</aside>
</div>
<p>Надежность такой системы в том, что секретный ключ не хранится на сервере и не передается
в процессе коммуникации с клиентом. Более того, при создании пары генератор ключей позволяет зашифровать
и сам секретный ключ. С одной стороны, это обезопасит от возможной кражи секретного ключа, с другой — чтобы
SSH клиент смог использовать этот ключ, хозяину придется вводить к нему пароль (passphrase) во время
установления сессии. Если уверены, что кроме вас секретным ключом никто не может воспользоваться,
пароль для него можно оставить пустым.</p>
<section><h4>Безопасность</h4>
<p>Берегите свои секретные ключи как зеницу ока. При малейшем подозрении, что они попали в чужие
руки, меняйте публичные ключи на всех серверах (точно так же, как меняете дверной замок, когда
теряете ключ).</p>
<div class="with-notes">
<p>При этом учтите, что по умолчанию связь между <a href="#putty">PuTTY</a> и запущенными виртуальными машинами
происходит через <strong>небезопасную</strong> пару ключей, которая создана разработчиками Vagrant. Небезопасна
она именно потому, что секретный ключ <a href="https://github.com/mitchellh/vagrant/tree/master/keys">общедоступен</a> (и, теоретически, может быть использован злоумышленником
для доступа к вашей виртуальной машине).
Поэтому, если вы планируете работать с важной информацией, <a href="http://www.t1shopper.com/tools/port-scan/">нужно</a>
<a href="http://canyouseeme.org/">убедиться</a>, что порт 2222 <em>недоступен</em> извне, или принять меры по его закрытию
(фаервол).</p>
<aside><p>В качестве альтернативной защиты можно заменить пару ключей на свою, хотя это потребует
больше телодвижений, чем с портом.</p>
</aside>
</div>
</section></section><section><h3 id="links">Полезные ссылки</h3>
<p><em>TODO</em></p>
</section></section></article><footer><hr>
<section class="feedback"><div class="recommend">Порекомендуйте этот материал, если он вам понравился: <div class="google"><div class="g-plusone" data-lang="ru"></div></div>
</div>
</section><nav class="menu"><ul>
<li><a href="/">все статьи</a></li>
<li><a href="/tags">все теги</a></li>
<li><a href="/about">зачем и для кого</a></li>
<li class="atom-feed"><a href="/feed.xml">rss</a></li>
</ul></nav><section class="signature"><p><a href="/author">Андрей Малышко</a>, 28.05.2012</p></section></footer>
</div>
<script>var _gaq=[['_setAccount','UA-24784248-1'],['_trackPageview']];
(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];g.async=1;
g.src=('https:'==location.protocol?'//ssl':'//www')+'.google-analytics.com/ga.js';
s.parentNode.insertBefore(g,s)}(document,'script'));</script><script src="https://apis.google.com/js/plusone.js"></script>
</body>
</html>