# 互不联网时代的自给自足

## 前言

本文主要讨论如何自行假设各种网络服务，涉及笔记，音乐，文件共享，源代码管理等等。旨在尽可能自行架设所需的网络服务，不被第三方所绑架，不被一些产品经理喂💩吃。 本文大多使用开源软件，并尽可能挑选可以使用Docker的软件，来简化部署的难度。

首先说明我们为什么要自给自足？很简单，因为在线的资源不足以让我们舒服的使用。其次，一些小型的公司和组织有私密性或者性能的要求，不可以使用在线服务。

我姑且先说一下我之前也是热衷于使用各种线上服务的，我并不是完全反对线上服务，我比较多用过的包括且不限于：

* 有道云笔记
* 为知笔记
* 百度音乐盒
* 网易云音乐
* 百度网盘
* 115网盘
* Github
* Gitlab
* Circle CI
* 知乎
* cnblogs
* Slack
* QQ/Wechat...

其中有些我现在还在用，但是大多数都不用了。还在用的，有些是因为做的良心（点名：为知笔记（但是我现在不用了），Github，Gitlab，Circle CI），有些是因为没有替代品（点名：QQ，微信）。

### 线上服务的罪状

我给大家细说一下为什么现在不用某些线上服务/网站：

1. 资源限制：比如网盘，给上传不给下载，管杀不管埋，把狗用户骗进来杀，或者诸如早期的Github没有私有库（以及为了一两个私有库开pro有点。。。浪费）之类。
2. 人为制造数据孤岛：比如有道云笔记，并不能导出为诸如Word哪怕是pdf之类的格式，只进不出。各大互不联网公司互相屏蔽对手的链接，分享极为困难，出现了火星文口令这种反人类的东西。
3. 无孔不入的广告：商业公司要挣钱我可以理解，VIP还有广告就很过分，不点名了。
4. 服务降级：比如网易云音乐，开了VIP总该让我下载吧，我想用我索尼的HiFi MP3听可不可以？不可以，下载下来的格式是专有格式，需要联网才能播放。（以前没有这个问题）
5. 主动给用户添堵：最著名的就是各大厂商的网页版了，相信大家都看过“在App内打开”，“App浏览体验更佳”之类的鬼东西。其实大多数时候只是为了骗用户下载App，好监控你的隐私，以及给你推送。一不小心就跳转到App下载页面，心烦意乱，“使用桌面版”渲染的话，字体简直是视力杀手。
6. 不可抗力：我自己写的文章，有时候因为一些不可抗力会消失（肯定是知乎的存储没做好，嗯，肯定是），我并不希望它们消失。以及网易云音乐的歌曲有的时候也会因为版权的原因消失。

尽管说了这么多缺点，我仍然感谢他们提供的服务（但是还是要挥手说再见）。

同时也要说清楚的是，自给自足的线上服务大多不能完成人与人交流的功能，就算你自己建了一个类似Slack的站点，有好用的App，你不可能让你的父母亲戚都用这个Slack，还是得用微信，它们给你发“刚刚！突然宣布……”你还是得收着。

## 自给自足的方案

以下方案，随着我的使用不定期更新，也欢迎大家推荐自己喜欢的自给自足的服务。

### 网络环境

以下列举的服务，拿一台旧电脑（当然太旧的也不行）装个Linux就可以都搞定了。 但是如果这样做的话，只能在内网（家里）使用，最近疫情期间，很多人在家办公了，那么内网能用就好。

如果你有公网IP，你当然可以嚣张（我家里直接有公网IP，所以就直接建站了，我就很嚣张）。 但是国内大多数运营商给你层层NAT，到你手里都不知道自己是怎么连上的网。所以如果我们希望在办公室或者学校之类的场所使用，需要首先需要一个网络方案。

#### 购买VPS

VPS是最稳定的方案，但是因为国内几大云服务厂商的垄断，带宽卖的比金子还贵。 以阿里云为例，8M的带宽一年可以卖到4000元左右。哪怕按量付费的话，8M带宽至少是8毛钱1GB，说难听些，手机移动流量都比这个便宜了。

而诸如Vultr的国外云主机，哪怕30块钱一个月的小主机，每个月就有1TB流量，我亲测带宽可以达到100M。 但是由于用Vultr搭梯子的人太多，导致IP容易被Ban，造成误伤。 在国庆，大会以及众所周知但是不能提提了会喝茶的某月某日，IP段会被整体屏蔽。

虽然国内外云主机各有各的坑，但是VPS仍然是最稳定的建站方式，专业的IDC机房会比家里的破网络和电力情况要稳定的多，而且便宜的VPS大多数虚拟机，在硬件故障的时候，部分优秀厂商可以做到虚拟机漂移，让你对故障无感。

建议多找几个志同道合信得过的小伙伴大家合资购买一个VPS，下面推荐的服务大多是支持多账号的，一起用无论是价格还是运维（可以一人运维一个服务啊）压力都会小很多。

#### SSL

没有SSL，通讯就是在裸奔，容易被运营商灌入广告，缓存攻击，也容易被窃听。 免费的SSL证书教程参见[Let's encrypt -- 让我们一起愉快的使用HTTPS](https://github.com/TsingJyujing/blogs/tree/7faf08d843a36914a418bb44b8d6e4d214b1090a/other-tech/https/README.md)。

#### 内网穿透

VPS虽好，在家建站也有在家建站的好处，第一个好处就是数据是在家的，你可以物理的摸到的数据，虽然手上捧着硬盘并不比在IDC靠谱，但是硬件在家的安心感是无法替代的。

第一推荐的是 [ZeroTier](https://my.zerotier.com/)

这个系统不能让你有公网IP，但是却能让你跨区域组网，如果你只是在固定的几台设备上使用下列服务，那么完全可以试试异地组网。缺点也是有的，这个软件生生的造了很多概念，比如leaf，moon之类的术语，导致文档比较难懂，需要慢慢看，其次是我并不清楚国内速度和稳定性怎么样，但是我知道国内是可以用的。

其次推荐花生壳，花生壳的免费版（其实需要付6元）就已经很好用了，如果追求稳定可以买个300多一年的服务，这个钱相比VPS已经是便宜了，相比金贵的带宽性价比居然还可以。

如果你有VPS，但是VPS主机内存太小，你可以在VPS上部署内网穿透软件：[snail007/goproxy](https://github.com/snail007/goproxy/)，如果嫌管理麻烦的，可以用我写的[开源软件](https://github.com/TsingJyujing/goproxy-tunnel-server)。

### 笔记/博客系统

我目前用过最好的开源的笔记本应该是[蚂蚁笔记](https://leanote.com/)。

唯一的问题是，好久没更新了，项目可能凉了，但是App齐全，大Bug很少，平素使用绝对足够了。 还有一个缺点，用的是MongoDB，不擅长运维MongoDB的同学可能比较容易崩。

Leanote自带博客系统，但是我更喜欢用Gitbook，这篇博客就是用 Gitbook 做的。 缺点是Gitbook新版似乎国内被墙了，老版本还可以用。

如果可以花钱可以购买为知笔记，个人觉得做的是不错的了。

### Git

我目前用的是[Gogs](https://gogs.io/)，异常轻量化，只需要几十兆内存，但是功能齐全。 如果你是一个人使用或者轻度合作的话，Gogs就足够了，如果你有小团队要合作项目的话，Gitlab可能更佳。（但是Gitlab更吃资源，我印象里内存4G起步。）

目前我最推荐的还是Github，因为个人也可以无限创建私有项目了，开个Pro也不贵。不过这个不符合我们今天的主题。

### 持续集成

我前前后后用过TeamCity，Circle CI，Drone和Jenkins。

目前我用的是Drone，但是我并不推荐Drone。 主要原因是文档太少，坑太多，全靠自己看源代码折腾，我之所用Drone是因为公司在用，折腾中积累了一些经验。

如果不考虑收费，我推荐TeamCity。免费的中间比较推荐的是Jenkins，大家踩坑比较多。会好一些。

### 音乐

我目前用的是[Airsonic](https://github.com/airsonic/airsonic) 界面有点古老，App也有点过于简单，但是这已经是我能找到的最好的开源音乐软件了。

如果考虑收费的话，Subsonic还算不错，airsonic其实就是兼容Subsonic的API，所以可以直接应用Subsonic的App。

### 照片，文件和视频

照片，文件和视频，我都是靠[Nextcloud](https://nextcloud.com/)完成的：

文件的备份就不用说了。Nextcloud 的手机App可以直接帮你备份所有照片到你自己的服务器上。 更好的是，可以用WebDAV挂载，可以内部挂载别的盘（比如Samba或者SFTP协议之类的）。

网页内也可以直接播放视频，体验非常不错，不能播放的可以用ffmpeg转码成H264编码就行。

缺点是慢，而且有点臃肿，PHP写的，不好改动。

我还考察过[Seafile](https://www.seafile.com/en/home/)

三个用户以内专业版免费，支持全文搜索（ES实现的），可以说是很良心了，相比Nextcloud功能虽然不多，但是速度很快，也基本能满足使用。 可是我最后没有选它，因为照片备份不方便，这还在其次，它的文件系统格式是自定义的二进制分块存储，不方便我直接在服务器磁盘上操作使用网盘内的文件。

### TODO

其实还有很多东西我没有做到自给自足，比如Calendar，Task，我用的都是Google的产品。 也并不是所有的东西都需要自给自足，往往是在线服务的使用给了我痛苦的感觉的时候，我才会转向使用自建的服务。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://blog.tsingjyujing.com/other-tech/net-self-sufficient.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
