最近一段时间我在实验室用一台旧机器搭建了一些日用的自建服务,有一些感觉用着体验很不错, 分享一下相关的使用经验。
概述
服务基本全都是基于 docker
用 docker-compose
搭建,过程基本上就是修改一下相应服务的官方给的docker-compose.yml
,比较无脑,主要分享下使用感受。
目前来讲用着倒是没太大问题,但有个担忧是我还没有尝试过镜像和容器的更新,感觉会出点问题。
私有云同步盘 - seafile
其实用了很久的Nextcloud
,最近一个月发现其中的大多数功能都用不到,还要忍受经常同步出错,
于是转向了功能更少但是性能会更好一些的seafile
,感觉比较舒服,
由于是国内团队开发,使用起来的逻辑也更符合本人的直觉一些,尤其是文件分享这一块感觉更好用。
还要说一下目前遇到的问题:
- 由于我没有域名,服务绑定的是内网 IP,在宿舍用
tailscale
远程连接内网时,Android 客户端是不能用的, 好像是因为它写死了 IP, 在NextCloud
则没发现这个问题,可以配置多个允许的 host IP. - 虽然把资料库(seafile 的术语,可以看成是一个根目录,一个用户可以有多个资料库)分成了共享 和自己的,但共享出去的还是只会显示在自己的里面,共享这一栏只会显示别人共享给自己的 (是 feature 不是 bug,只是跟我想的不太一样)
- 新建公共资料库时前端不能直接选读写权限,只能先建成只读的后续再修改(前端用户体验小问题)
- 最大的问题是虽然共享功能很好用,但我在实验室尝试推广给别人用结果没有人用。 大家依旧还是选择微信传文件,即使我们就在一个局域网里。 现在就是只有我自己在用,完全没发挥出全部的功能。
配置文件:
version: '2.0'
services:
db:
image: mariadb:10.5
container_name: seafile-mysql
environment:
- MYSQL_ROOT_PASSWORD=password # Requested, set the root's password of MySQL service.
- MYSQL_LOG_CONSOLE=true
volumes:
- /your/db:/var/lib/mysql # Requested, specifies the path to MySQL data persistent store.
restart: always
networks:
- seafile-net
memcached:
image: memcached:1.5.6
container_name: seafile-memcached
entrypoint: memcached -m 256
restart: always
networks:
- seafile-net
seafile:
image: seafileltd/seafile-mc:latest
container_name: seafile
ports:
- "9000:80"
# - "443:443" # If https is enabled, cancel the comment.
volumes:
- /your/data:/shared # Requested, specifies the path to Seafile data persistent store.
environment:
- DB_HOST=db
- DB_ROOT_PASSWD=password # Requested, the value shuold be root's password of MySQL service.
- TIME_ZONE=Asia/Shanghai # Optional, default is UTC. Should be uncomment and set to your local time zone.
- [email protected] # Specifies Seafile admin user, default is '[email protected]'.
- SEAFILE_ADMIN_PASSWORD=password # Specifies Seafile admin password, default is 'asecret'.
- SEAFILE_SERVER_LETSENCRYPT=false # Whether to use https or not.
- SEAFILE_SERVER_HOSTNAME=example.com # Specifies your host name if https is enabled.
depends_on:
- db
- memcached
restart: always
networks:
- seafile-net
networks:
seafile-net:
git 服务 - gitea
git 服务也是必不可少的,用 GitHub 不知道哪天找个理由就把我库全删了, 国内的类似服务又有着严格的内容审核,还是内网自建的用着放心。
gitea 提供的功能对我来说已经很足够了。就是搭建过程 还是有些不太顺畅,一个配置文件并不能解决全部, 还要求管理员第一次登录时填一些东西, 这一块我记得我第一次用错了很多次。时间比较久远,就记着主要是卡在数据库, 最终填的应该直接是配置文件里的服务名而非ip.
配置文件:
version: '2'
services:
web:
image: gitea/gitea:latest
volumes:
- /your/data:/data
ports:
- "3000:3000"
- "3022:22"
depends_on:
- db
restart: always
db:
image: mariadb:10
restart: always
environment:
- MYSQL_ROOT_PASSWORD=password
- MYSQL_DATABASE=gitea
- MYSQL_USER=gitea
- MYSQL_PASSWORD=password
volumes:
- /your/db:/var/lib/mysql
$\LaTeX$ 在线编辑 - overleaf
按照官方给出的步骤搭建的, 但其实后来觉得不太好用,首先自建的服务跟他官网提供的服务比少一些重要功能,比如没有模板;其次容器里装字体很不方便, 写论文倒是没什么,如果想写点中文文档或者做个中文 beamer 就难受了; 最主要是在线的编辑器太弱。最终我还是选择用 vscode 连远程服务器写 $\LaTeX$, 用 git 做版本管理。而且用 vscode 不仅能格式化代码,还有个好处是有一个能检查英语语法错误的插件 $L\TeX$, 能修改诸如单复数、名词可数不可数、标点符号等细节问题。
远程组网 - tailscale
严格来讲这个不能算自建服务,因为实际上用的他的服务器。 虽然这个公司宣称他的服务器只是中转,不能解密真实流量,但实际怎么样也很难下定论。 我仔细一想我也不涉密,他带来的好处又实在太多了,最终我还是选择用它。 而且没想到的是最近为了其他目的写的一个端口转发工具 顺便缓解了这个问题,因为又多了一层加密。 (应该吧,他们总不可能花时间中间人攻击我一个无名小卒吧,待遇太高了…)
我认为的 tailscale 的好处:
- 访问内网服务. 这是他作为 VPN 的本职工作,零配置,登录直接用的设计真的很爽。
- ipv6 免流. 这玩意还顺便解决了我宿舍上网问题。我宿舍 ipv6 不计费,偶尔发现用 tailscale 跟实验室能 ipv6 only 打洞成功,于是我就所有上网流量全部从实验室中转了,不仅不收费,体验也变好了,因为我宿舍直连外面的网络质量真的不太行.
- 我认为是比其他打洞工具比如
frp
要安全的,因为不用把端口暴露在公网上。 我有过一次把ssh改成了弱密码登录忘记关掉了,一夜过去惨遭挖矿的经历,现在对于把任何服务暴露在公网都比较谨慎。 虽然后来被别人科普frp
其实可以访问端也开起一个客户端,三者间认证,但着实是有点麻烦了。 tailscale 毕竟是 VPN,用起来就像在同一个局域网。
魔法上网 - v2ray
这也是必不可少的功能,之前也写过我搭 v2ray 的经历, 目前用着还是挺稳定,这里主要讲讲我个人使用 v2ray 客户端的经验。
现在的加密代理协议原理都比较类似,就是本地开一个 SOCKS5
端口,流进来的流量加密传输到海外服务器被代理。
那么如果一个局域网内有多台设备都想魔法上网,为了不每台设备都安装一个 v2ray 客户端,
可以将那个 SOCKS5
绑定到 0.0.0.0
.
这带来了新的问题,SOCKS5
完全不加密,而我也懒得加上认证,有着被局域网里的其他人偷看和偷用的风险。
为了解决这个,这两天我专门写了一个类似ssh -L
功能的端口转发工具,
目的是把一个绑定在127.0.0.1
的本地端口(服务端)的流量安全地转发到一个可信用户的本地端口(客户端).
认证和加密我就直接学我觉得设计得比较好的 wireguard
所使用的 Noise_IK
模式.
造这个轮子一个原因是练手,还有一个原因就是觉得 ssh 隧道用起来还是不够方便,尤其是想要教给别人怎么用的时候.
有了我写的这玩意,只要服务端配置好,就可以直接生成一个内嵌密钥对和基本配置的客户端可执行文件,
扔给对方直接运行即可,不需要任何配置文件和运行参数。
虽然实现的原理很简单,但我自己觉得还是挺有用的,
可能是我瞎写的小东西里最有用的之一,等有时间再完善一下就出去推广一下 (自信.jpg)。