分类 工作&技术 下的文章

OVH VPS-x系列对别的商家绝对是降维打击。然后新加坡这机器总是卖断货,放货一天然后断货一周甚至更久。
上周本来入了一个想自用,结果被人高价给收去了。我是贪财之人,只要有溢价,我就忍不住把机器卖了。。。
好吧,现在就只能继续蹲了。让AI写了个小工具来监控一下。我唯一做的有价值的事,只是告诉AI需要监视的API链接。
代码是GO的,运行方法就是 ./checkstock sgp 这样了。只是提供思路了,如果需要,你可以让AI把它改成任何语言以及形式等。

package main

import (
        "encoding/json"
        "fmt"
        "io"
        "net/http"
        "net/url"
        "os"
        "strings"
        "time"
)

const (
        telegramToken  = "Telegram机器人token"
        telegramChatID = "Telegram发送通知的会话ID"
        apiURL         = "https://api.ovh.com/1.0/vps/order/rule/datacenter?ovhSubsidiary=IE&os=Ubuntu+25.04&planCode=vps-2025-model1"
)

type Data struct {
        Datacenters []struct {
                Datacenter    string `json:"datacenter"`
                Status        string `json:"status"`
                LinuxStatus   string `json:"linuxStatus"`
                WindowsStatus string `json:"windowsStatus"`
        } `json:"datacenters"`
}

func isAvailable(s string) bool {
        return s == "available" || s == "out-of-stock-preorder-allowed"
}

func sendTelegram(msg string) {
        endpoint := fmt.Sprintf("https://api.telegram.org/bot%s/sendMessage", telegramToken)
        data := url.Values{}
        data.Set("chat_id", telegramChatID)
        data.Set("text", msg)
        http.PostForm(endpoint, data)
}

func check(target string) (bool, error) {
        resp, err := http.Get(apiURL)
        if err != nil {
                return false, err
        }
        defer resp.Body.Close()

        body, err := io.ReadAll(resp.Body)
        if err != nil {
                return false, err
        }

        var data Data
        if err := json.Unmarshal(body, &data); err != nil {
                return false, err
        }

        fmt.Printf("[%s] 当前各数据中心状态:\n", time.Now().Format("2006-01-02 15:04:05"))
        for _, d := range data.Datacenters {
                fmt.Printf("  %s: status=%s, linux=%s, windows=%s\n",
                        d.Datacenter, d.Status, d.LinuxStatus, d.WindowsStatus)
        }

        for _, d := range data.Datacenters {
                if strings.EqualFold(d.Datacenter, target) {
                        return isAvailable(d.Status) && isAvailable(d.LinuxStatus), nil
                }
        }
        fmt.Printf("%s 不存在\n", target)
        return false, nil
}

func main() {
        if len(os.Args) < 2 {
                fmt.Println("Usage: checkstock <datacenter_code>")
                os.Exit(1)
        }
        target := strings.ToUpper(strings.TrimSpace(os.Args[1]))

        startMsg := fmt.Sprintf("监控启动:正在监控 %s 库存状态", target)
        fmt.Println(startMsg)
        sendTelegram(startMsg)

        for {
                ok, err := check(target)
                if err != nil {
                        fmt.Println("Error:", err)
                } else if ok {
                        msg := fmt.Sprintf("🚀 %s 有货(含预购)!", target)
                        fmt.Println(msg)
                        sendTelegram(msg)
                        os.Exit(0)
                }
                fmt.Printf("[%s] 无货,等待60秒后重试...\n----\n", time.Now().Format("2006-01-02 15:04:05"))
                time.Sleep(60 * time.Second)
        }
}

运行示例:

[2025-10-09 01:54:20] 当前各数据中心状态:
  GRA: status=available, linux=available, windows=available
  DE: status=available, linux=available, windows=available
  BHS: status=available, linux=available, windows=available
  SBG: status=out-of-stock-preorder-allowed, linux=out-of-stock-preorder-allowed, windows=out-of-stock-preorder-allowed
  WAW: status=out-of-stock-preorder-allowed, linux=out-of-stock-preorder-allowed, windows=available
  SGP: status=out-of-stock, linux=out-of-stock, windows=out-of-stock
  UK: status=out-of-stock, linux=out-of-stock, windows=out-of-stock
[2025-10-09 01:54:20] 无货,等待60秒后重试...

国庆无聊,做了一个小测试。
测试符合预期也是我想要证明的结果,同样也很扎心。结论就是:我所有的需求不过就是一台1C1G的服务器而已。我以后不需再买新的服务器了。。。
测试内容就是把我的所有的东西全扔在了netcup的1o机(1C1G30G)上,包含docker,mysql,redis,nginx,npm,hy2,哪吒探针,还有我自己写的东西等。
服务器1G内存是显然不够的,不过swap跑起来,系统感觉不到太明显的卡顿。现在这个博客就在上面,挺流畅的。

mem.jpg

我有个小工具,是来监视ovh的ks产品线变化的。没错,你猜对了,我就是想检测le系列的上线消息,一旦有了,马上准备api上去抢跑。
这代码正常运行几个月了,今天突然发现不能正常获得价格了,所有价格都报告0。ovh的api和数据结构我也忘得差不多了,不想去研究代码和json结构,直接扔给了cursor。
我就告诉cursor,KS-B的价格应该是9.9,结果变0了! 没有其它的prompt了。
cursor去帮我拉回来了api数据瞅了瞅,然后就找到了问题并完美修正了错误。完全自动的过程。
我也恍然大悟了,我以前的代码是提取到的安装费,安装费基本就是一个月月费,所以,我代码运行“正常”。然而,ovh近期取消了安装费,现在全线安装费是0,所以,我代码获得的“价格”也就全0了。

cursor1.png
cursor2.png

OVH这一年以来是时不时降维打击一下友商,这不,新的VPS产品线来了,4C8G75G 400M只要$5.29,这价哪里找。
以前有Netcup号称高性价比,不过Netcup现在越来越不给力了,我以前发过一个IO图,烂得一塌糊涂,现在据说这数据已经是常态。而且,Netcup的4C8G价格是5.75欧元,OVH才4.49欧元了。当然Netcup的硬盘大这个必须承认。不过建站的话,75G通常真够了。
CCS 99刀6700K的机器当然性能好过VPS了。不过,单盘放数据总是不放心的,然后限制了20T的流量,多少有点不爽是吧,而且超流量不是停机或者限速而是按流量计费,破产的可能理论上都有。虽然我不用(我其实一个月只用100G左右),但我不能没有,也经不起惊吓。
现在我的我的各种玩意都扔到了OVH VPS-1了,就图一个省心吧。
照例,看看YABS:

# ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #
#              Yet-Another-Bench-Script              #
#                     v2025-04-20                    #
# https://github.com/masonr/yet-another-bench-script #
# ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #

Sat Aug 30 01:50:35 AM +08 2025

Basic System Information:
---------------------------------
Uptime     : 0 days, 1 hours, 41 minutes
Processor  : Intel Core Processor (Haswell, no TSX)
CPU cores  : 4 @ 2399.996 MHz
AES-NI     : ✔ Enabled
VM-x/AMD-V : ✔ Enabled
RAM        : 7.6 GiB
Swap       : 0.0 KiB
Disk       : 73.3 GiB
Distro     : Debian GNU/Linux 12 (bookworm)
Kernel     : 6.1.0-35-cloud-amd64
VM Type    : KVM
IPv4/IPv6  : ✔ Online / ✔ Online

IPv6 Network Information:
---------------------------------
ISP        : OVH SAS
ASN        : AS16276 OVH SAS
Host       : OVH US LLC
Location   : Hillsboro, Oregon (OR)
Country    : United States

fio Disk Speed Tests (Mixed R/W 50/50) (Partition /dev/sda1):
---------------------------------
Block Size | 4k            (IOPS) | 64k           (IOPS)
  ------   | ---            ----  | ----           ---- 
Read       | 80.08 MB/s   (20.0k) | 1.35 GB/s    (21.1k)
Write      | 80.29 MB/s   (20.0k) | 1.36 GB/s    (21.2k)
Total      | 160.37 MB/s  (40.0k) | 2.71 GB/s    (42.4k)
           |                      |                     
Block Size | 512k          (IOPS) | 1m            (IOPS)
  ------   | ---            ----  | ----           ---- 
Read       | 2.22 GB/s     (4.3k) | 2.73 GB/s     (2.6k)
Write      | 2.33 GB/s     (4.5k) | 2.91 GB/s     (2.8k)
Total      | 4.55 GB/s     (8.9k) | 5.65 GB/s     (5.5k)

Geekbench 6 Benchmark Test:
---------------------------------
Test            | Value                         
                |                               
Single Core     | 1054                          
Multi Core      | 3288                          
Full Test       | https://browser.geekbench.com/v6/cpu/13559206

YABS completed in 8 min 8 sec

顺便自夸一下,我现在弄全站docker(compose)真的方便,转移一下服务器就是5分钟的事。docker目录打个包scp到新服务器上,然后解压,然后一个个docker compose up -d ,再改一下dns结束。快得很。