# 构建一站式个人数字平台：在 2C2G 服务器上自建 Memos、Joplin、Gitea 与 Wiki.js

原文：https://blog.grtsinry43.com/posts/personal-open-source-alterative/

作者：grtsinry43

发布时间：2025-05-04T08:50:56Z

内容更新时间：2025-05-04T08:50:56Z

前段时间课内作业需要，学校和华为云合作并给我们发放了代金券，由此我第一次使用华为云平台。

对于我这种前几年游击于各个云平台限时活动的“大冤种老用户”，虽然近几年云服务商都降价推广，活动频繁，但是来到一个新平台肯定还是要搞一波新用户福利嘛，所以我盯上了：

[传送门](https://activity.huaweicloud.com/discount_area_v5/index.html)

![](https://blog.grtsinry43.com/uploads/2025/05/04/image.png_33ae7d3a-1f7a-430c-b0e2-cd795dd5fbc3.png)


emm 并非推广，因为似乎从去年开始各家都在推 38/y 的轻量服务器。

不过话说回来，别看华为命名什么 Flexus L，本质就是轻量应用服务器，性能差，共享抢占式，开大服务直接有卡死的风险。并且这玩意儿我实测上行慢也就算了，下行还慢的要死，加上这种国内服务器要天天换源，体验算是相当差了。不过一分钱一分货嘛...吐槽归吐槽，这几年真的比 21/22 年那会儿活动多多了。

## 计划

这种 2c2g 的服务器，跑个 php 博客或者搭个静态页面也就差不多了，不过我们如果已经有了博客，那除去这个，还有什么折腾的呢？

首先是前几天我又经历了一次数据丢失 🥹，我已经麻木了，不过还好的是我重要的开源代码都在 github，写的文章都在软路由上有备份，开发环境可以重来

总结一下是这样的 😰

> 截止目前，我搞机生涯中，搞崩了 2 次 ntfs 一次 hfs+ 5 次 ext4 不计其数的 btrfs 一次 xfs 一次 apfs  
>
> 累计丢数据 3T-5T 左右，战功赫赫

不过平时尝试写的一点小东西，小项目，还有摘抄的代码段，平时记的小笔记，以及随笔的记录，折腾的重要文件，都随着 btrfs 分区的损坏灰飞烟灭了

其次，我目前常用的 flomo，typora，notion，要么是得开高级版才有很多功能，要么是没有云同步，要么是全云上，折腾了这么久，自己的笔记和知识库还是杂乱无章。

所以之前搁置很久的计划又继续了，利用开源替代构建自己的数字平台，而选择上，由于硬件性能的限制，我选择了两个 node 两个 go 的项目，低内存占用高性能，保证在小服务器上也可以流畅运行~，而恰好他们都是开源的比较不错的选择

都跑起来占用大概这样：

![](https://blog.grtsinry43.com/uploads/2025/05/04/image.png_ef3199c2-0d32-44a8-bb94-ac02a4cdfa31.png)


## 前置工作：Docker 中跑一切

这篇文章所有的服务全是在 Docker 中运行的，便捷管理，无需配环境，即开即用，快速升级

> [!NOTES] 提示
>
> 对了，我们一直使用 Ubuntu Server 24.04 举例，如果你偏好其他发行版，使用其对应的包管理器就好啦

我们先把 docker 本体弄好：

看官方教程就好啦，当然我也复制好了你可以直接粘过去用：

[Install Docker Engine on Ubuntu](https://docs.docker.com/engine/install/ubuntu/)

```shell
sudo apt update
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update

sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
```

安装好了首先启动服务：

```shell
sudo systemctl enable docker
sudo systemctl start docker
```

将你的用户添加到 docker 用户组：

```shell
sudo usermod -aG docker <username>
```

修改镜像源 `/etc/docker/daemon.json`

 ```json
{
  "registry-mirrors": [
    "https://docker.1panel.live"
  ]
}
 ```

修改完直接 `sudo systemctl restart docker` 重启服务就 ok 了

## Memos: 随时随地记录想法，便签式记录

Memos 算是 flomo 的开源替代，除了 AI 分析什么的其他功能都是有的，唯一就是以网页作为载体，可能比不上全平台客户端，但是自建我的数据更安全，自己也可以随时二次开发。

它的部署极其简单：

```shell
docker run -d --name memos -p 5230:5230 -v ~/.memos/:/var/opt/memos neosmemo/memos:stable
```

嗯，就结束了，其中 `~/.memos/` 是数据文件存放的位置，你可以自定义。

因为它的数据库存在 sqlite，所以启动本体之后什么都不用管了，你就轻松反代，申请证书，然后就能用了。

![](https://blog.grtsinry43.com/uploads/2025/05/04/image.png_922bf9e6-6e4e-4e23-85fb-214eddb1f38d.png)


看到这里就有帅的发光的你问了：

**TMD 你们这些人是不是没事找事啊，好好的产品不用，一天天搞什么开源替代，丑的要死，那么简陋，是不是没苦硬吃啊**

emm 怎么说，开源替代一个是自建为了数据的完全持有，保证自己数据的安全，还有就是通常开源产品有较高的自定义空间。

在设置——系统——自定义 CSS，就可以让他们变成自己喜欢的样子了。

![](https://blog.grtsinry43.com/uploads/2025/05/04/image.png_292e8df0-3bef-431b-86fa-c3f17e23638f.png)


怎么说，有点像 Win11 开了云母一样（）

## Joplin：记录笔记，全平台同步

如果说 Memos 是每日想法的记录，那么 Joplin 就是较长笔记的解决方案，其提供了开源服务端和全平台的应用，不过...，桌面端其实全是 electron 写的。

还是在官方仓库找到部署教程：

[joplin/packages/server/README.md at dev · laurent22/joplin](https://github.com/laurent22/joplin/blob/dev/packages/server/README.md)

首先创建一个 `.env`

```shell
APP_BASE_URL = https://example.com/joplin
APP_PORT = 22300
 
DB_CLIENT = pg
POSTGRES_PASSWORD = joplin
POSTGRES_DATABASE = joplin
POSTGRES_USER = joplin
POSTGRES_PORT = 5432
POSTGRES_HOST = localhost
```

先改一下 APP_BASE_URL 就好，其他先注释掉，我们先用内置的 sqlite 测试。

```shell
docker run --env-file .env -p 22300:22300 joplin/server:latest
```

嗯，又是一句命令就部署好了，反代好直接进去，默认用户名 `admin@localhost` 密码 `admin`

在客户端中设置——同步——选择 Joplin Server（Beta），然后输入地址用户名密码就好了。

![](https://blog.grtsinry43.com/uploads/2025/05/04/image.png_683d00dd-9618-4304-8897-001388857fae.png)


测试没问题了之后，我们来搞好 postgresql

```shell
sudo apt install postgresql
```

然后自启动和开启服务

```shell
sudo systemctl enable postgresql
sudo systemctl start postgresql
```

之后改密码和建新用户，新库：

```shell
sudo -i -u postgres
psql
```

```sql
ALTER USER postgres PASSWORD '你的强密码';
CREATE ROLE 你的用户名 WITH LOGIN PASSWORD '用户的密码';
CREATE DATABASE 你的数据库名 OWNER 你的用户名;
```

修改监听端口和验证策略



```shell
sudo vim /etc/postgresql/16/main/pg_hba.conf
```

添加你的 docker 容器网段，例如：

```shell
host    all             all             172.17.0.0/24            scram-sha-256
host    all             all             172.18.0.0/24            scram-sha-256
```

```shell
sudo vim /etc/postgresql/16/main/pg_hba.conf
```

```shell
listen_addresses = 'localhost,172.17.0.1'      
```

之后重启服务就好了

随后改好刚才的 `.env`，重启容器就好了。

## Wikijs：开源的强大协作知识库

Wikijs 是知名的知识库软件，没什么介绍的了，这个用的人很多，权限管理和协作功能十分完善。

先用 psql 建好数据库，这里我们还是 postgresql

我们使用 Docker Compose，创建好 `docker-compose.yml`

```yaml
services:
  wiki:
    image: ghcr.io/requarks/wiki:2
    environment:
      DB_TYPE: postgres
      DB_HOST: 172.17.0.1 #具体看你docker0ip
      DB_PORT: 5432
      DB_USER: username
      DB_PASS: password
      DB_NAME: wiki
    restart: unless-stopped
    ports:
      - "3001:3000"
volumes:
  db-data:
```

然后初始化就 ok 了。

![](https://blog.grtsinry43.com/uploads/2025/05/04/image.png_9c61511f-f2bc-4689-910e-7b9b91aa2b72.png)


## Gitea：轻量的自建 git 代码库解决方案

gitea 是一个类似 gitlab 的自建 git 代码库，但不同于 gitlab 的高占用和高硬件要求，gitea 使用 go 语言开发，极其轻量，可以在性能很低的服务器上流畅运行。

部署依然还是 Docker Compose

```yaml
networks:
  gitea:
    external: false

services:
  server:
    image: docker.gitea.com/gitea:1.23.7
    container_name: gitea
    environment:
      - USER_UID=1000
      - USER_GID=1000
      - GITEA__database__DB_TYPE=postgres
      - GITEA__database__HOST=172.17.0.1:5432  # 看你docker0ip
      - GITEA__database__NAME=gitea
      - GITEA__database__USER=username
      - GITEA__database__PASSWD=password      

      - GITEA__server__ROOT_URL=your_url
      - GITEA__server__DOMAIN=your_domain
      - GITEA__server__SSH_DOMAIN=your_domain
      - GITEA__server__SSH_PORT=222
      - GITEA__server__APP_DATA_PATH=/data/gitea
    restart: always
    networks:
      - gitea
    volumes:
      - ./:/data # 将宿主机当前目录挂载到容器 /data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "3000:3000" # Gitea Web UI
      - "222:22"    # Gitea SSH

```
![](https://blog.grtsinry43.com/uploads/2025/05/04/image.png_a63e1189-9e2a-4743-92e2-c8a8d86329e9.png)


跑起来可以设置下邮件服务，网站基本信息，然后咱们的重要任务到了 SSH

这里我将 22 映射到了外部的 222 端口，并且全程使用 git over ssh

在你使用的主力机上生成 ssh 密钥并在 gitea 上传公钥

```shell
ssh-keygen -t rsa -b 4096 -C name@example.com
```

然后编辑你的 `.ssh/config`

```shell
Host mygitea
    HostName your_url
    Port 222                    
    User git                      
    IdentityFile ~/.ssh/gitea
```

其中的 mygitea 是个别名，这样你可以通过 `ssh mygitea` 和 `git remote add mygitea:username/repo.git` 来使用 ssh 和 git

## 简要总结

这是一份在资源有限（如 2 核 CPU、2GB 内存）的云服务器上，通过自建方式搭建个人数字平台的用户准备的实践指南。出于对数据所有权、隐私安全以及对现有云笔记服务（如 Flomo, Notion）不满的考虑，决定利用开源软件 Memos、Joplin、Wiki.js 和 Gitea 来构建替代方案。

这些的前提还是得有时间慢慢折腾，并且对 docker linux 足够熟悉，当然你也可以向 AI 询问获得非常好的解决方案。

其中，所有平台都支持通过 css 进行美化，你可以查询相关的文档以获取进一步方法，我接下来有时间的话也会写一份 css 来美化各个平台并放在 github 上，到时候大家可以自取hh。（挖坑.jpg）

就这些，如果你恰好手上有这样的服务器，并且想要构建一套开源的文字代码记录平台，不妨试试这些！
