2024年4月

今天在部署一个测试环境的时候发现mysql结构同步时函数操作失败,看了一下问题:

you *might* want to use the less safe log_bin_trust_function_creators variab


这时候修改一下配置的 log_bin_trust_function_creators 即可,我直接在终端执行:

SET GLOBAL log_bin_trust_function_creators = 1;

后发现创建函数正常了。

雪花Id脚本

CREATE FUNCTION `SnowId`() RETURNS bigint(20)

BEGIN
     
    DECLARE b_current_time BIGINT;
    DECLARE b_time_tick BIGINT;
    DECLARE i_work_id INT;
    DECLARE i_work_id_big_length INT;
    DECLARE i_seq_big_length INT;
    DECLARE f_random FLOAT;
     
    DECLARE b_res BIGINT;
     
    SET i_work_id = 1;
    SET i_work_id_big_length = 4;
    SET i_seq_big_length = 8;
    SET b_current_time = (REPLACE(UNIX_TIMESTAMP(CURRENT_TIMESTAMP(3)),'.','')) + 0;
    SET b_time_tick = b_current_time - 1582136402000;
    SET f_random = RAND();
     
    SET b_res = b_time_tick  POWER(2, i_work_id_big_length + i_seq_big_length) + i_work_id  POWER(2, i_seq_big_length) + (5 + round((POWER(2, i_seq_big_length)-1) * f_random, 0));
     
    RETURN b_res;
END

<br/>

Racknerd

Racknerdopen in new window:廉价美国 VPS,支持支付宝付款,多个机房可选,经测试,新的 Los Angeles DC02 机房 IP 可解锁 ChatGPT。

EasyVM

EasyVMopen in new window:黑五活动,1 核 2G / 2 核 4G / 4 核 8G 分别年付 $15/$24/$45,Dellas / New York 机房可选,性价比较高。

CloudCone

CloudConeopen in new window 在黑五/圣诞节等节日都会有优惠。


本文介绍一些我经常使用的自托管服务,主要偏向于较为实用或非常有趣的开源项目。其中大部分都非常轻量,服务器配置 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

在这里插入图片描述