分享一下我觉得好用的自建服务们

经验

最近一段时间我在实验室用一台旧机器搭建了一些日用的自建服务,有一些感觉用着体验很不错, 分享一下相关的使用经验。

概述

服务基本全都是基于 dockerdocker-compose 搭建,过程基本上就是修改一下相应服务的官方给的docker-compose.yml,比较无脑,主要分享下使用感受。

目前来讲用着倒是没太大问题,但有个担忧是我还没有尝试过镜像和容器的更新,感觉会出点问题。

私有云同步盘 - seafile

其实用了很久的Nextcloud,最近一个月发现其中的大多数功能都用不到,还要忍受经常同步出错, 于是转向了功能更少但是性能会更好一些的seafile,感觉比较舒服, 由于是国内团队开发,使用起来的逻辑也更符合本人的直觉一些,尤其是文件分享这一块感觉更好用。

还要说一下目前遇到的问题:

  1. 由于我没有域名,服务绑定的是内网 IP,在宿舍用 tailscale 远程连接内网时,Android 客户端是不能用的, 好像是因为它写死了 IP, 在 NextCloud 则没发现这个问题,可以配置多个允许的 host IP.
  2. 虽然把资料库(seafile 的术语,可以看成是一个根目录,一个用户可以有多个资料库)分成了共享 和自己的,但共享出去的还是只会显示在自己的里面,共享这一栏只会显示别人共享给自己的 (是 feature 不是 bug,只是跟我想的不太一样)
  3. 新建公共资料库时前端不能直接选读写权限,只能先建成只读的后续再修改(前端用户体验小问题)
  4. 最大的问题是虽然共享功能很好用,但我在实验室尝试推广给别人用结果没有人用。 大家依旧还是选择微信传文件,即使我们就在一个局域网里。 现在就是只有我自己在用,完全没发挥出全部的功能。

配置文件:

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 的好处:

  1. 访问内网服务. 这是他作为 VPN 的本职工作,零配置,登录直接用的设计真的很爽。
  2. ipv6 免流. 这玩意还顺便解决了我宿舍上网问题。我宿舍 ipv6 不计费,偶尔发现用 tailscale 跟实验室能 ipv6 only 打洞成功,于是我就所有上网流量全部从实验室中转了,不仅不收费,体验也变好了,因为我宿舍直连外面的网络质量真的不太行.
  3. 我认为是比其他打洞工具比如 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)。