<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>LinuxTOY</title><link href="https://linuxtoy.org/" rel="alternate"></link><link href="https://linuxtoy.org/feeds/all.atom.xml" rel="self"></link><id>https://linuxtoy.org/</id><updated>2017-03-09T21:20:54+08:00</updated><entry><title>跟 Toy 玩自架服务器：5 分钟搭一架梯子</title><link href="https://linuxtoy.org/archives/selfhosted-server-4.html" rel="alternate"></link><updated>2017-03-09T21:20:54+08:00</updated><author><name>toy</name></author><id>tag:linuxtoy.org,2017-03-09:archives/selfhosted-server-4.html</id><summary type="html">&lt;p&gt;笔者初次触网大概在千禧年之后不久，那时虽然在上网前耳朵要被迫接受一段“猫叫”，而且速度也不怎么样，但哪里都可以冲浪的快感依然让人感觉兴奋不已。网络因自由而兴，如今却被人为加筑了高墙，搭梯子也成了必备的技能。但是如何才能快速地架梯呢？且听笔者慢慢道来。&lt;/p&gt;


&lt;p&gt;本篇笔者以 &lt;a href="https://github.com/shadowsocks/shadowsocks-libev/"&gt;Shadowsocks-libev&lt;/a&gt; 为例加以说明：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;具有一台正跑着的 VPS，如果你还没有，那么可以参考本系列文章在 &lt;a href="https://linuxtoy.org/archives/selfhosted-server-1.html"&gt;Vultr&lt;/a&gt;、&lt;a href="https://linuxtoy.org/archives/selfhosted-server-2.html"&gt;Linode&lt;/a&gt;、&lt;a href="https://linuxtoy.org/archives/selfhosted-server-3.html"&gt;DigitalOcean&lt;/a&gt; 上创建一台。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;遵照第一篇克隆 &lt;a href="https://github.com/xuxiaodong/selfhosted-server"&gt;Selfhosted Servers&lt;/a&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;打开 &lt;code&gt;group_vars/all.yml&lt;/code&gt;，转到下列行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="n"&gt;shadowsocks&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;server_port&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;8530&amp;quot;&lt;/span&gt;
  &lt;span class="n"&gt;local_port&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;1080&amp;quot;&lt;/span&gt;
  &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;600&amp;quot;&lt;/span&gt;
  &lt;span class="n"&gt;encryption_method&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;chacha20-ietf&amp;quot;&lt;/span&gt;
  &lt;span class="n"&gt;tcp_fast_open&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;true&amp;quot;&lt;/span&gt;
  &lt;span class="n"&gt;location&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/etc/shadowsocks-libev&amp;quot;&lt;/span&gt;
  &lt;span class="n"&gt;password_file&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/etc/shadowsocks-libev/shadowsocks-password.txt&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;可酌情根据需要更改选项：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;server_port&lt;/code&gt;：服务器端口号&lt;/li&gt;
&lt;li&gt;&lt;code&gt;local_port&lt;/code&gt;：本机端口号&lt;/li&gt;
&lt;li&gt;&lt;code&gt;timeout&lt;/code&gt;：超时&lt;/li&gt;
&lt;li&gt;&lt;code&gt;encryption_method&lt;/code&gt;：加密方法&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tcp_fast_open&lt;/code&gt;：开启 TCP 快速打开，推荐启用&lt;/li&gt;
&lt;li&gt;&lt;code&gt;location&lt;/code&gt;：配置存储位置，不必更改&lt;/li&gt;
&lt;li&gt;&lt;code&gt;password_file&lt;/code&gt;：密码从此文件获取&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;创建 &lt;code&gt;play-shadowsocks.yml&lt;/code&gt;，其内容如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;---
- hosts: all
  become: True

  roles:
  - shadowsocks
&lt;/pre&gt;&lt;/div&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;执行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;ansible-playbook -i &amp;lt;你的 VPS IP 或域名&amp;gt;, play-shadowsocks.yml
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;注意，其后的 &lt;code&gt;,&lt;/code&gt; 不可少。&lt;/p&gt;
&lt;p&gt;以下为执行输出结果，用时也就 5 分钟：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="n"&gt;PLAY&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*********************************************************************&lt;/span&gt;

&lt;span class="n"&gt;TASK&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*******************************************************************&lt;/span&gt;
&lt;span class="n"&gt;Thursday&lt;/span&gt; &lt;span class="mi"&gt;09&lt;/span&gt; &lt;span class="n"&gt;March&lt;/span&gt; &lt;span class="mi"&gt;2017&lt;/span&gt;  &lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mo"&gt;05&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;55&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;0800&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mo"&gt;00&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;00.017&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;       &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mo"&gt;00&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;00.017&lt;/span&gt; &lt;span class="o"&gt;********&lt;/span&gt;
&lt;span class="nl"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;xxx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xxx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xx&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;TASK&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;shadowsocks&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Install&lt;/span&gt; &lt;span class="n"&gt;shadowsocks&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;libev&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*********************************&lt;/span&gt;
&lt;span class="n"&gt;Thursday&lt;/span&gt; &lt;span class="mi"&gt;09&lt;/span&gt; &lt;span class="n"&gt;March&lt;/span&gt; &lt;span class="mi"&gt;2017&lt;/span&gt;  &lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mo"&gt;06&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;57&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;0800&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mo"&gt;01&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;01.376&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;       &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mo"&gt;01&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;01.394&lt;/span&gt; &lt;span class="o"&gt;********&lt;/span&gt;
&lt;span class="nl"&gt;changed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;xxx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xxx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xx&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;TASK&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;shadowsocks&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Generate&lt;/span&gt; &lt;span class="n"&gt;Shadowsocks&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*****************************&lt;/span&gt;
&lt;span class="n"&gt;Thursday&lt;/span&gt; &lt;span class="mi"&gt;09&lt;/span&gt; &lt;span class="n"&gt;March&lt;/span&gt; &lt;span class="mi"&gt;2017&lt;/span&gt;  &lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mo"&gt;07&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;0800&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mo"&gt;00&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;24.083&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;       &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mo"&gt;01&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;25.477&lt;/span&gt; &lt;span class="o"&gt;********&lt;/span&gt;
&lt;span class="nl"&gt;changed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;xxx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xxx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xx&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;TASK&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;shadowsocks&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Get&lt;/span&gt; &lt;span class="n"&gt;Shadowsocks&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;**********************************&lt;/span&gt;
&lt;span class="n"&gt;Thursday&lt;/span&gt; &lt;span class="mi"&gt;09&lt;/span&gt; &lt;span class="n"&gt;March&lt;/span&gt; &lt;span class="mi"&gt;2017&lt;/span&gt;  &lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mo"&gt;07&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;29&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;0800&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mo"&gt;00&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;08.719&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;       &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mo"&gt;01&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;34.197&lt;/span&gt; &lt;span class="o"&gt;********&lt;/span&gt;
&lt;span class="nl"&gt;changed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;xxx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xxx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xx&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;TASK&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;shadowsocks&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Generate&lt;/span&gt; &lt;span class="n"&gt;Shadowsocks&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*******************************&lt;/span&gt;
&lt;span class="n"&gt;Thursday&lt;/span&gt; &lt;span class="mi"&gt;09&lt;/span&gt; &lt;span class="n"&gt;March&lt;/span&gt; &lt;span class="mi"&gt;2017&lt;/span&gt;  &lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mo"&gt;07&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;0800&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mo"&gt;00&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;12.182&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;       &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mo"&gt;01&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;46.380&lt;/span&gt; &lt;span class="o"&gt;********&lt;/span&gt;
&lt;span class="nl"&gt;changed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;xxx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xxx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xx&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;RUNNING&lt;/span&gt; &lt;span class="n"&gt;HANDLER&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;shadowsocks&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Restart&lt;/span&gt; &lt;span class="n"&gt;shadowsocks&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;libev&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;**********************&lt;/span&gt;
&lt;span class="n"&gt;Thursday&lt;/span&gt; &lt;span class="mi"&gt;09&lt;/span&gt; &lt;span class="n"&gt;March&lt;/span&gt; &lt;span class="mi"&gt;2017&lt;/span&gt;  &lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;0800&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mo"&gt;03&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;30.699&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;       &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mo"&gt;05&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;17.079&lt;/span&gt; &lt;span class="o"&gt;********&lt;/span&gt;
&lt;span class="nl"&gt;changed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;xxx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xxx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xx&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;PLAY&lt;/span&gt; &lt;span class="n"&gt;RECAP&lt;/span&gt; &lt;span class="o"&gt;*********************************************************************&lt;/span&gt;
&lt;span class="n"&gt;xxx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xxx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nl"&gt;xx&lt;/span&gt;              &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;    &lt;span class="n"&gt;changed&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;    &lt;span class="n"&gt;unreachable&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;    &lt;span class="n"&gt;failed&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;

&lt;span class="n"&gt;Thursday&lt;/span&gt; &lt;span class="mi"&gt;09&lt;/span&gt; &lt;span class="n"&gt;March&lt;/span&gt; &lt;span class="mi"&gt;2017&lt;/span&gt;  &lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;0800&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mo"&gt;00&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;04.996&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;       &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mo"&gt;05&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;22.075&lt;/span&gt; &lt;span class="o"&gt;********&lt;/span&gt;
&lt;span class="o"&gt;===============================================================================&lt;/span&gt;
&lt;span class="nl"&gt;shadowsocks&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Generate&lt;/span&gt; &lt;span class="n"&gt;Shadowsocks&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="o"&gt;-----------------------------&lt;/span&gt; &lt;span class="mf"&gt;210.70&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;
&lt;span class="n"&gt;setup&lt;/span&gt; &lt;span class="o"&gt;------------------------------------------------------------------&lt;/span&gt; &lt;span class="mf"&gt;61.38&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;
&lt;span class="nl"&gt;shadowsocks&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Install&lt;/span&gt; &lt;span class="n"&gt;shadowsocks&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;libev&lt;/span&gt; &lt;span class="o"&gt;--------------------------------&lt;/span&gt; &lt;span class="mf"&gt;24.08&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;
&lt;span class="nl"&gt;shadowsocks&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Get&lt;/span&gt; &lt;span class="n"&gt;Shadowsocks&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt; &lt;span class="o"&gt;---------------------------------&lt;/span&gt; &lt;span class="mf"&gt;12.18&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;
&lt;span class="nl"&gt;shadowsocks&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Generate&lt;/span&gt; &lt;span class="n"&gt;Shadowsocks&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt; &lt;span class="o"&gt;-----------------------------&lt;/span&gt; &lt;span class="mf"&gt;8.72&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;
&lt;span class="nl"&gt;shadowsocks&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Restart&lt;/span&gt; &lt;span class="n"&gt;shadowsocks&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;libev&lt;/span&gt; &lt;span class="o"&gt;---------------------------------&lt;/span&gt; &lt;span class="mf"&gt;5.00&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;至此，梯子已备好，&lt;a href="https://shadowsocks.org/en/config/quick-guide.html"&gt;配置客户端&lt;/a&gt;开始 enjoy 吧。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</summary><category term="selfhosted-server"></category></entry><entry><title>跟 Toy 玩自架服务器：创建 DigitalOcean Droplet</title><link href="https://linuxtoy.org/archives/selfhosted-server-3.html" rel="alternate"></link><updated>2017-03-08T19:50:19+08:00</updated><author><name>toy</name></author><id>tag:linuxtoy.org,2017-03-08:archives/selfhosted-server-3.html</id><summary type="html">&lt;p&gt;在笔者的印象中，DigitalOcean 貌似是最先以 SSD 作为存储介质的 VPS
提供商。如今，它已然成为全球第二大面向 Web
的主机公司。本篇笔者就来谈一谈如何创建 DigitalOcean 的 Droplet 吧。&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;准备工作&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;笔者在第一篇所提到的&lt;a href="https://linuxtoy.org/archives/selfhosted-server-1.html"&gt;主要工具&lt;/a&gt;，你依然需要。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;因为我们通过 Python 与 DigitalOcean 的 API
   进行交互，所以在你的系统中还需要有 dopy 这个库：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;pip install dopy
&lt;/pre&gt;&lt;/div&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;登录 &lt;a href="https://cloud.digitalocean.com/"&gt;DigitalOcean 管理界面&lt;/a&gt;，点击 API &amp;rarr; Generate New Token
   来生成一个 API 访问 Token，并记录备用。如果你还没有 DigitalOcean
   帐号，那么要先&lt;a href="https://m.do.co/c/7758457f61ad"&gt;注册&lt;/a&gt;一个。&lt;/p&gt;
&lt;p&gt;&lt;img alt="DigitalOcean API" src="https://linuxtoy.org/images/do-api.png" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;确认 SSH 公钥 &lt;code&gt;/root/.ssh/id_rsa.pub&lt;/code&gt; 存在。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;创建 Droplet&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在 DigitalOcean 的语境中，服务器实例被称为 Droplet，下面就让我们来创建它：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;使用 Git 克隆 &lt;a href="https://github.com/xuxiaodong/selfhosted-server"&gt;Selfhosted Server&lt;/a&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;打开 &lt;code&gt;group_vars/local.yml&lt;/code&gt;，转到以下行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="n"&gt;droplet&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
  &lt;span class="n"&gt;server_name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;toyland&lt;/span&gt;
  &lt;span class="n"&gt;ssh_key_name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;toyland&lt;/span&gt;
  &lt;span class="n"&gt;size_id&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;512&lt;/span&gt;&lt;span class="n"&gt;mb&lt;/span&gt;
  &lt;span class="n"&gt;region_id&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;sgp1&lt;/span&gt;
  &lt;span class="n"&gt;image_id&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;debian&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x64&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;各选项说明：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;id&lt;/code&gt;：已创建 Droplet 的 ID，暂时设为 0，待创建完毕再补上。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;server_name&lt;/code&gt;：Droplet 的名称，可任意指定。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ssh_key_name&lt;/code&gt;：SSH 公钥的名称。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;size_id&lt;/code&gt;：内存大小，跟付费计划相关，此处为入门型。&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;region_id&lt;/code&gt;：数据中心位置，此处为新加坡。为了获得更佳的访问速度，你可能想要更改此位置，可通过如下命令获得其它区域：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;curl -X GET -H &amp;quot;Content-Type: application/json&amp;quot; -H &amp;quot;Authorization: Bearer &amp;lt;你的 API Token&amp;gt;&amp;quot; &amp;quot;https://api.digitalocean.com/v2/regions&amp;quot; | jq .
&lt;/pre&gt;&lt;/div&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;image_id&lt;/code&gt;：操作系统类型，此处为 Debian 8 64 位。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;打开 &lt;code&gt;site-do.yml&lt;/code&gt;，定位到第二个 roles，暂时保留其下的 4
   个任务即可，其它可全部注释掉：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="n"&gt;roles:&lt;/span&gt;
- &lt;span class="n"&gt;common&lt;/span&gt;
- &lt;span class="n"&gt;unattendedupgrades&lt;/span&gt;
- &lt;span class="n"&gt;fail2ban&lt;/span&gt;
- &lt;span class="n"&gt;git-client&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;执行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;./play-site.sh
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;根据提示输入 1，然后再输入 API Token。待脚本执行完毕即可投入使用了。&lt;/p&gt;
&lt;p&gt;&lt;img alt="DigitalOcean Server" src="https://linuxtoy.org/images/do-server.png" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;一点比较&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;经过对 Vultr、Linode、以及 DigitalOcean 的使用，笔者感觉在付费计划上，Vultr
显得更加灵活（他们甚至推出了 $2.5/月的沙箱计划）；以 $5/月为例，DigitalOcean
的配置明显要低一些（内存仍然为 512Mb）。网站的管理界面，Vultr 和 DigitalOcean
的设计看起来更加现代，而 Linode
就比较老土了。在数据中心位置方面，笔者目前主要使用东京和新加坡，感觉前者的访问速度要好于后者。&lt;/p&gt;</summary><category term="selfhosted-server"></category></entry><entry><title>跟 Toy 玩自架服务器：创建 Linode 服务器实例</title><link href="https://linuxtoy.org/archives/selfhosted-server-2.html" rel="alternate"></link><updated>2017-03-06T21:28:51+08:00</updated><author><name>toy</name></author><id>tag:linuxtoy.org,2017-03-06:archives/selfhosted-server-2.html</id><summary type="html">&lt;p&gt;作为比较流行的 VPS 提供商，Linode 的费用曾经居高不下。感谢竞争，Linode
最近推出的入门款显得开始亲民了。笔者也正好借此机会作一番实际的体验。&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;准备工作&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;除开笔者在上一篇所提的&lt;a href="https://linuxtoy.org/archives/selfhosted-server-1.html"&gt;基本工具&lt;/a&gt;之外，你还需要准备下列东东：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;PycURL 和 linode-python，这两个 Python 库用来和 Linode 的 API
   进行交互。你可以尝试通过所用 Linux
   发行版的包管理器安装，如果仓库中没有，那么可以通过 &lt;code&gt;pip&lt;/code&gt; 安装：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;pip install pycurl linode-python
&lt;/pre&gt;&lt;/div&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;登录 &lt;a href="https://manager.linode.com/"&gt;Linode Manager&lt;/a&gt;，点击 My Profile &amp;rarr; API Keys 添加一个新的 API Key
   备用。要是你还没有 Linode 帐号，需要先&lt;a href="https://www.linode.com/?r=28bf53dae49d2c55dd671136769c0b7526db5891"&gt;注册&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Linode API Key" src="https://linuxtoy.org/images/linode-key.png" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;确保你的 SSH 公钥 &lt;code&gt;/root/.ssh/id_rsa.pub&lt;/code&gt; 存在。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;创建服务器&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;遵照上一篇文章克隆 &lt;a href="https://github.com/xuxiaodong/selfhosted-server"&gt;Selfhosted Server&lt;/a&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;打开 &lt;code&gt;group_vars/local.yml&lt;/code&gt;，定位到下列行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="n"&gt;linode&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
  &lt;span class="n"&gt;datacenter_id&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;
  &lt;span class="n"&gt;plan_id&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
  &lt;span class="n"&gt;distro_id&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;140&lt;/span&gt;
  &lt;span class="n"&gt;server_name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;toynode&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;简单解释一下各选项：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;id&lt;/code&gt;：已创建服务器的 ID，暂时置为 0，等创建完了再填上。&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;datacenter_id&lt;/code&gt;：数据中心的位置，11 代表东京，其它区域可通过以下命令得到：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;curl -s &amp;#39;https://api.linode.com/?api_key=&amp;lt;你的 API Key&amp;gt;&amp;amp;api_action=avail.datacenters&amp;#39; | jq .
&lt;/pre&gt;&lt;/div&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;plan_id&lt;/code&gt;：付费计划，这里是入门款。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;distro_id&lt;/code&gt;：操作系统，当然是 Debian 8 64 位。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;server_name&lt;/code&gt;：服务器名称，可以随意指定。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;打开 &lt;code&gt;site-linode.yml&lt;/code&gt;，在第二个 roles 下建议保留以下 4 个，其余可全部注释掉。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="n"&gt;roles:&lt;/span&gt;
- &lt;span class="n"&gt;common&lt;/span&gt;
- &lt;span class="n"&gt;unattendedupgrades&lt;/span&gt;
- &lt;span class="n"&gt;fail2ban&lt;/span&gt;
- &lt;span class="n"&gt;git-client&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;执行 &lt;code&gt;play-site.sh&lt;/code&gt; 脚本：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;┏━┓┏━╸╻  ┏━╸╻ ╻┏━┓┏━┓╺┳╸┏━╸╺┳┓   ┏━┓┏━╸┏━┓╻ ╻┏━╸┏━┓
┗━┓┣╸ ┃  ┣╸ ┣━┫┃ ┃┗━┓ ┃ ┣╸  ┃┃   ┗━┓┣╸ ┣┳┛┃┏┛┣╸ ┣┳┛
┗━┛┗━╸┗━╸╹  ╹ ╹┗━┛┗━┛ ╹ ┗━╸╺┻┛   ┗━┛┗━╸╹┗╸┗┛ ┗━╸╹┗╸

&lt;span class="n"&gt;Which&lt;/span&gt; &lt;span class="n"&gt;provider&lt;/span&gt; &lt;span class="n"&gt;are&lt;/span&gt; &lt;span class="n"&gt;you&lt;/span&gt; &lt;span class="n"&gt;using&lt;/span&gt;?
&lt;span class="mi"&gt;1&lt;/span&gt;. &lt;span class="n"&gt;DigitalOcean&lt;/span&gt;
&lt;span class="mi"&gt;2&lt;/span&gt;. &lt;span class="n"&gt;Linode&lt;/span&gt;
&lt;span class="mi"&gt;3&lt;/span&gt;. &lt;span class="n"&gt;Vultr&lt;/span&gt;
&lt;span class="n"&gt;Your&lt;/span&gt; &lt;span class="n"&gt;choose&lt;/span&gt; (&lt;span class="n"&gt;number&lt;/span&gt;):
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;按提示输入 2，然后输入 API Key，并按回车。等候执行完毕即可登录服务器开始使用。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Linode Server" src="https://linuxtoy.org/images/linode-server.png" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</summary><category term="selfhosted-server"></category></entry><entry><title>跟 Toy 玩自架服务器：创建 Vultr 服务器实例</title><link href="https://linuxtoy.org/archives/selfhosted-server-1.html" rel="alternate"></link><updated>2017-03-05T18:09:25+08:00</updated><author><name>toy</name></author><id>tag:linuxtoy.org,2017-03-05:archives/selfhosted-server-1.html</id><summary type="html">&lt;p&gt;回想笔者初次建站还是 2004 年那会儿，花 120 元 1
年在网易购买了空间。不过使用起来实在受限得很，只能通过 FTP 上传一些 HTML
静态页面。眼下，云主机层出不穷，拥有一台个人 VPS 也并非什么难事。如果你对想要拿
VPS 来干什么毫无头绪的话，那么不妨跟随笔者的脚步一起来玩一玩自架服务器。&lt;/p&gt;


&lt;p&gt;玩过 VPS
的同学想必都有和笔者类似的切身感受，那就是虽然架好的服务看起来很美好，但却是反复折腾的结果。这个过程不仅费时费力，而且更是对自己功力和耐心的考验。感谢
Puppet、Ansible、SaltStack、Docker
等新一代工具的兴起，使像架设服务这类对普通人而言比较困难的事情也变得更加容易了。&lt;/p&gt;
&lt;p&gt;笔者在此不会论及如何选一台趁手好用的
VPS，这个主题已经有很多同学探讨过了。你若对此感兴趣，不妨查一查相关的资料。在这个文章系列中，笔者将以
Vultr、Linode、DigitalOcean 这三家 VPS 提供商作为例子加以说明。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;准备工作&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在开始之前，我们需要事先准备好下列事项：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Git：用来从 GitHub 克隆源代码仓库。&lt;/li&gt;
&lt;li&gt;Ansible：笔者用来自动化服务器架设的首选工具，如果在你的系统中还没有它，那么可以参考笔者曾经撰写的《&lt;a href="https://linuxtoy.org/archives/hands-on-with-ansible.html"&gt;Ansible 快速上手&lt;/a&gt;》一文。&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;登录 Vultr，点击 Account &amp;rarr; API，生成一个新的 Personal Access
   Token，并记录备用。若你还没有 Vultr 帐号，那&lt;a href="http://www.vultr.com/?ref=7123175"&gt;注册&lt;/a&gt;先。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Vultr API" src="https://linuxtoy.org/images/vultr-api.png" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;点击 Servers &amp;rarr; SSH Keys，添加你的 SSH 公钥，并记录 SSH Key ID（URL 中
   SSHKEYID= 后面的部分）。如果你还没有 SSH
   公钥，那么可以参考相关文档&lt;a href="https://www.vultr.com/docs/how-do-i-generate-ssh-keys/"&gt;生成&lt;/a&gt;一个。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Vultr SSH Key" src="https://linuxtoy.org/images/vultr-ssh.png" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;创建服务器实例&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;现在万事已经俱备，只等我们撸起袖子开干了。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;克隆笔者编写的 Selfhosted Server：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;git clone --recursive https://github.com/xuxiaodong/selfhosted-server.git
&lt;/pre&gt;&lt;/div&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;配置服务器，打开 &lt;code&gt;group_vars/local.yml&lt;/code&gt; 文件，转到以下行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="n"&gt;vultr&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;dc_id&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;
    &lt;span class="n"&gt;plan_id&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;201&lt;/span&gt;
    &lt;span class="n"&gt;distro_id&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;193&lt;/span&gt;
    &lt;span class="n"&gt;ssh_key_id&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;58&lt;/span&gt;&lt;span class="n"&gt;b917dc1b55b&lt;/span&gt;
    &lt;span class="n"&gt;server_name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;toydroid&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;其中，各选项作用如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;dc_id&lt;/code&gt;：数据中心所处的位置，此处为东京。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;plan_id&lt;/code&gt;：付费计划，此处为 $5/月。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;distro_id&lt;/code&gt;：要用的操作系统，此处为 Debian 8 64 位版本。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ssh_key_id&lt;/code&gt;：SSH 公钥，替换成你自己的。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;server_name&lt;/code&gt;：服务器名称，替换成你自己的。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;你可能会想要更改数据中心位置或付费计划，那么如何查询它的 ID
呢？使用以下命令即可：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;# 获取数据中心位置
curl -H &amp;#39;API-Key: &amp;lt;你的 API 访问 Token&amp;gt;&amp;#39; https://api.vultr.com/v1/regions/list
# 获取付费计划
curl -H &amp;#39;API-Key: &amp;lt;你的 API 访问 Token&amp;gt;&amp;#39; https://api.vultr.com/v1/plans/list
&lt;/pre&gt;&lt;/div&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;选择执行的任务，打开 &lt;code&gt;site-vultr.yml&lt;/code&gt; 文件，转到下列行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="n"&gt;roles:&lt;/span&gt;
- &lt;span class="n"&gt;common&lt;/span&gt;
- &lt;span class="n"&gt;unattendedupgrades&lt;/span&gt;
- &lt;span class="n"&gt;fail2ban&lt;/span&gt;
- &lt;span class="n"&gt;git-client&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;在服务器实例被创建以后，你可以酌情选择要执行的任务。推荐保留上述四个，这将安装常用的
htop、git、fail2ban 等工具，并对系统进行一些调优。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;执行以下脚本，并按提示输入 3，接着再输入 API Token：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;./play-site.sh
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;等候脚本执行完毕（&lt;a href="https://paste.unixkoans.com/view/8f0b8cb2"&gt;参考输出&lt;/a&gt;），登录 Vultr，你应当可以看到服务器实例已经创建好了。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Vultr Server" src="https://linuxtoy.org/images/vultr-server.png" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</summary><category term="selfhosted-server"></category></entry><entry><title>rm-protection：一个尽可能从根源防止误删的 rm 替代品</title><link href="https://linuxtoy.org/archives/rm-protection.html" rel="alternate"></link><updated>2017-02-04T15:22:04+08:00</updated><author><name>Alan Chen</name></author><id>tag:linuxtoy.org,2017-02-04:archives/rm-protection.html</id><summary type="html">&lt;p&gt;前几天在 YouTube 上目睹了 GitLab 的删库意外事件，突然想到一个主意：若是管理员当时能被问一句「你在删哪个数据库？」，恐怕这种事情也不会发生了吧。&lt;/p&gt;


&lt;p&gt;&lt;img alt="rm-p" src="https://linuxtoy.org/images/rm-p-logo.png" /&gt;&lt;/p&gt;
&lt;p&gt;rm-protection 就是这样一个轮子。它与原生 rm 完全兼容（事实上它会将参数原封不动地传递给 rm），唯一不同的是，它在执行 rm 前将检查你要删的每一个文件或者目录是否被「保护」。rm-protection 提供了一个命令 protect 来保护文件或者目录，通过这个命令你可以为一个文件或者目录设置一个安全问题与回答。&lt;/p&gt;
&lt;p&gt;若是 GitLab 管理员提前将数据库目录保护起来，设置问题和回答为分别「你在删哪个数据库？」「生产」。当管理员回答「测试」时，就会自动中止并提示，防止酿成惨剧。&lt;/p&gt;
&lt;p&gt;&lt;img alt="rm-p" src="https://linuxtoy.org/images/rm-p.gif" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/alanzchen/rm-protection"&gt;源代码&lt;/a&gt;已经在 GitHub 上了。程序也已经被打包到 PyPi。&lt;/p&gt;
&lt;p&gt;与其他类似的轮子相比（比如各种 trash 类的，mv 类的），这个工具更能够保护特定的文件，而且将会从源头上解决问题。GitHub Readme 尾部提供了一个表格，对比其他轮子的特性。&lt;/p&gt;</summary></entry><entry><title>Fedora 25 Release Party 北京站</title><link href="https://linuxtoy.org/archives/fedora-25-release-party-beijing.html" rel="alternate"></link><updated>2016-12-08T13:25:00+08:00</updated><author><name>mytbk</name></author><id>tag:linuxtoy.org,2016-12-08:archives/fedora-25-release-party-beijing.html</id><summary type="html">&lt;p&gt;在 Fedora 25 发布了很多天以后，Fedora 25 Release Party
帝都站将于北京大学隆重召开。&lt;/p&gt;


&lt;p&gt;这次 Release Party 由&lt;a href="https://www.bdwm.net/v2/thread.php?bid=13"&gt;北京大学 Linux 俱乐部&lt;/a&gt;主办。
红帽公司的 &lt;a href="https://fedoraproject.org/wiki/User:Zsun"&gt;Zamir SUN&lt;/a&gt; 和 Fedora 中文社区的 &lt;a href="https://fedoraproject.org/wiki/User:Tonghuix"&gt;Tong Hui&lt;/a&gt;
是这次活动的组织者。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;时间: 12月10日(周六) 下午 13:00&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;地点: 北京大学第二教学楼 四层 412&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;考虑到我校入校检查比较严，建议校外人员带上自己的证件。&lt;/p&gt;
&lt;p&gt;Fedora 官方 wiki 链接：&lt;a href="https://fedoraproject.org/wiki/Release_Party_F25_Beijing"&gt;https://fedoraproject.org/wiki/Release_Party_F25_Beijing&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;演讲主题&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;What's new in Fedora 25 (Zamir SUN)&lt;/li&gt;
&lt;li&gt;Atomic in Fedora (Gbraad)&lt;/li&gt;
&lt;li&gt;A brief introduction about Linux Club of Peking University&lt;/li&gt;
&lt;li&gt;Installfest&lt;/li&gt;
&lt;/ul&gt;</summary><category term="Fedora"></category></entry><entry><title>Humble Book Bundle Unix</title><link href="https://linuxtoy.org/archives/humble-book-bundle-unix.html" rel="alternate"></link><updated>2016-11-25T09:10:00+08:00</updated><author><name>lovenemesis</name></author><id>tag:linuxtoy.org,2016-11-25:archives/humble-book-bundle-unix.html</id><summary type="html">&lt;p&gt;Humble Bundle 新一期的 Book 组合以来自 O'RELLY Unix 动物书系列为主题，动物爱好者或者囤书症晚期人士不容错过～&lt;/p&gt;


&lt;p&gt;本次的书籍组合包含了 Unix 相关领域的不少内容，其中基本值得推（tu）荐（cao）的有：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;写实的展现系统宕机时管理员无计可施苦逼样的 &lt;em&gt;Linux Pocket Guide&lt;/em&gt;, 3rd Edition, &lt;/li&gt;
&lt;li&gt;定要把龟类和鲈鱼玩坏的 &lt;em&gt;Classic Shell Scripting&lt;/em&gt; 和 &lt;em&gt;Bash Pocket Reference, 2nd Edition&lt;/em&gt; 系列&lt;/li&gt;
&lt;li&gt;爪牙五爪的 &lt;em&gt;TCP/IP Network Administration, 3rd Edition&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://www.humblebundle.com/books/unix-book-bundle"&gt;点击此购买&lt;/a&gt;&lt;/p&gt;</summary><category term="humblebundle"></category></entry><entry><title>Fedora 25 正式发布</title><link href="https://linuxtoy.org/archives/fedora-25-final-released.html" rel="alternate"></link><updated>2016-11-23T21:20:00+08:00</updated><author><name>lovenemesis</name></author><id>tag:linuxtoy.org,2016-11-23:archives/fedora-25-final-released.html</id><summary type="html">&lt;p&gt;经过意料之中的数次延期，Fedora 25 正式发布，带来了包含默认 Wayland 环境和容器化应用程序分发 Flatpak 在内的诸多开源领域新进展。 &lt;/p&gt;


&lt;p&gt;本次发布主要的变化有：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;引入 Fedora Atomic 替代过去的 Fedora Cloud，提供基于 OSTree 原子性的系统滚动升级，方便在遇到升级问题时快速回滚至先前版本&lt;/li&gt;
&lt;li&gt;使用 Fedora Media Writer 作为主要的下载媒体获取方式。Fedora Media Writer 是一款使用 PyQt5 构建的跨平台 Fedora LiveUSB 创建工具，通过向导式的操作实现下载、校验及创建 USB 的一系列操作，且支持包括 Spin 在内的多种 Fedora 发布方式。&lt;/li&gt;
&lt;li&gt;Unicode 更新至 9.0 版本&lt;/li&gt;
&lt;li&gt;对于 Workstation 版本默认使用 Wayland 显示服务协议，不过依然提供 X11 的经典方案。&lt;/li&gt;
&lt;li&gt;Ibus 现在可以通过 &lt;code&gt;CTRL + SHIFT + E&lt;/code&gt; 的方式输入表情符号&lt;/li&gt;
&lt;li&gt;更新 Ruby on Rails 5.0, Go 1.7, glibc 2.24，Rust 1.12， Erlang 19，GHC 7.10。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;参考&lt;a href="https://linuxtoy.org/archives/fedora-25-beta.html"&gt;过往 Beta 版本的报道&lt;/a&gt;获取更多详情。&lt;/p&gt;
&lt;p&gt;除此之外，您还可以在&lt;a href="https://linuxtoy.org/archives/howto-install-fedora25beta-on-termux-and-raspberrypi.html"&gt; Raspberry Pi 2/3 或者 Android 手机/平板/机顶盒上安装并使用 Fedora 25&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://docs.fedoraproject.org/en-US/Fedora/25/html-single/Release_Notes/index.html"&gt;官方发布摘要&lt;/a&gt;&lt;/p&gt;</summary><category term="fedora"></category></entry><entry><title>微软成为 Linux 基金会成员</title><link href="https://linuxtoy.org/archives/microsoft-joins-linux-foundation.html" rel="alternate"></link><updated>2016-11-17T16:22:00+08:00</updated><author><name>lovenemesis</name></author><id>tag:linuxtoy.org,2016-11-17:archives/microsoft-joins-linux-foundation.html</id><summary type="html">&lt;p&gt;微软在昨日举行的 &lt;code&gt;Connect();&lt;/code&gt; 开发者大会上宣布加入 Linux 基金会，成为其白金会员之一。&lt;/p&gt;


&lt;p&gt;Linux 基金会对于微软在过去几年中从积极参与开源项目和 Linux 厂商的合作表示赞许。&lt;/p&gt;
&lt;p&gt;除了作为厂商成为 Linux 基金会白金会员之外，微软 Azure 团队的 John Gossman 将加入 Linux 基金会成为圆桌会议执行成员之一。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.linuxfoundation.org/announcements/microsoft-fortifies-commitment-to-open-source-becomes-linux-foundation-platinum"&gt;消息来源及 Linux 基金会官方公告&lt;/a&gt;&lt;/p&gt;</summary><category term="linuxfoundation"></category></entry><entry><title>Ubuntu Core 16 黑客松 — Celebrate Ubuntu</title><link href="https://linuxtoy.org/archives/ubuntu-jam.html" rel="alternate"></link><updated>2016-11-16T09:05:38+08:00</updated><author><name>Liam Zheng</name></author><id>tag:linuxtoy.org,2016-11-16:archives/ubuntu-jam.html</id><summary type="html">&lt;p&gt;Ubuntu Core是一个精简版的Ubuntu系统，完全采用安全、易于更新的开源Linux打包格式Snap构建。Ubuntu Core针对生产环境从头开始设计，并在安全性和易维护性方面进行了优化。同时，Ubuntu Core为快速打造物联网设备和嵌入式设备提供了一个安全的支持平台。为了庆祝Ubuntu Core 16正式发布，特此专为欲在IoT领域大展拳脚的各路开发高手，创客团队举办Ubuntu Core黑客松。&lt;/p&gt;


&lt;p&gt;&lt;img alt="ubuntu jam" src="https://linuxtoy.org/images/ubuntu-jam.png" /&gt; &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;活动时间：2016年11月26日至27日&lt;/li&gt;
&lt;li&gt;活动地点：深圳市福田区华强北路华强广场D座7楼&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;活动日程：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第一天：11月26日:&lt;/li&gt;
&lt;li&gt;9:00am签到&lt;/li&gt;
&lt;li&gt;9:30am-10:00am: 开场&lt;/li&gt;
&lt;li&gt;10:00am-10:30am 嘉宾演讲&lt;/li&gt;
&lt;li&gt;10:30am-11:00am 嘉宾演讲&lt;/li&gt;
&lt;li&gt;11:00开始Coding&lt;/li&gt;
&lt;li&gt;12:00 午餐&lt;/li&gt;
&lt;li&gt;19:00 晚餐&lt;/li&gt;
&lt;li&gt;00:00 宵夜&lt;/li&gt;
&lt;li&gt;第二天：11月27日:&lt;/li&gt;
&lt;li&gt;8:00am: 早餐&lt;/li&gt;
&lt;li&gt;12:00am: 午餐&lt;/li&gt;
&lt;li&gt;4:00pm-4:30pm: 作品提交，停止开发&lt;/li&gt;
&lt;li&gt;4:30pm-5:00pm: 作品Demo环节 &lt;/li&gt;
&lt;li&gt;5:00pm-5:20pm: Ubuntu Cake Time&lt;/li&gt;
&lt;li&gt;5:20pm-5:40am: 评奖、合影结束&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;开发任务：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A：任务说明&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;基于Ubuntu的开发项目，开发可在Ubuntu上运行的snap应用程序； &lt;/li&gt;
&lt;li&gt;基于Ubuntu Core的智能物联网项目，任何运行于Ubuntu Core的智能物联网项目，包括Ubuntu Core和其他云端，服务结合的完成，或独立的运行于Ubuntu Core的物联网项目。（Ubuntu Core版本要求为：Ubuntu Core 16）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;B：学习资料&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Ubuntu Core系统镜像，下载链接（支持树莓派2、3，高通Dragonboard 410c）；桌面环境：Ubuntu 16.04 LTS及以上，下载链接。&lt;/li&gt;
&lt;li&gt;Ubuntu Core系统中文安装教程,点击此处&lt;/li&gt;
&lt;li&gt;开发在线视频直播：直播时间：11月17日下午2点到3点，直播链接： 点击报名
（备注：活动现场将提供树莓派3、高通Dragonboard 410c等开发板给大家使用，请自带Ubuntu Core支持开发板或Ubuntu桌面环境也可以）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;评分标准：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;创意性：产品的新颖度。是否已有同类产品？差别在哪里？&lt;/li&gt;
&lt;li&gt;实用性：产品在现实生活中的实用性&lt;/li&gt;
&lt;li&gt;展示度：团队对产品展示的清晰有条理性&lt;/li&gt;
&lt;li&gt;影响力：产品所解决问题的影响规模&lt;/li&gt;
&lt;li&gt;技术难度：产品所需技术难度&lt;/li&gt;
&lt;li&gt;完成度：产品是否完成可以在Ubuntu/Ubuntu Core上运行&lt;/li&gt;
&lt;li&gt;专业性：作品是否实现云端连接&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;奖项设置&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="ubuntu jam" src="https://linuxtoy.org/images/ubuntu-jam2.png" /&gt; &lt;/p&gt;
&lt;p&gt;深圳的小伙伴们赶紧&lt;a href="http://www.huodongxing.com/event/1360414590800?qd=linuxtoy"&gt;报名&lt;/a&gt;吧。&lt;/p&gt;</summary><category term="ubuntu"></category></entry></feed>