admin 发布的文章

本文介绍一些我经常使用的自托管服务,主要偏向于较为实用或非常有趣的开源项目。其中大部分都非常轻量,服务器配置 1 核 1 GB 就足够(Swap 2GB),推荐 2 核 2 GB(Swap 4GB)以上的配置,除非特殊标明,否则该服务至少支持 x64 和 ARM64 的处理器架构。

文章原文:https://dejavu.moe/posts/what-a-server-used-for/

Cloudflared#

cloudflared 是 Cloudflare Tunnel 的命令行客户端及 Tunnel 隧道守护程序,它让自托管服务变的简单,在服务器不开启任何入站端口的情况下,将服务安全地暴露到公网访问。

推荐按照 cloudflared pkg 上的说明,根据 Linux 发行版添加软件源,通过包管理器进行安装和更新。此外,即使您的服务器没有公网 IP,只要能正常访问 Cloudflare 网络,它还能作为自动内网穿透、反向代理(包括 SSL)、全球 CDN 加速、WAF……

cloudflared

Vaultwarden#

一个由社区维护的使用 Rust 重写的 Bitwraden API 实现,与 Bitwarden 官方客户端兼容,几乎是现在最佳的开源密码管理器托管方案。部署过程可以查看 初探 Cloudflare 零信任 - 通过 Docker 部署 Bitwarden 密码管理器

Vaultwarden

Book-Searcher#

Book-Searcher 本身并不存储任何图书源文件,它基于用户构建的私人图书索引进行搜素,得到搜索结果后,可以在 IPFS 上获取和阅读电子图书。可以使用 Docker 一键部署,我使用官方源码构建了支持 ARM 架构的 Docker 镜像

Book-Searcher

Calibre-Web#

正如其名,Calibre-Web 是一个基于 Calibre 数据库的 Web 界面实现(下面截图是暗色主题),它提供一体化图书管理方案:图书下载、上传、书架、多用户管理等功能,推荐使用 linuxserver/calibre-web 镜像通过 Docker 部署

Calibre Web

Mastodon#

Mastodon 是一个开源的去中心化「联邦制」社交应用,我搭建了自己的单人 Mastodon 示例 https://sink.love,详情:低成本自托管 Mastodon 实例简明指南

Mastodon

Umami#

Umami 是一个简单、快速、尊重隐私的网站分析服务,它不收集和存储访客的 IP 和 Cookie 等信息,而只进行网站数据的粗粒度统计。可以通过 Docker 一键部署(不支持 ARM)

Umami

Excalidraw#

excalidraw 是一个手绘风格的 Web 白板应用,非常容易上手和使用,可以通过 Docker 一键部署,我构建了支持 ARM 架构的 Docker 镜像

excalidraw

tldraw#

tldraw 也是一个手绘风格的 Web 白板应用,和 excalidraw 各有千秋 😎

tldraw

Aria2 Pro#

Aria2 Pro 是由 P3TERX 大佬打造的几近完美的 Aria2 服务集合,支持 Docker 一键部署,详情查看 Aria2 Pro - 更好用的 Aria2 Docker 容器镜像

Aria2 Pro

Docker Firefox#

docker-firefox 是一个在容器内运行的 Firefox 浏览器,当然是 Docker 一键部署啦,推荐使用 linuxserver/firefox 镜像

Docker Firefox

Memos#

Memos 一个具有知识管理和社交功能的开源备忘录,数据库使用可爱的 SQLite,迁移数据也很省心。实际上它远不止是备忘录,得益于 API 提供的高度拓展性,可以有更多玩法。使用 Docker 部署比较简单

Memos

SSH-Chat#

是的,你没看错,ssh-chat 可以让我们通过 SSH 进行交谈,支持群聊、私聊、置顶、封禁…… 等功能。ssh.dejavu.moe 是我长期开放的 SSH 聊天室,欢迎来吐槽、留言、表白、忏悔,更多信息可以查看 初探 Cloudflare 零信任 — 通过 Cloudflare Tunnel 搭建 SSH 聊天室

SSH-Chat

RSStT#

RSS to Telegram Bot 是一个注重阅读体验的 Telegram RSS 订阅机器人,将 RSS 讯息更新按照您喜欢的格式推送到 Telegram 频道/群组或私聊,支持 Docker 一键部署,

RSSHub#

RSS 是个好文明,RSSHub 为不提供 RSS Feed 的网站和服务提供 RSS 路由,万物皆可 RSS,支持 Docker 一键部署

Miniflux#

Miniflux 是个简洁、实用的基于 Web 的 RSS 阅读应用,支持 Docker 部署,我将它和 RSSHub 搭配使用:使用 Miniflux + RSSHub 打造个人 RSS 阅读器

Miniflux

Kutt#

kutt 是一个开源、支持数据统计的短网址服务,支持 Docker 一键部署

Kutt

busuanzi#

busuanzi 是一个基于 Golang 的 不蒜子 替代品,可以方便的统计页面访客数、浏览量等,支持 Docker 一键部署。我构建了支持 ARM, x64, ppc64le, s390x 的 Docker 镜像

Remark 42#

Remark42 是一个轻量、强大、注重隐私的评论系统,本站正在使用,支持 Docker 一键部署

Uptime-Kuma#

部署了这么多服务,我们需要一个强大且美观的服务运行状态监视器,Uptime-Kuma 就是我们的选择,支持 Docker 一键部署

Uptime Kuma

Duplicacy#

有了服务监控还不够,这么多服务,运行过程中存储的数据对我们来说非常重要。Duplicacy 是一个支持无锁去重的备份工具,可以将数据自动定时备份到各种云存储服务并附带加密。细节查看:

如果您还有其他实用的、好玩的项目,欢迎在下面推荐!


一、中文写入乱码问题


我输入的中文编码是 urf8 的,建的库是 urf8 的,但是插入MySQL总是乱码,一堆"???????????????????????"。可以使用以下的方式试试决解:

原url地址是

jdbc:mysql://localhost:3306/数据库名

改为

jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=UTF-8

就OK了。

二、Incorrect string value: '\xF0\x9F...' for column 'XXX' at row 1


做有关微信公众账号的项目时,报Incorrect string value: '\xF0\x9F\x98\x92' for column 'NIKENAME' at row 1,而所有的字符编码都是 utf8,使用的数据库是 mysql,在测试环境用得好好的,部署到线上后(使用的集群是阿里巴巴的,数据库服务器也是使用它们的,mysql 服务器版本是 5.5.18),就报这个错了,并且这个错,时而出现,时而不出现

Emoji表情字符现在在APP已经广泛支持了。但是MySQL的UTF8编码对Emoji字符的支持却不是那么好。所以我们经常会遇到这样的异常:

Java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x8E' for column 'nick' at row 1

原因是MySQL里 urf8 编码最多只能支持3个字节,而Emoji表情字符使用的 urf8 编码,很多都是4个字节,有些甚至是6个字节。

解决的方案有两种:

  1. 使用 utf8mb4 的 mysql 编码来容纳这些字符;

  2. 过滤掉这些特殊的表情字符。

方法1:使用utf8mb4的mysql编码来容纳这些字符


注意:要使用 utf8mb4 类型,首先要保证MySQL版本要不低于 MySQL 5.5.3。

第一步:在mysql的安装目录下找到my.ini,作如下修改:

[client] 

default-character-set = utf8mb4 
[mysql] 
default-character-set = utf8mb4 
[mysqld] 
character-set-client-handshake = FALSE character-set-server = utf8mb4 
collation-server = utf8mb4_unicode_ci 
init_connect='SET NAMES utf8mb4'

修改后重启Mysql。

第二步:将已经建好的表也转换成 utf8mb4

alter table TABLE_NAME convert to character set utf8mb4 collate utf8mb4_bin;

将 TABLE_NAME 替换成你的表名。然后就OK了。

网上流传的一个版本增加了一个步骤,就是以 root 身份登录 Mysql,修改环境变量,将

character_set_client,character_set_connection,character_set_database,character_set_results,character_set_server

都修改成 utf8mb4。不过我没有做这一步,也正常,所以可能是这一步是多余的。

方法2:过滤掉这些特殊的字符

<hr/>
import org.apache.commons.lang.StringUtils;public class charUtil {    /**
     * 替换四个字节的字符 '\xF0\x9F\x98\x84\xF0\x9F)的解决方案 ��
     */
    public static String removeFourChar(String content) {        byte[] conbyte = content.getBytes();        for (int i = 0; i < conbyte.length; i++) {            if ((conbyte[i] & 0xF8) == 0xF0) {                for (int j = 0; j < 4; j++) {
                    conbyte[i + j] = 0x30;// 0x30 int=48   字符=0
                }
                i += 3;
            }
        }
        content = new String(conbyte);        return content.replaceAll("0000", "");
    }    /**
      将emoji表情替换成
     * @return 过滤后的字符串
     * 过滤的方式很简单,直接使用正则表达式匹配编码范围,然后替换就行了。
     */
    public static String filterEmoji(String source) {        if (StringUtils.isNotBlank(source)) {            return source.replaceAll("[\ud800\udc00-\udbff\udfff\ud800-\udfff]", "*");
        } else {            return source;
        }
    }    public static void main(String[] arg) {        try {
            System.err.println("测试->将emoji表情替换成*");            String text = "This is a smiley \uD83C\uDFA6 face\uD860\uDD5D \uD860\uDE07 \uD860\uDEE2 \uD863\uDCCA \uD863\uDCCD \uD863\uDCD2 \uD867\uDD98 ";
            System.out.println(text);
            System.out.println(text.length());
            System.out.println(text.replaceAll("[\ud83c\udc00-\ud83c\udfff]|[\ud83d\udc00-\ud83d\udfff]|[\u2600-\u27ff]", "*"));
            System.out.println(filterEmoji(text));            //输出结果
            //This is a smiley �� face�� �� �� �� �� �� �� 
            //45
            //This is a smiley * face�� �� �� �� �� �� �� 
            //This is a smiley  face       

            System.err.println("测试->替换四个字节的字符 '\xF0\x9F\x98\x84\xF0\x9F)的解决方案 ��");            String title = "ff的范德萨分��������Llfldakf;dsk。f������������daslfjdsa;lfkjdsd'j'l'f'k'd'j'sa'l'k";
            System.out.println(removeFourChar(title));            //输出结果:ff的范德萨分Llfldakf;dsk。fdaslfjdsa;lfkjdsd'j'l'f'k'd'j'sa'l'k

        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

<br/>

前言

利用国外服务器买最最便宜的,进行nginx负载均衡转接到国内服务器,域名绑定国外的那台nginx

测试用例

1.国内服务器,根据你需求自己判断买多大

跟平时正常部署程序服务一样就行,我这里随便写一个服务,直接用服务器id可访问,请求如下

2.买一台最最便宜的国外服务器,只部署nginx

在这里插入图片描述

中国历年出生人口

年份人数解释
19461009万
19471122万
19481139万
19491275万
19501419万
19511349万
19521622万
19531637万
19542232万新中国成立 相对稳定 婴儿潮开始
19551965万
19561961万
19572138万
19581889万
19591635万
19601402万
1961949万
19622451万
19632934万
19642721万
19652679万
19662554万
19672543万
19682731万
19692690万
19702710万
19712551万
19722550万
19732447万
19742226万
19752102万
19761849万
19771783万
19781733万
19791715万
19801776万1980年中国开始实行独生子女政策
19812064万50.60后进入结婚生育期
19822230万
19832052万
19842050万
19852196万
19862374万
19872508万
19882445万
19892396万
19902374万
19912250万
19922113万
19932120万
19942098万经济不景气
19952052万
19962057万
19972028万
19981934万金融危机 水灾人口也生得少了?
19991827万
20001765万
20011696万
20021641万
20031594万2003年开始,中国每年人口出生数开始基本稳定
20041588万
20051612万
20061581万
20071591万
20081604万
20091587万
20101588万80后一代进入结婚生育期,高成本导致多数人生一个或者晚生?
20111600万
20121800万龙宝宝大增?
20131640万
20141687万
20151655万
20161786万2016年1月1日我国正式施行“全面二孩政策”
20171723万
20181523万
20191465万
20201200万
20211062万
2022 956万
2023 902万