Author: Zhe Yuan

  • MyDay!!!!! 发布

    最后更新:2026年4月2日

    English Version

    MyDay!!!!! 是一款简洁、注重隐私的日常生活助手应用,集任务管理、个人财务记录、体重追踪和私密生活记录于一体。支持 Windows、Android、iOS 和 macOS 平台。

    功能特色

    ✅ 待办事项管理

    支持日常、例行和工作三种任务类型,可创建子任务,并为每条任务自定义 Emoji 和图标。让你的每一天都井井有条,专注目标。

    💰 个人财务

    支持多账户管理,包括储蓄、信用、充值和理财账户。支持多币种及实时汇率换算,轻松记录支出、收入和转账,自定义分类,并通过图表分析掌握财务状况。

    ⚖️ 体重追踪

    按日期和时间记录每日体重,界面简洁直观,让你随时掌握自己的体重变化趋势。

    💞 私密模块

    详细记录私密活动、伴侣信息及相关使用情况。该模块默认关闭,可随时在设置中开启。

    ☁️ WebDAV 云同步

    通过 WebDAV 将数据同步至你自己的云存储(如 Nextcloud)。支持逐条记录的三路合并冲突解决,并可选择自动或手动同步模式。

    💾 备份与恢复

    一键备份全部数据,包括记录和图片。支持设置自动备份计划和自定义保留策略。数据以 ZIP 格式导入导出,方便在设备间迁移。

    📊 CSV 导入 / 导出

    支持财务、私密和体重模块的 CSV 格式数据导入导出,方便与其他应用互通或进行自定义数据分析。

    🌐 多语言支持

    支持英语、日语、简体中文和繁体中文。

    支持平台

    Get it on GitHub
    • Windows(提供安装包)
    • Android(提供 APK 和 AAB)
    • iOS(提供侧载 IPA)
    • macOS(提供 DMG)

    关于

    MyDay!!!!! 是一款由个人独立开发的免费开源应用,无广告、无内购。你的所有数据完全存储在本地设备上,由你自己掌控。本项目遵循 GNU 通用公共许可证 v3.0 发布。

    隐私政策

    感谢使用 MyDay!!!!!。我们非常重视你的隐私。本隐私政策说明应用如何处理你的数据。

    数据收集

    MyDay!!!!! 不收集、不上传、不共享任何个人��息。应用内不含任何分析统计、广告追踪或数据收集功能。

    数据存储

    你在应用中输入的所有数据——包括任务、财务记录、体重日志、私密记录、图片和设置——均存储在本地设备上。你可以随时更改存储路径(仅限桌面版)。

    网络访问

    MyDay!!!!! 仅在以下情况下访问互联网:

    • 实时汇率:财务模块在获取当前货币汇率时,会向公开汇率 API 发送请求。
    • WebDAV 同步:若你启用了 WebDAV 云同步功能,应用会将数据发送至你自行配置的 WebDAV 服务器,不会发送至任何其他服务器。

    除此之外,应用不进行任何网络通信。

    数据备份

    应用提供本地备份功能。备份文件存储在你的设备上,包含所有数据和图片,备份文件的存储和管理完全由你掌控。

    政策变更

    本隐私政策可能不时更新。更新版本将在应用内或相关发布渠道上公布。

  • MyDay!!!!! Release

    Last Updated: Apr 2, 2026

    中文版本

    MyDay!!!!! is a clean and privacy-first daily life companion app that brings together task management, personal finance tracking, weight logging, and intimate life recording — all in one place. Available on Windows, Android, iOS, and macOS.

    Features

    ✅ Todo Management

    Organize your tasks across three types — Daily, Routine, and Work. Supports subtasks, with individual emoji and icon customization per task. Keep your day structured and your goals in focus.

    💰 Personal Finance

    Track all your finances with multi-account support — including fund, credit, recharge, and financial accounts. Handle multiple currencies with live exchange rates. Record expenses, income, and transfers. Create custom categories and view your financial data through charts and analysis.

    ⚖️ Weight Tracking

    Log your daily weight with precise date and time stamps. Monitor your progress over time with a simple and clean interface.

    💞 Intimacy Module

    Record activities, partners, and toy usage with detailed logging. This module is disabled by default and can be enabled in Settings at any time.

    ☁️ WebDAV Cloud Sync

    Sync your data to your own cloud storage (such as Nextcloud) via WebDAV. Features per-record three-way merge for conflict resolution and supports both automatic and manual sync.

    💾 Backup & Restore

    Back up all your data — including records and images — with one tap. Set up automatic backups with custom retention policies. Import and export data as ZIP files for easy migration between devices.

    📊 CSV Import / Export

    Export or import per-module CSV files for finance, intimacy, and weight data. Easily move your data between apps or create custom analysis spreadsheets.

    🌐 Multiple Languages

    Available in English, Japanese, Simplified Chinese, and Traditional Chinese.

    Platforms

    Get it on GitHub
    • Windows (installer available)
    • Android (APK & AAB available)
    • iOS (Sideload IPA available)
    • macOS (DMG available)

    About

    MyDay!!!!! is a free, open-source app developed independently, with no ads or in-app purchases. Your data is stored entirely on your device and under your control. Released under the GNU General Public License v3.0.

    Privacy Policy

    Thank you for using MyDay!!!!!. We take your privacy seriously. This privacy policy explains how the app handles your data.

    Data Collection

    MyDay!!!!! does not collect, upload, or share any personal information. The app contains no analytics, advertising trackers, or data collection of any kind.

    Data Storage

    All data you enter in the app — tasks, finance records, weight logs, intimacy records, images, and settings — is stored locally on your device. You may change the storage path at any time (Desktop Version Only).

    Network Access

    MyDay!!!!! accesses the internet only in the following situations:

    • Live exchange rates: When the finance module fetches current currency exchange rates from a public exchange rate API.
    • WebDAV sync: If you enable WebDAV cloud sync, the app sends your data to a WebDAV server that you configure yourself. The app does not send data to any other server.

    No other network communication takes place.

    Data Backup

    The app provides a local backup feature. Backup files are stored on your device and include all your data and images. The storage and management of backup files is entirely under your control.

    Changes to This Policy

    This privacy policy may be updated from time to time. Updated versions will be published within the app or on the relevant distribution channels.

  • MyDevice!!!!! 发布

    最后更新:2026年3月27日

    English Version

    MyDevice!!!!! 是一款简洁、注重隐私的设备清单应用,帮助您追踪所有设备的详细硬件规格、网络管理和数据组织。支持 Windows 和 Android。

    功能

    📱 设备清单

    按类别整理您所有设备的完整清单——台式机、笔记本、手机、平板、耳机、手表、路由器、游戏机、云服务器、开发板等。每条记录支持 CPU、GPU、内存、存储、屏幕、电池、操作系统、购入日期和发布日期等详细规格。可添加自定义 Emoji 图标或上传设备照片作为封面。

    🔍 CPU 与 GPU 芯片搜索

    添加或编辑设备时,可同时从 TechPowerUp、AMD 和 Intel 多个数据库搜索 CPU 和 GPU 规格,自动获取型号、架构、核心数、频率和缓存信息,省去手动输入。内置 130+ 个 CPU 和 GPU 模板(Intel、AMD、Apple、Qualcomm、联发科等),支持一键自动填充。

    🌐 网络管理

    管理多个网络——LAN、Tailscale、ZeroTier、EasyTier、WireGuard 及自定义类型。为每个网络配置子网、网关和 DNS。为设备分配 IP 地址、主机名、DHCP 或静态模式以及出口节点标记。支持按设备类别分组和出口节点置顶。

    📦 数据集

    将设备存储驱动器整理为命名数据集,清晰展示每台设备的存储占用情况,支持自定义排序。

    🗺️ 地图视图

    在交互式地图上标注设备位置,直观展示所有设备的地理分布——无论是家里、办公室还是分布在各地的数据中心。点击标记即可查看设备详情。

    ☁️ WebDAV 云同步

    通过 WebDAV 将数据同步到您自己的云存储(如 Nextcloud),在多台设备之间保持数据一致,支持自动同步和手动同步。

    💾 备份与还原

    一键备份所有数据,包括设备信息和封面图片。可设置定时自动备份。支持 ZIP 格式导入导出,方便在设备之间迁移数据。

    🌐 多语言支持

    支持英语、日语、简体中文和繁体中文。

    截图

    设备列表
    设备详情
    芯片搜索
    网络管理

    平台

    在 GitHub 上获取
    • Windows(提供安装包)
    • Android(提供 APK)

    关于

    MyDevice!!!!! 是一款免费开源的独立开发应用,无广告,无内购。您的设备数据完全存储在本地,由您自己掌控。本项目基于 GNU 通用公共许可证 v3.0 发布。

    隐私政策

    感谢您使用 MyDevice!!!!!。我们非常重视您的隐私。本隐私政策说明了应用如何处理您的数据。

    数据收集

    MyDevice!!!!! 不收集、上传或共享任何个人信息。应用不包含任何分析工具、广告追踪器或数据收集功能。

    数据存储

    您在应用中输入的所有数据——设备信息、规格参数、封面图片和设置——均存储在您的设备本地。您可以随时更改存储路径(仅桌面版)。

    网络访问

    MyDevice!!!!! 仅在以下情况下访问互联网:

    • CPU/GPU 芯片搜索:当您主动搜索芯片规格时,应用会向 TechPowerUp(techpowerup.com)、AMD(amd.com)和 Intel(intel.com)发送请求,以获取公开的硬件信息,如型号、架构、核心数和频率。
    • 地图瓦片:当您使用地图视图设置或显示设备位置时,应用会从 OpenStreetMap(tile.openstreetmap.org)加载地图瓦片图片。
    • WebDAV 同步:如果您启用了 WebDAV 云同步,应用会将您的数据发送到您自行配置的 WebDAV 服务器。应用不会向其他任何服务器发送数据。

    除此之外不进行任何网络通信。

    第三方服务

    应用使用以下第三方服务:

    • TechPowerUp(techpowerup.com)—— CPU/GPU 规格数据库
    • AMD(amd.com)—— CPU/GPU 规格数据库
    • Intel(intel.com)—— CPU/GPU 规格数据库
    • OpenStreetMap(openstreetmap.org)—— 地图瓦片提供商

    这些服务有各自的隐私政策,建议您查阅。MyDevice!!!!! 仅获取公开的硬件信息和地图瓦片,不会向这些服务发送任何个人数据。

    数据备份

    应用提供本地备份功能。备份文件存储在您的设备上,包含您的所有设备数据和封面图片。备份文件的存储和管理完全由您掌控。

    政策变更

    本隐私政策可能会不时更新。更新版本将在应用内或相关分发渠道发布。

  • MyDevice!!!!! Release

    Last Updated: Mar 27, 2026

    中文版本

    MyDevice!!!!! is a clean and privacy-first device inventory app that helps you track all your devices with detailed hardware specs, network management, and data organization. Available on Windows and Android.

    Features

    📱 Device Inventory

    Keep a complete inventory of all your devices organized by category — Desktop, Laptop, Phone, Tablet, Headphone, Watch, Router, Game Console, VPS, Dev Board, and more. Each entry supports detailed specs including CPU, GPU, RAM, storage, screen, battery, OS, purchase date, and release date. Add custom emoji icons or upload a device photo as its avatar.

    🔍 CPU & GPU Chip Search

    When adding or editing a device, search for CPU and GPU specs across multiple databases — TechPowerUp, AMD, and Intel — all at once. Automatically fetches model names, architectures, core counts, frequencies, and cache, saving you from manual entry. Includes 130+ built-in CPU and GPU templates (Intel, AMD, Apple, Qualcomm, MediaTek, and more) for instant auto-fill.

    🌐 Network Management

    Manage multiple networks — LAN, Tailscale, ZeroTier, EasyTier, WireGuard, and custom types. For each network, configure subnet, gateway, and DNS. Assign devices with IP address, hostname, DHCP or static mode, and exit node flags. Group by device category and pin exit nodes to the top.

    📦 Data Sets

    Organize your device storage drives into named data sets. Get a clear per-device storage breakdown. Sort data sets and their contents to suit your workflow.

    🗺️ Map View

    Pin device locations on an interactive map. See all your devices geographically — whether they’re at home, in the office, or distributed across data centers. Tap any marker to view the device details.

    ☁️ WebDAV Cloud Sync

    Sync your data to your own cloud storage (such as Nextcloud) via WebDAV. Keep your device records consistent across multiple computers with automatic or manual sync.

    💾 Backup & Restore

    Back up all your data — including device info and cover images — with one tap. Set up automatic backups on a schedule. Import and export data as ZIP files for easy migration between devices.

    🌐 Multiple Languages

    Available in English, Japanese, Simplified Chinese, and Traditional Chinese.

    Screenshots

    Device List
    Device Detail
    Chip Search
    Network Management

    Platforms

    Get it on GitHub
    • Windows (installer available)
    • Android (APK available)

    About

    MyDevice!!!!! is a free, open-source app developed independently, with no ads or in-app purchases. Your device data is stored entirely on your device and under your control. Released under the GNU General Public License v3.0.

    Privacy Policy

    Thank you for using MyDevice!!!!!. We take your privacy seriously. This privacy policy explains how the app handles your data.

    Data Collection

    MyDevice!!!!! does not collect, upload, or share any personal information. The app contains no analytics, advertising trackers, or data collection of any kind.

    Data Storage

    All data you enter in the app — device information, specs, cover images, and settings — is stored locally on your device. You may change this to a custom path at any time (Desktop Version Only).

    Network Access

    MyDevice!!!!! accesses the internet only in the following situations:

    • CPU/GPU chip search: When you actively search for chip specifications, the app sends requests to TechPowerUp (techpowerup.com), AMD (amd.com), and Intel (intel.com) to retrieve publicly available hardware information such as model names, architectures, core counts, and frequencies.
    • Map tiles: When you use the map view to set or display device locations, the app loads map tile images from OpenStreetMap (tile.openstreetmap.org).
    • WebDAV sync: If you enable WebDAV cloud sync, the app sends your data to a WebDAV server that you configure yourself. The app does not send data to any other server.

    No other network communication takes place.

    Third-Party Services

    The app uses the following third-party services:

    • TechPowerUp (techpowerup.com) — CPU/GPU specification database
    • AMD (amd.com) — CPU/GPU specification database
    • Intel (intel.com) — CPU/GPU specification database
    • OpenStreetMap (openstreetmap.org) — Map tile provider

    These services have their own privacy policies, which we encourage you to review. MyDevice!!!!! only retrieves publicly available hardware information and map tiles, and does not send any of your personal data to these services.

    Data Backup

    The app provides a local backup feature. Backup files are stored on your device and include all your device data and cover images. The storage and management of backup files is entirely under your control.

    Changes to This Policy

    This privacy policy may be updated from time to time. Updated versions will be published within the app or on the relevant distribution channels.

  • MyAnime!!!!! 发布

    最后更新日期: 2026 年 3 月 27 日

    English Version

    MyAnime!!!!! 是一款简洁好用的追番管理应用,帮助你轻松记录在看的番剧、追踪每周更新、管理观看进度。支持 Windows 和 Android 平台。

    主要功能

    📅 日历视图

    首页以日历形式展示每日播出的番剧,一眼看清本周有哪些新集更新。当天播出的番剧和未看的集数一目了然。

    📋 番剧管理

    按季度浏览你添加的所有番剧,支持搜索和筛选。每部番剧显示观看进度条,追番状态清晰可见。

    🔍 多来源搜索

    添加番剧时,可一键搜索 bangumi.tv、MyAnimeList、acgsecrets.hk、filmarks.com 等多个数据源,自动获取番剧信息、封面图片和集数等内容,省去手动输入的麻烦。

    ✅ 集数追踪

    支持逐集标记观看状态(未看 / 已看 / 本周跳过)。支持深夜档 25:00 格式,所有播出时间以日本时间 (JST) 为基准。

    ☁️ WebDAV 云同步

    通过 WebDAV 协议将数据同步到你自己的云存储(如 Nextcloud),在多个设备之间保持追番记录一致。支持自动同步和手动同步。

    💾 备份与恢复

    支持一键备份所有数据(包括番剧信息和封面图片),也可以设置自动备份。备份文件可选择加密保护。

    🌐 多语言支持

    支持简体中文、繁体中文、英文和日文四种界面语言。搜索时自动进行简繁中文转换,确保搜索结果更全面。

    截图

    Home Calendar
    Anime Management
    Anime Detail
    Search & Add

    支持平台

    Get it on GitHub
    • Windows (提供安装包)
    • Android (提供 APK)

    关于

    MyAnime!!!!! 是一款个人开发的免费应用,不含任何广告或内购。你的追番数据完全存储在本地,由你自己掌控。本项目基于 GNU 通用公共许可证 v3.0 发布。

    隐私政策

    感谢你使用 MyAnime!!!!!。我们非常重视你的隐私。本隐私政策旨在说明应用如何处理你的数据。

    数据收集

    MyAnime!!!!! 不会收集、上传或分享你的任何个人信息。应用不包含任何用户分析、广告追踪或数据采集功能。

    数据存储

    你在应用中输入的所有数据(番剧信息、观看记录、封面图片等)均存储在你的设备本地。你可以自行更改存储路径。(仅限桌面端)

    网络访问

    MyAnime!!!!! 仅在以下情况下访问网络:

    • 搜索番剧信息:当你主动搜索番剧时,应用会向 bangumi.tv、MyAnimeList (Jikan API)、acgsecrets.hk、anime1.me 和 filmarks.com 发送搜索请求,以获取番剧标题、简介、封面图片和集数等公开信息。
    • WebDAV 同步:如果你启用了 WebDAV 云同步功能,应用会将数据发送至你自行配置的 WebDAV 服务器。应用不会将数据发送至任何其他服务器。

    除此之外,应用不会进行任何网络通信。

    第三方服务

    应用在搜索番剧时使用以下第三方数据源的公开接口:

    • bangumi.tv
    • MyAnimeList (via Jikan API)
    • acgsecrets.hk
    • anime1.me
    • filmarks.com

    这些服务各自有其隐私政策,建议你在需要时查阅。MyAnime!!!!! 仅获取公开的番剧信息,不会向这些服务发送你的个人数据。

    数据备份

    应用提供本地备份功能,备份文件保存在你的设备上。备份内容包括你的所有番剧数据和封面图片。你可以选择对备份文件加密。备份文件的存储和管理完全由你自己控制。

    隐私政策变更

    本隐私政策可能会不定期更新。更新后的政策将在应用内或相关发布渠道公布。

  • MyAnime!!!!! Release

    Last Updated: Mar 27, 2026

    中文版本

    MyAnime!!!!! is a clean and easy-to-use anime tracking app that helps you manage your watchlist, keep up with weekly episodes, and track your viewing progress. Available on Windows and Android.

    Features

    📅 Calendar View

    The home screen displays a calendar showing which anime air on each day. Easily see today’s releases and any unwatched episodes at a glance.

    📋 Anime Management

    Browse all your anime organized by season, with search and filtering. Each entry shows a progress bar so you can quickly see how far along you are.

    🔍 Multi-Source Search

    When adding anime, search across multiple databases — bangumi.tv, MyAnimeList, acgsecrets.hk, and filmarks.com — all at once. Automatically fetches titles, cover art, episode counts, and summaries so you don’t have to enter everything manually.

    ✅ Episode Tracking

    Mark each episode as unwatched, watched, or skipped. Supports the late-night 25:00 time format commonly used in anime scheduling, with all times based on Japan Standard Time (JST).

    ☁️ WebDAV Cloud Sync

    Sync your data to your own cloud storage (such as Nextcloud) via WebDAV. Keep your anime records consistent across multiple devices with automatic or manual sync.

    💾 Backup & Restore

    Back up all your data — including anime info and cover images — with one tap. Set up automatic backups on a schedule. Backups can be encrypted for extra protection.

    🌐 Multiple Languages

    Available in English, Japanese, Simplified Chinese, and Traditional Chinese. Automatic Simplified–Traditional Chinese conversion ensures comprehensive search results.

    Screenshots

    Home Calendar
    Anime Management
    Anime Detail
    Search & Add

    Platforms

    Get it on GitHub
    • Windows (installer available)
    • Android (APK available)

    About

    MyAnime!!!!! is a free, independently developed app with no ads or in-app purchases. Your anime data is stored entirely on your device and under your control.

    Privacy Policy

    Thank you for using MyAnime!!!!!. We take your privacy seriously. This privacy policy explains how the app handles your data. Released under the GNU General Public License v3.0.

    Data Collection

    MyAnime!!!!! does not collect, upload, or share any personal information. The app contains no analytics, advertising trackers, or data collection of any kind.

    Data Storage

    All data you enter in the app — anime information, watch history, cover images, and settings — is stored locally on your device. You may change this to a custom path at any time (Desktop Version Only).

    Network Access

    MyAnime!!!!! accesses the internet only in the following situations:

    • Searching for anime information: When you actively search for anime, the app sends requests to bangumi.tv, MyAnimeList (Jikan API), acgsecrets.hk, anime1.me and filmarks.com to retrieve publicly available anime information such as titles, summaries, cover art, and episode counts.
    • WebDAV sync: If you enable WebDAV cloud sync, the app sends your data to a WebDAV server that you configure yourself. The app does not send data to any other server.

    No other network communication takes place.

    Third-Party Services

    The app uses the following third-party data sources for anime search:

    • bangumi.tv
    • MyAnimeList (via Jikan API)
    • acgsecrets.hk
    • anime1.me
    • filmarks.com

    These services have their own privacy policies, which we encourage you to review. MyAnime!!!!! only retrieves publicly available anime information and does not send any of your personal data to these services.

    Data Backup

    The app provides a local backup feature. Backup files are stored on your device and include all your anime data and cover images. You may choose to encrypt your backups. The storage and management of backup files is entirely under your control.

    Changes to This Policy

    This privacy policy may be updated from time to time. Updated versions will be published within the app or on the relevant distribution channels.

  • Enabling Intel GVT-g (vGPU) on Proxmox VE

    Last Updated: Jan 14, 2026

    This guide details how to enable Intel GVT-g (Graphics Virtualization Technology), which allows you to split a single physical Intel iGPU into multiple virtual GPUs to be passed through to Virtual Machines (VMs).

    This setup is tested on an Intel NUC 8 (Bean Canyon) but applies generally to supported Intel architectures.

    0. Supported Hardware

    Important: GVT-g is only supported on specific older generations of Intel processors. Newer processors (11th Gen+) use SR-IOV, which requires a completely different setup.

    Supported Architectures for GVT-g:

    • 5th Gen: Broadwell
    • 6th Gen: Skylake
    • 7th Gen: Kaby Lake
    • 8th Gen: Coffee Lake (e.g., NUC8i5BEH)
    • 9th Gen: Coffee Lake Refresh
    • 10th Gen: Comet Lake (Support varies by motherboard/implementation)

    Note: Intel 11th Gen (Tiger Lake/Rocket Lake) and 12th Gen+ (Alder Lake) do not support GVT-g. They utilize SR-IOV.


    1. BIOS/UEFI Settings

    Before configuring the OS, ensure the following are enabled in your BIOS:

    • VT-d (Virtualization Technology for Directed I/O)
    • VT-x (Virtualization Technology)
    • Internal Graphics (IGD) must be set to Enabled (Primary).
    • Aperture Size: Recommended 256MB or higher (if adjustable).

    2. Edit GRUB Bootloader

    We need to enable the IOMMU and the GVT-g driver at the kernel level.

    1. Open the GRUB configuration file:

      nano /etc/default/grub
    2. Find the line starting with GRUB_CMDLINE_LINUX_DEFAULT and modify it to include the following parameters:

      Your Configuration:

      GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt i915.enable_gvt=1"

      (Note: You can also add pcie_acs_override=downstream,multifunction. This is usually for breaking apart IOMMU groups. You can add it if you have issues assigning PCI devices.)

      • intel_iommu=on: Enables IOMMU.
      • iommu=pt: Improves performance by using pass-through mode for the host.
      • i915.enable_gvt=1: Explicitly enables the GVT-g feature.
    3. Save and exit (Ctrl+O, Enter, Ctrl+X).

    4. Update GRUB to apply changes:

      update-grub

    3. Load Kernel Modules

    You must ensure the VFIO and KVMGT modules are loaded at boot.

    1. Open the modules configuration file:

      nano /etc/modules
    2. Add the following lines to the file:

      vfio vfio_iommu_type1 vfio_pci vfio_virqfd kvmgt
      • kvmgt is the specific module required for Intel GVT-g.
    3. Save and exit (Ctrl+O, Enter, Ctrl+X).

    4. Update the initramfs to ensure these modules are available during boot:

      update-initramfs -u -k all

    4. Reboot

    Restart your Proxmox server to apply the kernel parameters and load the modules.

    reboot

    5. Verification

    After the system reboots, verify that GVT-g is active.

    1. Check Dmesg:

      Run the following command to see if IOMMU and GVT are enabled:

      dmesg | grep -e DMAR -e IOMMU dmesg | grep "gvt"
    2. Check MDEV Support:

      The most definitive test is checking if the system generated the Mediated Device (MDEV) types folder for your GPU (usually at PCI address 0000:00:02.0).

      ls /sys/bus/pci/devices/0000:00:02.0/mdev_supported_types/

      Expected Output:

      You should see folders like:

      If you see these folders, GVT-g is successfully enabled.

      • i915-GVTg_V5_4
      • i915-GVTg_V5_8

    6. Utilizing GVT-g in a VM

    1. Go to the Proxmox Web GUI.
    2. Select your VM -> Hardware -> Add -> PCI Device.
    3. Select the Raw Device: 0000:00:02.0 (Intel Corporation …).
    4. Important: Do not check “All Functions”.
    5. Expand the MDev Type dropdown.
    6. Select the desired profile (e.g., i915-GVTg_V5_4).
      • V5_4 usually allocates more video RAM to the VM (High performance).
      • V5_8 allocates less video RAM (Allows for more VMs to run simultaneously).
    7. Check PCI-Express.
    8. Start the VM.
  • Generating Your Own Self-Signed CA and HTTPS Certificates with OpenSSL

    Last Updated: May 17, 2025

    In this post, I’ll guide you through the process of creating your own Certificate Authority (CA) and using it to sign server certificates for HTTPS. This is particularly useful for development environments, internal services, or any situation where you need SSL/TLS encryption without purchasing certificates from a commercial CA. We’ll be using OpenSSL, a powerful and versatile command-line tool.

    Prerequisites:

    • OpenSSL installed on your system.

    Let’s dive into the steps.

    Step 1: Generate the CA Private Key (SelfSignedCA.key)

    The first step is to create a private key for your self-signed CA. This key is the foundation of your CA’s trustworthiness; keep it secure and private. If this key is compromised, any certificates signed by it could be forged.

    openssl genpkey -algorithm RSA -out SelfSignedCA.key -aes256 -pkeyopt rsa_keygen_bits:4096

    Let’s break down this command:

    • openssl genpkey: Command to generate a private key.
    • -algorithm RSA: Specifies the RSA algorithm for the key.
    • -out SelfSignedCA.key: The output filename for your CA private key.
    • -aes256: Encrypts the outputted private key with AES 256-bit encryption. You will be prompted for a passphrase to protect this key.
    • -pkeyopt rsa_keygen_bits:4096: Sets the key length to 4096 bits, which is generally considered strong.

    Step 2: Prepare the CA Configuration File (openssl_ca.cnf)

    Before generating the CA root certificate, you need to create an OpenSSL configuration file. This file defines crucial properties and extensions for your CA certificate. Create a file named openssl_ca.cnf in your working directory with the following content:

    # openssl_ca.cnf
    [ req ]
    distinguished_name = req_distinguished_name
    x509_extensions = v3_ca # The extensions to add to the self-signed cert
    
    [ req_distinguished_name ]
    # No specific entries needed here if providing subject via -subj command line argument
    # You could define default values or prompts here if not using -subj
    
    [ v3_ca ]
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid:always,issuer
    basicConstraints = critical, CA:TRUE
    keyUsage = critical, digitalSignature, cRLSign, keyCertSign

    Explanation of openssl_ca.cnf:

    • [ req ]: Basic request settings.
      • x509_extensions = v3_ca: Specifies the section (v3_ca) containing extensions for the self-signed CA certificate.
    • [ v3_ca ]: Defines the X.509 v3 extensions for the CA certificate.
      • subjectKeyIdentifier = hash: An identifier for the public key of this certificate.
      • authorityKeyIdentifier = keyid:always,issuer: An identifier for the public key of the certificate that signed this one. For a self-signed root, this refers to itself.
      • basicConstraints = critical, CA:TRUE: Crucial for a CA certificate. It marks the certificate as a CA, meaning it can be used to sign other certificates. critical means this extension must be understood by the application.
      • keyUsage = critical, digitalSignature, cRLSign, keyCertSign: Specifies the allowed uses for the CA’s key (signing other certificates, signing Certificate Revocation Lists).

    Step 3: Generate the CA Root Certificate (SelfSignedCA.pem)

    With the CA private key (SelfSignedCA.key) and the openssl_ca.cnf configuration file prepared, you can now generate the CA’s root certificate. This certificate is what you will install in browsers or systems to make them trust the certificates signed by your CA.

    openssl req -x509 -new -nodes -key SelfSignedCA.key -sha256 -days 7300 \
        -out SelfSignedCA.pem \
        -subj "/C=XX/ST=YourState/L=YourCity/O=Your Organization/OU=Your Unit/CN=Your Custom Root CA" \
        -config openssl_ca.cnf

    Command explanation:

    • openssl req -x509: Command for X.509 certificate signing request (CSR) management and certificate generation. The -x509 flag means we are creating a self-signed certificate.
    • -new: Indicates a new certificate request.
    • -nodes: If your CA private key (SelfSignedCA.key) is encrypted, this option allows you to proceed without encrypting the certificate itself (you’ll be prompted for the private key’s passphrase).
    • -key SelfSignedCA.key: Specifies the private key to use for signing the certificate.
    • -sha256: Uses the SHA-256 hash algorithm for the signature.
    • -days 7300: Sets the validity period of the certificate (7300 days is approximately 20 years).
    • -out SelfSignedCA.pem: The output filename for your CA root certificate.
    • -subj "/C=XX/ST=YourState/L=YourCity/O=Your Organization/OU=Your Unit/CN=Your Custom Root CA": Sets the subject information for the CA certificate.
      • C: Country Code (e.g., US)
      • ST: State or Province
      • L: Locality (City)
      • O: Organization Name
      • OU: Organizational Unit (e.g., IT Department)
      • CN: Common Name (The name of your CA, e.g., “My Company Internal Root CA”)
    • -config openssl_ca.cnf: Specifies the configuration file created in Step 2.

    Step 4: Generate a Server Private Key (server.key)

    Now, let’s create a private key for the server/application for which you want to enable HTTPS. This key is distinct from the CA’s private key.

    openssl genpkey -algorithm RSA -out server.key -pkeyopt rsa_keygen_bits:2048

    Command explanation:

    • openssl genpkey: Same command as before to generate a private key.
    • -algorithm RSA: Using RSA algorithm.
    • -out server.key: The output filename for the server’s private key. You might want to name this more descriptively, like your-service.com.key.
    • -pkeyopt rsa_keygen_bits:2048: A 2048-bit key is generally sufficient for server keys.

    Note: For better organization, you might place server-specific files in a subdirectory, e.g., mkdir my-service && openssl genpkey -algorithm RSA -out my-service/server.key ...

    Step 5: Prepare the Server Configuration File (openssl_server.cnf)

    Before generating the server’s Certificate Signing Request (CSR), you need another OpenSSL configuration file. This file will define extensions for the CSR and the final server certificate, such as Subject Alternative Names (SANs). Create a file named openssl_server.cnf in your working directory with the following content. Remember to customize the [alt_names] section for your specific server.

    # openssl_server.cnf
    [ req ]
    distinguished_name = req_distinguished_name
    req_extensions = v3_req # Extensions for the CSR
    
    [ req_distinguished_name ]
    # No specific entries needed here if providing subject via -subj command line argument
    
    [ v3_req ]
    basicConstraints = CA:FALSE
    keyUsage = digitalSignature, keyEncipherment
    extendedKeyUsage = serverAuth
    subjectAltName = @alt_names # Crucial: Used by modern browsers to validate hostnames
    
    [ alt_names ]
    DNS.1 = your.domain.com       # Your server's primary domain name (should match CN)
    DNS.2 = www.your.domain.com   # Optional: Another DNS name
    DNS.3 = *.your.internal.lan # Optional: Wildcard domain for internal use
    IP.1 = 192.168.1.10           # Optional: Server's IP address, if accessed directly via IP
    # You can have more DNS.x and IP.x entries as needed.
    # Replace the above DNS and IP values with your actual server details.

    Explanation of openssl_server.cnf:

    • [ req ]:
      • req_extensions = v3_req: Specifies the section (v3_req) containing extensions to be included in the Certificate Signing Request and subsequently in the certificate.
    • [ v3_req ]: Defines X.509 v3 extensions for the server certificate.
      • basicConstraints = CA:FALSE: Specifies that this certificate is not a CA and cannot be used to sign other certificates.
      • keyUsage = digitalSignature, keyEncipherment: Defines how the certificate’s public key can be used (e.g., for digital signatures and key encryption).
      • extendedKeyUsage = serverAuth: Indicates the key can be used for server authentication (i.e., for HTTPS).
      • subjectAltName = @alt_names: Extremely important. This directive points to another section (alt_names) that lists all Subject Alternative Names. Modern browsers and applications rely on SANs rather than just the Common Name (CN) for validating hostnames.
    • [ alt_names ]:
      • Customize this section carefully.
      • DNS.1 = your.domain.com: Replace your.domain.com with the actual domain name of your server. This should usually match the CN.
      • DNS.2 = www.your.domain.com: Add any other DNS names your server uses.
      • DNS.3 = *.your.internal.lan: Example of a wildcard for an internal domain.
      • IP.1 = 192.168.1.10: Replace with your server’s actual IP address if needed. Include IP addresses if the server will be accessed directly via IP.
      • You can add more DNS.x and IP.x entries as required.

    Step 6: Generate a Server Certificate Signing Request (server.csr)

    With the server private key (server.key) and openssl_server.cnf ready, create a Certificate Signing Request (CSR) for the server. The CSR contains information about the server, including its public key, and will be sent to your CA for signing.

    openssl req -new -key server.key -out server.csr \
        -subj "/C=XX/ST=YourState/L=YourCity/O=Your Organization/CN=your.domain.com" \
        -config openssl_server.cnf

    Command explanation:

    • openssl req -new: Indicates a new CSR.
    • -key server.key: Specifies the server’s private key generated in Step 4.
    • -out server.csr: The output filename for the CSR.
    • -subj "/C=XX/ST=YourState/L=YourCity/O=Your Organization/CN=your.domain.com": Sets the subject information for the server certificate.
      • The CN (Common Name) is very important: it must match the primary domain name specified as DNS.1 in your openssl_server.cnf [alt_names] section.
    • -config openssl_server.cnf: Specifies the server-specific OpenSSL configuration file created in Step 5.

    Step 7: Sign the Server Certificate using Your CA (server.crt)

    Finally, use your CA’s private key (SelfSignedCA.key) and root certificate (SelfSignedCA.pem) to sign the server’s CSR (server.csr), thereby creating the server’s SSL/TLS certificate. This step also uses the openssl_server.cnf file for applying the necessary extensions.

    openssl x509 -req -in server.csr \
        -CA SelfSignedCA.pem -CAkey SelfSignedCA.key -CAcreateserial \
        -out server.crt -days 3650 -sha256 \
        -extfile openssl_server.cnf -extensions v3_req

    Command explanation:

    • openssl x509 -req: Command for X.509 certificate data management. The -req flag indicates that we are processing a CSR.
    • -in server.csr: Specifies the input CSR file from Step 6.
    • -CA SelfSignedCA.pem: Specifies the CA’s root certificate from Step 3.
    • -CAkey SelfSignedCA.key: Specifies the CA’s private key from Step 1. You will be prompted for the passphrase of this key if it’s encrypted.
    • -CAcreateserial: Creates and manages a serial number file (e.g., SelfSignedCA.srl). This file is necessary for the CA to keep track of issued certificates and ensure each has a unique serial number. If the file doesn’t exist, it will be created.
    • -out server.crt: The output filename for the signed server certificate.
    • -days 3650: Sets the validity period of the server certificate (e.g., 10 years). This should typically be shorter than or equal to the CA’s validity.
    • -sha256: Uses SHA-256 for the certificate signature.
    • -extfile openssl_server.cnf: Points to the OpenSSL configuration file (created in Step 5) containing certificate extensions for the server certificate.
    • -extensions v3_req: Specifies the section (v3_req) in the openssl_server.cnf configuration file that contains the X.509 v3 extensions to add to the certificate. This is where SANs, key usage, etc., are defined.

    Using Your Certificates

    1. Server Configuration: Configure your web server (e.g., Apache, Nginx) or application to use the generated server.crt (your server’s certificate) and server.key (your server’s private key) files for HTTPS.
    2. Client Trust: For clients (browsers, other applications) to trust your new server certificate without warnings, they must trust your CA. You will need to import the SelfSignedCA.pem (your CA’s root certificate) into the trust store of any system or browser that needs to connect to your server. The steps for this vary depending on the operating system and browser.

    You now have the foundation to create and manage your own certificates for internal or development use! Remember to keep your CA private key (SelfSignedCA.key) extremely secure.

  • How to Self-Host Nextcloud with Docker Compose on Ubuntu

    Last Updated: May 17, 2025

    In this post, I’ll show you how to use Docker and its Compose plugin to host your own Nextcloud service. We’ll begin with a clean Ubuntu server environment.

    Installing Docker using the Official Script

    First, ensure that curl is installed on your server.

    sudo apt update
    sudo apt install curl

    Next, we’ll install Docker using the official installation script.

    curl -fsSL https://get.docker.com -o get-docker.sh
    sh get-docker.sh

    To manage Docker as a non-root user (without needing sudo), add your current user to the docker group

    # sudo groupadd docker
    # it should be done by the script
    
    sudo usermod -aG docker $USER
    newgrp docker

    Install Nextcloud

    First, create a directory to store your Nextcloud data.

    mkdir nextcloud
    cd nextcloud

    Next, create a docker-compose.yml file. Populate it with the following configuration:

    services:
      nextcloud-database:
        image: mariadb
        container_name: nextcloud-database
        restart: always
        volumes:
          - ./database:/var/lib/mysql
        environment:
          - MYSQL_ROOT_PASSWORD=<YOUR_PASSWORD_HERE>
          - MYSQL_PASSWORD=<YOUR_PASSWORD_HERE>
          - MYSQL_DATABASE=nextcloud
          - MYSQL_USER=nextcloud
    
      nextcloud-server:
        image: nextcloud
        container_name: nextcloud-server
        restart: always
        ports:
          - <CHOOSE_A_PORT>:80
        links:
          - nextcloud-database
        volumes:
          - ./server:/var/www/html
        environment:
          - MYSQL_PASSWORD=<YOUR_PASSWORD_HERE>
          - MYSQL_DATABASE=nextcloud
          - MYSQL_USER=nextcloud
          - MYSQL_HOST=nextcloud-database

    You need to replace <YOUR_PASSWORD_HERE> with your own strong, unique password, and change <CHOOSE_A_PORT> to the external port on which you want your Nextcloud service to be accessible.

    Finally, run the following command to start your Nextcloud service in detached mode:

    docker compose up -d

    Configuring the Service

    First, open your web browser and navigate to http://<YOUR_SERVER_IP>:<THE_PORT_YOU_CONFIGURED> (replacing <YOUR_SERVER_IP> with your server’s IP address and <THE_PORT_YOU_CONFIGURED> with the port you set in the docker-compose.yml file). Follow the on-screen instructions to set up your administrator account.

    Next, create a script to handle Nextcloud’s background jobs using cron. The content of the script should be:

    #! /bin/bash
    sudo docker exec --user www-data nextcloud-server php -f /var/www/html/cron.php

    Make the script executable using chmod (replace <YOUR_SCRIPT_NAME>.sh with your actual script filename):

    chmod +x <YOUR_SCRIPT_NAME>.sh

    Finally, edit your user’s crontab to run this script every 5 minutes (ensure you use the correct path to your script):

    crontab -e
    # Add this line
    */5 * * * * <PATH_TO_SCRIPT>/<YOUR_SCRIPT>.sh

    (Optional) If you are routing traffic to Nextcloud through a reverse proxy (which might be your own HTTP server forwarding requests), you can edit the server/config/config.php file. Adding the following trusted_proxies configuration helps Nextcloud correctly process client information. Adjust the IP ranges if necessary to include your proxy server:

    'trusted_proxies' => 
    array (
      0 => '10.0.0.0/8',
      1 => '100.64.0.0/10',
      2 => '127.0.0.0/8',
      3 => '172.16.0.0/12',
      4 => '192.168.0.0/16',
    ),

  • Hello world!

    Welcome to Zhe Yuan’s Blog! Here, I’ll share technical posts on self-hosting services, P2P networks, and proxy techniques. Alongside these technical topics, I’ll also document my life, thoughts, research, and experiences from my PhD journey at The Ohio State University.