分类 软件 下的文章

WebP-Server工具,可将JPG/PNG即时压缩为WebP格式,可以大幅度的减少图片体积,减少出口带宽,提高用户体验。目前支持的图片格式:JPEG、PNG、BMP、GIF。

WebP

WebP是由Google推出的一种全新图片文件格式,也是Telegram Stickers主力使用的文件格式,可为Web上的图像提供卓越的压缩,它是在保证原有的图像质量前提下尽可能减少图形体积的一种格式,从而使Web加载性能的提升更快。

  • WebP的有损压缩算法是基于VP8视频格式的帧内编码,并以RIFF作为容器格式。 因此,它是一个具有八位色彩深度和以1:2的比例进行色度子采样的亮度-色度模型(YCbCr 4:2:0)的基于块的转换方案。不含内容的情况下,RIFF容器要求只需20字节的开销,依然能保存额外的元数据(metadata)。
  • WebP图像的边长限制为16383像素。
WebP lossless images are 26% smaller in size compared to PNGs. WebP lossy images are 25-34% smaller than comparable JPEG images at equivalent SSIM quality index.

通过是否对图片进行压缩,我们可以分为:

  • 无压缩。不对图片数据进行压缩处理,能准确地呈现原图片;
  • 无损压缩。压缩算法对图片的所有的数据进行编码压缩,能在保证图片的质量的同时降低图片的尺寸。
  • 有损压缩。压缩算法不会对图片所有的数据进行编码压缩,而是在压缩的时候,去除了人眼无法识别的图片细节,因此有损压缩可以在同等图片质量的情况下大幅降低图片的尺寸。

简单来说,WebP图片格式的存在,让我们在Web上展示的图片体积可以有较大幅度的缩小,也就带来了加载性能的提升。

要生成一个WebP图片非常简单,只需要下载Google提供的cwebp工具,并且使用cwebp -q 70 picture_with_alpha.png -o picture_with_alpha.webp命令就可以转换了,并且转换出来的webp图片比原图会小不少。

安装

CentOS 7.9

  • 安装libvips

    webp-server从0.6.0开始不再依赖libaom.so.3,开始依赖libvips.so.42,因此必须安装libvips 8.10.0或更高版本。

    安装libwebp

    [root@ecs ~]# cd /usr/local/src
    [root@ecs src]# wget https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-1.3.2.tar.gz
    [root@ecs src]# tar -xzf libwebp-1.3.2.tar.gz
    [root@ecs src]# cd libwebp-1.3.2
    [root@ecs libwebp-1.3.2]# ./configure --prefix=/usr/local --enable-libwebpmux --enable-libwebpdemux
    [root@ecs libwebp-1.3.2]# make -j$(nproc) && make install
    [root@ecs libwebp-1.3.2]# echo "export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:\$PKG_CONFIG_PATH" >> /etc/profile
    [root@ecs libwebp-1.3.2]# source /etc/profile
    [root@ecs libwebp-1.3.2]# pkg-config --modversion libwebp
    [root@ecs libwebp-1.3.2]# pkg-config --libs libwebp
    [root@ecs libwebp-1.3.2]# echo "/usr/local/lib" > /etc/ld.so.conf.d/libwebp.conf
    [root@ecs libwebp-1.3.2]# ldconfig
    [root@ecs libwebp-1.3.2]# ldconfig -p | grep libwebp
    [root@ecs libwebp-1.3.2]# webpinfo -version
    • pkg-config在编译程序时为编译器和构建系统(make、cmake)提供已安装库的元数据(头文件路径、库路径、依赖项、版本号等)。
    • ldconfig配置动态链接器(Dynamic Linker),在运行程序时能够快速找到所需的共享库(.so)。

    安装libimagequant

    4.0之开始用Rust重写,编译前需先安装Rust工具链。因此推荐2.18.0,完全满足libvips功能要求。

    [root@ecs ~]# cd /usr/local/src
    [root@ecs src]# git clone https://github.com/ImageOptim/libimagequant.git -b 2.18.0
    [root@ecs src]# cd libimagequant
    [root@ecs libimagequant]# make static && make install

    安装niftiio

    [root@ecs ~]# cd /usr/local/src
    [root@ecs src]# tar -zxvf nifti_clib-3.0.0.tar.gz
    [root@ecs src]# cd nifti_clib-3.0.0
    [root@ecs nifti_clib-3.0.0]# yum install -y help2man
    [root@ecs nifti_clib-3.0.0]# cmake3 -DBUILD_SHARED_LIBS=ON \
    -DNIFTI_USE_PACKAGING=ON \
    -DUSE_CIFTI_CODE=ON \
    -DUSE_FSL_CODE=ON \
    -DNIFTI_BUILD_APPLICATIONS=ON \
    -DTEST_INSTALL=ON \
    -DDOWNLOAD_TEST_DATA=OFF .
    [root@ecs nifti_clib-3.0.0]# make && make install

    安装cfitsio

    [root@ecs ~]# cd /usr/local/src
    [root@ecs src]# wget http://heasarc.gsfc.nasa.gov/FTP/software/fitsio/c/cfitsio_latest.tar.gz
    [root@ecs src]# tar -zxvf cfitsio_latest.tar.gz
    [root@ecs src]# cd cfitsio-4.6.4
    [root@ecs cfitsio-4.6.4]# ./configure --prefix=/usr/local --enable-reentrant
    [root@ecs cfitsio-4.6.4]# make && make install

    安装libspng

    [root@ecs ~]# cd /usr/loca/src
    [root@ecs src]# tar -zxvf libspng-0.7.4.tar.gz
    [root@ecs src]# cd libspng-0.7.4 && mkdir build && cd build
    [root@ecs build]# meson setup --prefix /usr/local ..
    [root@ecs build]# ninja
    [root@ecs build]# ninja install

    安装PDFium

    [root@ecs ~]# cd /usr/local/src
    [root@ecs src]# wget https://github.com/bblanchon/pdfium-binaries/releases/latest/download/pdfium-linux-x64.tgz
    [root@ecs src]# tar -xvf pdfium-linux-x64.tgz -C /usr/local
    [root@ecs src]# cat /usr/local/VERSION
    MAJOR=153
    MINOR=0
    BUILD=7988
    PATCH=0
    [root@ecs src]# cat > /usr/local/lib/pkgconfig/pdfium.pc << EOF
    prefix=/usr/local
    exec_prefix=\${prefix}
    libdir=\${exec_prefix}/lib
    includedir=\${prefix}/include
    
    Name: PDFium
    Description: Google's PDF rendering engine
    Version: 153.0.7988
    Libs: -L\${libdir} -lpdfium
    Cflags: -I\${includedir}
    EOF
    • 验证是否安装成功

      [root@ecs ~]# pkg-config --modversion pdfium
      [root@ecs ~]# pkg-config --libs pdfium
      [root@ecs ~]# ldconfig -p | grep libpdfium
      [root@ecs ~]# ldd /usr/local/lib/libpdfium.so
    • 测试示例

      [root@ecs ~]# cat > pdfium_test.cpp << EOF
      #include <fpdfview.h>
      
      int main() {
          FPDF_InitLibrary();
          FPDF_DestroyLibrary();
          return 0;
      }
      EOF
      
      [root@ecs ~]# g++ pdfium_test.cpp $(pkg-config --cflags --libs pdfium) -o pdfium_test
      [root@ecs ~]# ./pdfium_test

      没有任何报错则说明pdfium已经安装成功。

    安装libvips

    [root@ecs ~]# yum install -y gcc-c++ \
    glib2-devel expat-devel \
    fftw-devel ImageMagick-devel orc-devel lcms2-devel OpenEXR-devel openslide-devel \
    poppler-glib-devel librsvg2-devel pango-devel \
    libpng-devel libtiff-devel giflib-devel libjpeg-devel libgsf-devel libexif-devel
    [root@ecs ~]# wget https://gh-proxy.org/https://github.com/libvips/libvips/releases/download/v8.10.5/vips-8.10.5.tar.gz
    [root@ecs ~]# tar -zxvf vips-8.10.5.tar.gz && cd vips-8.10.5
    [root@ecs vips-8.10.5]# ./configure --prefix=/usr/local --disable-static --enable-introspection=no \
    --with-pdfium-includes=/usr/local/include \
    --with-pdfium-libraries=/usr/local/pdfium/lib
    [root@ecs vips-8.10.5]# make && make install
    [root@ecs vips-8.10.5]# echo "/usr/local/lib" > /etc/ld.so.conf.d/vips.conf && ldconfig
    [root@ecs vips-8.10.5]# ldconfig -p | grep libvips

    注:

    • 如果使用PDFium,则必须设置--with-pdfium-includes--with-pdfium-libraries,否则即使安装了PDFium,PDF import with PDFium依旧为no。
    • pdfium优先级高于poppler-glib,一旦指定了pdfium,poppler-glib就会失效。

    示例

    • pdf转jpg

      [root@ecs ~]# vips copy input.pdf[dpi=72,page=0,n=1] output.jpg
      • dpi:控制输出图片分辨率,默认值72,数值越大,清晰度越高,文件越大。
      • page:指定转换起始页码(从0开始),不指定默认从第1页开始。
      • n:指定连续转换的页数,-1表示起始页到文档结尾所有页。输出多图时,所有页面垂直拼接成一张长图。
    • python

      import pyvips
      
      image = pyvips.Image.new_from_file('input.pdf', dpi=200, n=-1)
      image.write_to_file('output.jpg')
    • javascript

      const sharp = require('sharp');
      
      (async () => {
          sharp('input.pdf', { page: 0 })
              //设置宽度,高度自适应
              .resize(1024)
              //输出高质量jpeg
              .jpeg({ quality: 100 })
              .toFile('output.jpg');
      })();

    核心依赖库

    • glib2-devel(glib 2.x开发包)缺少则报错:configure: error: Package requirements (glib-2.0 >= 2.15 gmodule-2.0 gobject-2.0 gio-2.0) were not met
    • expat-devel(xml解析库)缺少则报错:configure: error: Could not find the Expat library

    其它依赖库(缺少不影响编译libvips,但会缺少相应的功能)

    配置项功能
    fftw-develuse fftw3 for FFT快速傅里叶变换
    ImageMagick-develMagick package
    Magick API version
    load with libMagick
    save with libMagick
    ImageMagick格式支持
    orc-develaccelerate loops with orc提升图像处理速度
    lcms2-develICC profile support with lcms色彩管理(防止图片偏色)
    niftiiofile import with niftiioNIfTI格式(核磁共振图像)支持
    libheiffile import with libheif苹果HEIC/HEIF格式支持
    OpenEXR-develfile import with OpenEXR高动态范围(HDR)图像支持
    openslide-develfile import with OpenSlide全切片(显微镜切片)病理图像支持
    matio-develfile import with matioMATLAB .mat数据支持
    PDFiumPDF import with PDFiumGoogle PDF渲染引擎(poppler-glib二选一)
    poppler-glib-develPDF import with poppler-glibpdf首页转图片
    librsvg2-develSVG import with librsvg-2.0将矢量图转位图
    cfitsiofile import with cfitsioFITS(天文望远镜图像)格式支持
    libwebpfile import/export with libwebpWebP格式导入导出支持
    pango-develtext rendering with pangoft2文本渲染(图片加文字水印)
    libspngfile import/export with libspnglibpng替代品(libpng二选一)
    libimagequantsupport 8bpp PNG quantisation8位png颜色量化
    libtiff-develfile import/export with libtifftiff格式支持
    giflib-develfile import/export with giflibgif格式支持
    libjpeg-develfile import/export with libjpegjpg格式支持
    libgsf-develimage pyramid export多分辨率切片格式支持
    libexif-develuse libexif to load/save JPEG metadata读取/保存 jpeg exif信息
  • 升级glibc

    webp-server从0.13.3开始依赖`GLIBC_2.34',必须升级glibc到2.34或更高版本。

    如果不想升级glibc,CentOS 7.9默认glibc支持的webp-server最高版本是0.13.1

  • 安装webp-server

    [root@ecs ~]# useradd -s /sbin/nologin www
    [root@ecs ~]# mkdir -p /data/webps && chown www:www /data/webps && chmod 755 /data/webps
    [root@ecs ~]# wget --no-check-certificate https://gh-proxy.org/https://github.com/webp-sh/webp_server_go/releases/download/0.13.1/webp-server-linux-amd64 -O /usr/local/bin/webp-server
    [root@ecs ~]# chmod +x /usr/local/bin/webp-server
    [root@ecs ~]# yum install -y libaom-devel
    [root@ecs ~]# webp-server -dump-config > /data/webps/config.json
    [root@ecs ~]# sed -i -e "s#127.0.0.1#0.0.0.0#" \
    -e "s#./pics#/data/wwwroot#" /data/webps/config.json
    [root@ecs ~]# webp-server --config=/data/webps/config.json

    预热模式(后台提前将/opt/pics目录内的所有图片转换成webp并缓存)

    [root@ecs ~]# webp-server --config=/data/webps/config.json -prefetch -jobs=${nproc}
    • -jobs=${nproc}控制-prefetch转换时使用的线程数,默认为CPU的内核数。
      查看方式:grep -c 'processor' /proc/cpuinfolscpu | grep "^CPU(s)"或者nproc
  • 开机自启动

    [root@ecs ~]# webp-server -dump-systemd > /lib/systemd/system/webp-server.service
    [root@ecs ~]# sed -i -e 's#WorkingDirectory=/opt/webps#WorkingDirectory=/data/webps#g' \
    -e 's#/opt/webps/webp-server#/usr/local/bin/webp-server#g' \
    -e 's#/opt/webps/config.json#/data/webps/config.json#g' \
    /lib/systemd/system/webp-server.service
    [root@ecs ~]# systemctl daemon-reload
    [root@ecs ~]# systemctl enable --now webp-server

    注:使用-dump-systemd参数生成的配置文件,webp-server的默认路径为:/opt/webps/webp-server,配置文件的默认路径:/opt/webps/config.json,需要修改为实际路径。

Docker部署

  1. 创建镜像

    [root@ecs ~]# cd /usr/local/src
    [root@ecs src]# tar -zxvf webp_server_go-0.15.1.tar.gz && cd webp_server_go-0.15.1
    [root@ecs webp_server_go-0.15.1]# cat > /tmp/trixie.tmp << 'DOCKERFILE'
    
    RUN rm -f /etc/apt/sources.list.d/*.sources /etc/apt/sources.list.d/*.list
    
    RUN cat > /etc/apt/sources.list <<EOF
    deb http://mirrors.aliyun.com/debian/ trixie main contrib non-free non-free-firmware
    deb http://mirrors.aliyun.com/debian/ trixie-updates main contrib non-free non-free-firmware
    deb http://mirrors.aliyun.com/debian-security/ trixie-security main contrib non-free non-free-firmware
    EOF
    
    ENV GOPROXY=https://mirrors.aliyun.com/goproxy/,direct/
    DOCKERFILE
    [root@ecs webp_server_go-0.15.1]# sed -i -e '/golang:1.26-trixie/r /tmp/trixie.tmp' -e '/debian:trixie-slim/r /tmp/trixie.tmp' Dockerfile
    [root@ecs webp_server_go-0.15.1]# docker build -t webp-server-go --progress=plain --no-cache .

    或者直接使用官方镜像:webpsh/webp-server-go

  2. 创建配置文件

    [root@ecs ~]# mkdir -p /data/webps
    [root@ecs ~]# cat > /data/webps/config.json << EOF
    {
        "HOST": "0.0.0.0",
        "PORT": "3333",
        "QUALITY": "80",
        "IMG_PATH": "/opt/pics",
        "EXHAUST_PATH": "./exhaust",
        "IMG_MAP": {},
        "ALLOWED_TYPES": ["jpg","png","jpeg","gif","bmp","svg","heic","nef"],
        "CONVERT_TYPES": ["webp"],
        "STRIP_METADATA": true,
        "ENABLE_EXTRA_PARAMS": true,
        "READ_BUFFER_SIZE": 4096,
        "CONCURRENCY": 262144,
        "DISABLE_KEEPALIVE": false,
        "CACHE_TTL": 259200
    }
    EOF
    • "ENABLE_EXTRA_PARAMS": true:允许图片url传参。
  3. 创建容器

    [root@ecs ~]# docker run -d \
    --restart always \
    --name webp-server \
    -p 3333:3333 \
    -v /data/webps/exhaust:/opt/exhaust \
    -v /data/webps/metadata:/opt/metadata \
    -v /data/wwwroot:/opt/pics \
    -v /data/webps/config.json:/etc/config.json:ro \
    webp-server-go

    注:docker容器不支持访问宿主的软链接,通过-v /data/webp/pics:/opt/pics,然后在/data/webp/pics中创建软件是无效的,必须使用-v /data/wwwroot/maisi:/opt/pics/maisi方式进行挂载。

  4. 测试

    • 拷贝baidu.png到宿主机/data/wwwroot/

      [root@ecs ~]# curl -I -H "Accept: image/webp" http://139.196.100.56:3333/baidu.png
    • 拷贝00248.jpg到宿主机/data/wwwroot/maisi

      [root@ecs ~]# curl -I -H "Accept: image/webp" http://139.196.100.56:3333/maisi/00248.jpg
      HTTP/1.1 200 OK
      Server: WebP Server Go
      Date: Sun, 02 Aug 2026 13:19:09 GMT
      Content-Type: image/webp
      Content-Length: 531136
      X-Compression-Rate: 0.34
      Accept-Ranges: bytes
      Last-Modified: Sun, 02 Aug 2026 13:02:04 GMT
      [root@ecs ~]# curl -I -H "Accept: image/webp" http://139.196.100.56:3333/maisi/00248.jpg?width=200
      HTTP/1.1 200 OK
      Server: WebP Server Go
      Date: Sun, 02 Aug 2026 13:18:10 GMT
      Content-Type: image/webp
      Content-Length: 2734
      X-Compression-Rate: 0.00
      Accept-Ranges: bytes
      Last-Modified: Sun, 02 Aug 2026 13:15:35 GMT

整合nginx

server {
    # CORS
    add_header Access-Control-Allow-Origin '*.maisi.com';
    add_header Access-Control-Allow-Methods 'GET,POST';
    add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';

    # HSTS(强制浏览器在后续请求中只通过https与服务器通信)
    add_header Strict-Transport-Security "max-age=15768000;includeSubDomains;preload" always;
    
    # XXS-Protection
    add_header X-XSS-Protection "1; mode=block";

    # ssl
    ssl_certificate ../cert/maisi.com.pem;
    ssl_certificate_key ../cert/maisi.com.key;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;

    location ~* \.(?:jpg|jpeg|gif|png)$ {
        # 禁止cdn缓存
        add_header Cache-Control 'private';
        proxy_pass http://127.0.0.1:3333/maisi$request_uri;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_hide_header X-Powered-By;
        proxy_set_header HOST $http_host;
        add_header Cache-Control 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';
    }

}

Docker部署

  1. 创建配置文件

    [root@ecs ~]# mkdir -p /data/redis
    [root@ecs ~]# cat >> /data/redis/redis.conf << EOF
    bind 0.0.0.0
    daemonize no
    protected-mode no
    requirepass IoujIYFehq24200S
    appendonly yes
    EOF
    • daemonize:是否以守护线程方式启动,默认no。
    • appendonly:是否持久化数据,默认no。
  2. 创建容器

    [root@ecs ~]# docker run --name=redis \
    --privileged=true \
    -p 6379:6379 \
    -v /data/redis:/etc/redis \
    -v /data/redis/data:/data \
    -d --restart=always maisi/redis:8.4.0 redis-server /etc/redis/redis.conf --appendonly yes
    • --privileged=true:容器内的root用户拥有宿主机root权限,否则容器内root用户只是外部普通用户权限;
    • --appendonly yes:开启数据持久化(如果配置文件中已配置,可忽略)
  3. 防火墙放行

    [root@ecs ~]# firewall-cmd --zone=public --add-port=6379/tcp --permanent
    [root@ecs ~]# firewall-cmd --reload

Docker部署

  1. 拉取基础镜像

    [root@ecs ~]# docker pull registry.cn-shanghai.aliyuncs.com/maisi/node:22-alpine
    [root@ecs ~]# docker tag registry.cn-shanghai.aliyuncs.com/maisi/node:22-alpine node:22-alpine
    [root@ecs ~]# docker pull registry.cn-shanghai.aliyuncs.com/maisi/golang:1.25.11-bookworm
    [root@ecs ~]# docker tag registry.cn-shanghai.aliyuncs.com/maisi/golang:1.25.11-bookworm golang:1.25.11-bookworm
  2. 构建镜像

    [root@ecs ~]# unzip tianji-master.zip
    [root@ecs ~]# cd tianji-master
    [root@ecs tianji-master]# cat > ./debian.tmp << 'EOF'
    RUN sed -i 's/deb.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list.d/debian.sources && \
        sed -i 's/security.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list.d/debian.sources && \
        apt-get update && \
        apt-get install -y --no-install-recommends git ca-certificates tzdata && \
        rm -rf /var/lib/apt/lists/*
    
    ENV GOPROXY=https://mirrors.aliyun.com/goproxy/,direct
    EOF
    [root@ecs tianji-master]# sed -i '/AS reporter/r ./debian.tmp' Dockerfile
    [root@ecs tianji-master]# sed -i '/AS base/a\RUN sed -i '\''s/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g'\'' /etc/apk/repositories' Dockerfile
    [root@ecs tianji-master]# sed -i '/pnpm@10.27.0/s#$# --registry=https://registry.npmmirror.com#g' Dockerfile
    [root@ecs tianji-master]# sed -i '/AS static/a\RUN pnpm config set registry https://registry.npmmirror.com' Dockerfile
    [root@ecs tianji-master]# sed -i '/AS app/a\RUN pnpm config set registry https://registry.npmmirror.com' Dockerfile
    [root@ecs tianji-master]# sed -i '/ENV VITE_VERSION/i\ENV VERCEL=true' Dockerfile
    [root@ecs tianji-master]# sed -i '/COPY --from=static \/app\/tianji\/geo/s/^/# /g' Dockerfile
    [root@ecs tianji-master]# docker build -t tianji .
  3. 创建容器

    [root@ecs ~]# docker run --name tianji \
    --restart=unless-stopped \
    -e DATABASE_URL=postgresql://tianji:xpzTkwEL1IcU28dF@192.168.1.3:5432/tianji_db?schema=public \
    -p 12345:12345 \
    -v /data/tianji/geo/GeoLite2-City.mmdb:/app/tianji/geo/GeoLite2-City.mmdb:rw \
    -d tianji

    管理地址:http://192.168.3.103:12345/login,初始用户名/密码:admin/admin。

安装

Docker部署

  1. 创建Dockerfile

    FROM maisi/alpine:3.22.2
    
    WORKDIR /var/opt/svn
    EXPOSE 3690
    VOLUME ["/var/opt/svn"]
    RUN echo http://mirrors.aliyun.com/alpine/v3.22/main/ > /etc/apk/repositories && \
        apk update && apk upgrade
    RUN apk add --no-cache subversion==1.14.5-r0 wget==1.25.0-r1
    HEALTHCHECK CMD netstat -ln | grep 3690 || exit 1
    CMD [ "/usr/bin/svnserve", "--daemon", "--foreground", "--root", "/var/opt/svn" ]
  2. 构建镜像并创建容器

    [root@ecs ~]# docker build -t svn-server . < Dockerfile
    [root@ecs ~]# docker run --name svn \
    --privileged=true \
    --restart=unless-stopped \
    -p 3690:3690 \
    -v /data/svn:/var/opt/svn \
    -d svn-server
  3. 防火墙放行

    [root@ecs ~]# firewall-cmd --zone=public --add-port=3690/tcp --permanent
    [root@ecs ~]# firewall-cmd --reload

配置

  1. 创建用户和组

    [root@ecs ~]# cat > /data/svn/authz << EOF
    [groups]
    maisi = alice,bob
    
    [/]
    alice = rw
    
    [maisi:/]
    @maisi = rw
    EOF
    
    [root@ecs ~]# cat > /data/svn/passwd << EOF
    [users]
    alice = 123456789
    EOF
    • [/]:所有仓库
    • [maisi:/]:仅maisi仓库
    • @maisi = rw:maisi组内所有用户拥有读写权限
  2. 创建仓库

    [root@ecs ~]# docker exec -it svn svnadmin create maisi

    每个仓库都有独立的conf/svnserve.conf配置文件,配置文件中指定密码文件(passwd)和授权文件(authz)的路径。

    可以将每个仓库的passwd和authz都指向同一个文件,这样只需要建立一套账号和授权即可。

    配置账号和授权

    [root@ecs ~]# docker exec -it svn /bin/sh -c "cd /var/opt/svn/maisi/conf/ \
    && sed -i '/# anon-access = read/a\anon-access = none' svnserve.conf \
    && sed -i '/# auth-access = write/a\auth-access = write' svnserve.conf \
    && sed -i '/# password-db = passwd/a\password-db = \/var/opt\/svn\/passwd' svnserve.conf \
    && sed -i '/# authz-db = authz/a\authz-db = \/var/opt\/svn\/authz' svnserve.conf \
    && sed -i '/# realm = /a\realm = Maisi Lab' svnserve.conf"

    当多个仓库共用同一个passwd和authz时,可以让这些仓库使用相同的realm(默认值是仓库的UUID)。当客户端检测到相同的realm后,则可以共用保存在客户端的用户名和密码进行认证。

  3. 重启服务

    [root@ecs ~]# docker restart svn

数据

  1. 备份

    [root@ecs ~]# svnadmin dump maisi > /data/svn/backup/maisi.dump
  2. 还原

    [root@ecs ~]# svnadmin load maisi < /data/svn/backup/maisi.dump

Office KMS激活

如果当前Office为零售版,先操作1-3步将零售版转为VOL版。

  1. 重置试用期激活状态,重置为30天试用期(允许重置3次)

    C:\Users\Administrator>cd %ProgramFiles%\Microsoft Office\Office16
    C:\Program Files\Microsoft Office\Office16>cscript ospp.vbs /rearm
  2. 安装KMS许可证

    C:\Program Files\Microsoft Office\Office16>cscript ospp.vbs /inslic:"..\root\Licenses16\ProPlusVL_KMS_Client-ppd.xrm-ms"
    C:\Program Files\Microsoft Office\Office16>cscript ospp.vbs /inslic:"..\root\Licenses16\ProPlusVL_KMS_Client-ul.xrm-ms"
    C:\Program Files\Microsoft Office\Office16>cscript ospp.vbs /inslic:"..\root\Licenses16\ProPlusVL_KMS_Client-ul-oob.xrm-ms"
  3. 安装KMS密钥

    C:\Program Files\Microsoft Office\Office16>cscript ospp.vbs /inpkey:XQNVK-8JYDB-WJ9W3-YJ8YR-WFG99

    卸载密钥

    C:\Program Files\Microsoft Office\Office16>cscript ospp.vbs /dstatus
    C:\Program Files\Microsoft Office\Office16>cscript ospp.vbs /unpkey:WFG99
  4. 在线激活

    C:\Program Files\Microsoft Office\Office16>cscript /nologo ospp.vbs /sethst:kms.wiseidc.com
    C:\Program Files\Microsoft Office\Office16>cscript /nologo ospp.vbs /act

Windows KMS激活

如果当前操作系统为零售版,先操作1-3步将零售版转为VOL版。

  1. 清除激活状态

    C:\Users\Administrator>cd /D "%SystemRoot%\System32"
    C:\Windows\System32>slmgr /upk
  2. 重置激活

    C:\Windows\System32>cscript slmgr.vbs /rearm
  3. 安装KMS密钥

    C:\Windows\System32>cscript slmgr.vbs /ipk W269N-WFGWX-YVC9B-4J6C9-T83GX
  4. 在线激活

    C:\Windows\System32>cscript slmgr.vbs /skms kms.wiseidc.com
    C:\Windows\System32>cscript slmgr.vbs /ato
  5. 查看过期日期

    C:\Windows\System32>cscript slmgr.vbs /xpr
    Microsoft (R) Windows Script Host Version 5.812
    版权所有(C) Microsoft Corporation。保留所有权利。
    
    Windows(R), EnterpriseS edition:
        批量激活将于 2026/12/25 11:38:08 过期
  6. 查看激活信息

    C:\Windows\System32>cscript slmgr.vbs /dlv
    Microsoft (R) Windows Script Host Version 5.812
    版权所有(C) Microsoft Corporation。保留所有权利。
    
    软件授权服务版本: 10.0.17763.9020
    
    名称: Windows(R), EnterpriseS edition
    描述: Windows(R) Operating System, VOLUME_KMSCLIENT channel
    激活 ID: 32d2fab3-e4a8-42c2-923b-4bf4fd13e6ee
    应用程序 ID: 55c92734-d682-4d71-983e-d6ec3f16059f
    扩展 PID: 03612-04250-000-000002-03-2052-17763.0000-0212026
    产品密钥通道: Volume:GVLK
    安装 ID: 286926084471821607432456549385465164969976541201630300527855602
    部分产品密钥: J462D
    许可证状态: 已授权
    批量激活过期: 217072 分钟(151 天)
    剩余 Windows 重置计数: 1001
    剩余 SKU 重置计数: 1001
    信任时间: 2026/7/27 17:46:06
    已配置的激活类型: 全部
    
    最新激活信息:
    密钥管理服务客户端信息
            客户端计算机 ID (CMID):7071b918-1339-4bfa-a42f-d85e98a44057
            已注册的 KMS 计算机名称: kms.o88.co:1688
            KMS 计算机 IP 地址: 47.101.38.23
            KMS 计算机扩展的 PID: 05426-00206-562-489683-03-1043-9200.0000-2732025
            激活时间间隔: 120 分钟
            续订间隔: 10080 分钟
            已启用 KMS 主机缓存

GVLK(Generic Volume License Key)

Windows VOL/LTSC

桌面操作系统KMS密钥
Windows 7 ProfessionalFJ82H-XT6CR-J8D7P-XQJJ2-GPDD4
Windows 7 Professional NMRPKT-YTG23-K7D7T-X2JMM-QY7MG
Windows 7 Professional EW82YF-2Q76Y-63HXB-FGJG9-GF7QX
Windows 7 Enterprise33PXH-7Y6KF-2VJC9-XBBR8-HVTHH
Windows 7 Enterprise NYDRBP-3D83W-TY26F-D46B2-XCKRJ
Windows 7 Enterprise EC29WB-22CC8-VJ326-GHFJW-H9DH4
Windows 11 Professional
Windows 10 Professional
W269N-WFGWX-YVC9B-4J6C9-T83GX
Windows 11 Professional N
Windows 10 Professional N
MH37W-N47XK-V7XM9-C7227-GCQG9
Windows 11 Professional Workstation
Windows 10 Professional Workstation
NRG8B-VKK3Q-CXVCJ-9G2XF-6Q84J
Windows 10 RTM Professional Workstation N
Windows 11 Professional Workstation N
Windows 10 Professional Workstation N
9FNHH-K3HBT-3W4TD-6383H-6XYWF
Windows 10 RTM Professional Education
Windows 11 Professional Education
Windows 10 Professional Education
6TP4R-GNPTD-KYYHQ-7B7DP-J447Y
Windows 10 RTM Professional Education N
Windows 11 Professional Education N
Windows 10 Professional Education N
YVWGF-BXNMC-HTQYQ-CPQ99-66QFC
Windows 10 RTM Education
Windows 11 Education
Windows 10 Education
NW6C2-QMPVW-D7KKK-3GKT6-VCFB2
Windows 10 RTM Education N
Windows 11 Education N
Windows 10 Education N
2WH4N-8QGBV-H22JP-CT43Q-MDWWJ
Windows 10 RTM Enterprise
Windows 11 Enterprise
Windows 10 Enterprise
NPPR9-FWDCX-D2C8J-H872K-2YT43
Windows 10 RTM Enterprise N
Windows 11 Enterprise N
Windows 10 Enterprise N
DPH2V-TTNVB-4X9Q3-TJR4H-KHJW4
Windows 10 RTM Enterprise G
Windows 11 Enterprise G
Windows 10 Enterprise G
YYVX9-NTFWV-6MDM3-9PT4T-4M68B
Windows 10 RTM Enterprise G N
Windows 11 Enterprise G N
Windows 10 Enterprise G N
44RPN-FTY23-9VTTB-MP9BX-T84FV
Windows 10 Enterprise S
Windows 11 Enterprise LTSC 2024
Windows 10 Enterprise LTSC 2021
Windows 10 Enterprise LTSC 2019
M7XTQ-FN8P6-TTKYV-9D4CC-J462D
Windows 10 Enterprise S N
Windows 11 Enterprise N LTSC 2024
Windows 10 Enterprise N LTSC 2021
Windows 10 Enterprise N LTSC 2019
92NFX-8DJQP-P6BBQ-THF9C-7CG2H
Windows 10 RTM IoT Enterprise S
Windows IoT Enterprise LTSC 2024
Windows IoT Enterprise LTSC 2021
KBN8V-HFGQ4-MGXVD-347P6-PDQGT
Windows 10 RTM Enterprise S
Windows 10 Enterprise LTSB 2016
DCPHK-NFMTC-H88MJ-PFHPY-QJ4BJ
Windows 10 RTM Enterprise S N
Windows 10 Enterprise N LTSB 2016
QFFDN-GRT3P-VKWWX-X7T3R-8B639
Windows 10 RTM Enterprise S
Windows 10 Enterprise LTSB 2015
WNMTR-4C88C-JK8YV-HQ7T2-76DF9
Windows 10 RTM Enterprise S N
Windows 10 Enterprise N LTSB 2015
2F77B-TNFGY-69QQF-B8YKP-D69TJ

Windows Server GVLK

服务器操作系统KMS密钥
Windows Server 2016 RTM ServerStandard
Windows Server 2016 Standard
WC2BQ-8NRM3-FDDYY-2BFGV-KHKQY
Windows Server 2019 RTM ServerStandard
Windows Server 2019 Standard
N69G4-B89J2-4G8F4-WWYCC-J464C
Windows Server 2021 RTM ServerStandard
Windows Server 2021 Standard
VDYBN-27WPP-V4HQT-9VMD4-VMK7H
Windows Server 2025 RTM ServerStandard
Windows Server 2025 Standard
TVRH6-WHNXV-R9WG3-9XRFY-MY832
Windows Server 2012 R2 RTM ServerStandard
Windows Server 2012 R2 Standard
D2N9P-3P6X9-2R39C-7RTCD-MDVJX
Windows Server 2012 RTM ServerStandard
Windows Server 2012 Standard
XC9B7-NBPP2-83J2H-RHMBY-92BT4
Windows Server 2008 R2 StandardYC6KT-GKW9T-YTKYR-T4X34-R7VHC
Windows Server 2008 R2 Enterprise489J6-VHDMP-X63PK-3K798-CPX3Y
WWindows Server 2008 StandardTM24T-X9RMF-VWXK6-X8JC9-BFGM2
Windows Server 2008 EnterpriseYQGMW-MPWTJ-34KDK-48M3W-X4Q6V