podman 部署 frp 和 caddy

系统级目录布局 应用配置放在 /opt;Quadlet 单元放在 /etc/containers/systemd。 /opt/podman/ ├─ frp/ │ └─ frps.toml └─ caddy/ └─ Caddyfile /etc/containers/systemd/ ├─ frps.container └─ caddy.container frps 配置 /opt/podman/frp/frps.toml bindPort = 7000 auth.method = "token" auth.token = "REPLACE_WITH_STRONG_TOKEN" webServer.addr = "0.0.0.0" webServer.port = 7500 webServer.user = "admin" webServer.password = "REPLACE_WITH_STRONG_PASSWORD" Caddy 配置 /opt/podman/caddy/Caddyfile vps.wang1zhen.com:7500 { reverse_proxy http://127.0.0.1:7750 } :80 { root * /usr/share/caddy file_server } :443 { root * /usr/share/caddy file_server tls internal } frps Quadlet /etc/containers/systemd/frps.container [Unit] Description=frps [Container] Image=docker.io/snowdreamtech/frps:alpine ContainerName=frps PublishPort=7000:7000/tcp PublishPort=127.0.0.1:7750:7500/tcp Volume=/opt/podman/frp/frps.toml:/etc/frp/frps.toml:ro [Service] Restart=always [Install] WantedBy=multi-user.target Caddy Quadlet /etc/containers/systemd/caddy.container ...

October 28, 2025 · wang1zhen

系统熵生成随机密钥 token

openssl rand -base64 32

October 28, 2025 · wang1zhen

kdenlive amd 加速渲染

系统准备 sudo pacman -S kdenlive ffmpeg libva-utils libva-mesa-driver mesa-vdpau libvdpau-va-gl amdgpu_top vainfo | grep -E "H264|HEVC|AV1" sudo cat /sys/class/drm/renderD128/device/uevent | grep PCI_SLOT_NAME Kdenlive 自定义预设 H.264 固定质量 f=mp4 vcodec=h264_vaapi vaapi_device=/dev/dri/renderD128 rc=constqp qp=22 g=240 bf=2 acodec=aac ab=192k channels=2 movflags=+faststart HEVC(H.265)版本 f=mp4 vcodec=hevc_vaapi vaapi_device=/dev/dri/renderD128 rc=constqp qp=22 g=240 bf=2 acodec=aac ab=192k channels=2 movflags=+faststart 参数说明 参数 作用 vaapi_device=/dev/dri/renderD128 指定 RX 7700 XT rc=constqp 固定量化模式 qp=22 控制画质,数值越小越清晰 g=240 GOP 长度,约 4 秒 bf=2 启用双向预测帧,提升压缩效率 acodec=aac ab=192k channels=2 音频配置 movflags=+faststart 优化 MP4 播放头 GPU 使用率监控 amdgpu_top # 或简化方式 watch -n 1 grep "VCN Encode" /sys/kernel/debug/dri/*/amdgpu_pm_info 判断标准 ...

October 25, 2025 · wang1zhen

LMDE on zfs 在 zfs 上安装 LMDE

第一部分:准备安装介质 下载LMDE Live镜像 从 Linux Mint 官网获取 LMDE 最新 ISO(例如 LMDE 7 Virginia 基于 Debian 13/trixie)。 制作启动U盘 可使用 balenaEtcher、Rufus 或 `dd` 写入 U 盘。 第二部分:启动并配置网络环境 启动到Live环境 从 U 盘启动,进入 LMDE Live 桌面。 配置网络连接 使用 NetworkManager 图形界面或 `nmcli` 连接网络。 设置系统时间 sudo timedatectl set-ntp true timedatectl status 启用SSH(可选) sudo apt update && sudo apt install -y openssh-server sudo systemctl enable --now ssh 第三部分:磁盘分区 安装必要工具 sudo apt update sudo apt install -y gdisk dosfstools parted arch-install-scripts 识别目标磁盘 lsblk -o NAME,SIZE,TYPE,MOUNTPOINT 设置磁盘变量 # 使用 by-id 更稳健,以下为示例占位,请替换为实际 by-id 设备 DISK1=/dev/disk/by-id/nvme-EXAMPLE_DEVICE_ID echo "DISK1: $DISK1" 创建GPT分区表 # 清空并新建分区:EFI(1G) + SWAP(16G) + ZFS(余下) sudo sgdisk --zap-all "$DISK1" sudo sgdisk -n 1:1M:+1G -t 1:EF00 "$DISK1" # EFI sudo sgdisk -n 2:0:+16G -t 2:8200 "$DISK1" # SWAP sudo sgdisk -n 3:0:0 -t 3:BF00 "$DISK1" # ZFS sudo sgdisk -p "$DISK1" 格式化EFI和交换分区 sudo mkfs.fat -F32 ${DISK1}-part1 sudo mkswap ${DISK1}-part2 sudo swapon ${DISK1}-part2 查看磁盘ID ls -lh /dev/disk/by-id/ | grep -E "nvme|ssd|ata" 第四部分:安装ZFS支持 添加ZFS仓库(可选) trixie 默认仓库已有 ZFS;若需更高版本,可添加 backports: echo "deb http://deb.debian.org/debian trixie-backports main contrib non-free-firmware non-free" | sudo tee -a /etc/apt/sources.list sudo apt update 安装ZFS包 sudo apt install -y zfs-dkms zfsutils-linux sudo modprobe zfs 第五部分:ZFS配置 创建ZFS存储池 # 变量 ZFS_PART=${DISK1}-part3 POOL=rpool sudo zpool create -f \ -o ashift=12 \ -o autotrim=on \ -O compression=zstd \ -O atime=off \ -O xattr=sa \ -O acltype=posixacl \ -O mountpoint=none \ "$POOL" "$ZFS_PART" 创建ZFS数据集 sudo zfs create -o mountpoint=none $POOL/ROOT sudo zfs create -o mountpoint=/ -o canmount=noauto $POOL/ROOT/lmde sudo zfs create -o mountpoint=/home $POOL/home sudo zfs create -o mountpoint=/var $POOL/var sudo zfs create -o mountpoint=/var/log $POOL/var/log sudo zfs create -o mountpoint=/var/cache $POOL/var/cache 验证数据集创建 zpool status zfs list 设置ZFS缓存文件 sudo zpool set cachefile=/etc/zfs/zpool.cache $POOL 重新导入ZFS池 sudo zpool export $POOL sudo zpool import -R /mnt $POOL 验证挂载 sudo zfs mount $POOL/ROOT/lmde sudo mkdir -p /mnt/{boot,boot/efi,home,var,var/log,var/cache} sudo mount ${DISK1}-part1 /mnt/boot/efi zfs list 第六部分:安装LMDE系统 挂载EFI分区作为/boot sudo mount ${DISK1}-part1 /mnt/boot/efi 安装基础系统 sudo apt install -y debootstrap sudo debootstrap --arch=amd64 trixie /mnt http://deb.debian.org/debian 配置系统挂载点 使用 ZFS 自挂载,无需在 fstab 中为根写入条目。 第七部分:系统配置 进入chroot环境 sudo mount -t proc /proc /mnt/proc sudo mount --rbind /sys /mnt/sys sudo mount --rbind /dev /mnt/dev sudo arch-chroot /mnt 配置基本系统信息 echo "lmde-zfs" > /etc/hostname printf "127.0.0.1\tlocalhost\n127.0.1.1\tlmde-zfs\n" > /etc/hosts echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen && locale-gen ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime || true 配置包管理器 cat > /etc/apt/sources.list << 'EOF' deb http://deb.debian.org/debian trixie main contrib non-free-firmware non-free deb http://security.debian.org/debian-security trixie-security main contrib non-free-firmware non-free deb http://deb.debian.org/debian trixie-updates main contrib non-free-firmware non-free EOF apt update 安装必要软件包 apt install -y linux-image-amd64 systemd-sysv zfs-initramfs zfsutils-linux \ grub-efi-amd64 shim-signed sudo vim less network-manager 安装桌面环境(可选) 如需 Mint 桌面,可在后续添加 LMDE 仓库与 keyring 后安装 `mint-meta-cinnamon`。 配置ZFS服务 systemctl enable zfs-import-cache.service systemctl enable zfs-mount.service systemctl enable zfs-zed.service 配置initramfs update-initramfs -u -k all 配置GRUB sed -i 's|^GRUB_CMDLINE_LINUX=.*|GRUB_CMDLINE_LINUX="root=ZFS=rpool/ROOT/lmde"|g' /etc/default/grub update-grub grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=LMDE --recheck 设置root密码 echo "root:changeme" | chpasswd 创建普通用户 user_new="YOUR_USERNAME" adduser "$user_new" usermod -aG sudo "$user_new" 创建用户缓存和容器数据集 zfs create -o mountpoint=/home/${user_new}/.cache rpool/cache-${user_new} zfs create -o mountpoint=/home/${user_new}/.local/share/containers rpool/containers-${user_new} 重新挂载数据集 exit # 退出 chroot zfs mount -a arch-chroot /mnt 设置用户目录权限 chown 1000:1000 "/home/${user_new}/.cache" \ "/home/${user_new}/.local/share/containers" chmod 755 "/home/${user_new}/.cache" "/home/${user_new}/.local/share/containers" 配置SMB共享 apt install -y samba mkdir -p /share chown 1000:1000 /share && chmod 700 /share cat > /etc/samba/smb.conf << 'EOF' [global] workgroup = WORKGROUP security = user map to guest = never server string = LMDE ZFS Server [share] path = /share guest ok = no read only = no valid users = YOUR_USERNAME comment = Private ZFS Share create mask = 0660 directory mask = 0770 EOF smbpasswd -a ${user_new} testparm -s systemctl enable smbd systemctl disable nmbd || true 启用基本服务 systemctl enable NetworkManager systemctl enable systemd-resolved || true systemctl enable ssh || true 第八部分:ZFS定期维护配置 配置ZFS定期维护服务 # zpool trim 定制单元与定时器(与 Debian 同步) cat > /etc/systemd/system/zfs-trim@.service << 'EOF' [Unit] Description=zpool trim on %i Documentation=man:zpool-trim(8) Requires=zfs.target After=zfs.target ConditionACPower=true ConditionPathIsDirectory=/sys/module/zfs [Service] Nice=19 IOSchedulingClass=idle KillSignal=SIGINT ExecStart=/bin/sh -c '\ if /usr/sbin/zpool status %i | grep "trimming"; then\ exec /usr/sbin/zpool wait -t trim %i;\ else exec /usr/sbin/zpool trim -w %i; fi' ExecStop=-/bin/sh -c '/usr/sbin/zpool trim -s %i 2>/dev/null || true' [Install] WantedBy=multi-user.target EOF cat > /etc/systemd/system/zfs-trim@.timer << 'EOF' [Unit] Description=Monthly zpool trim on %i [Timer] OnCalendar=monthly AccuracySec=1h Persistent=true [Install] WantedBy=multi-user.target EOF systemctl enable zfs-scrub-weekly@rpool.timer systemctl enable zfs-trim@rpool.timer 第九部分:完成安装 退出chroot并清理 exit umount /mnt/boot || true zfs umount -a zpool export rpool 重启系统 reboot 第十部分:首次启动后配置 验证系统状态 sudo zpool status sudo zfs list df -h mount | grep zfs systemctl status zfs.target systemctl status NetworkManager 启动ZFS定期维护服务 sudo systemctl start zfs-scrub-weekly@rpool.timer sudo systemctl start zfs-trim@rpool.timer systemctl status zfs-scrub-weekly@rpool.timer systemctl status zfs-trim@rpool.timer systemctl list-timers | grep zfs 验证SMB共享 sudo systemctl status smbd sudo testparm -s smbclient -L localhost -U ${USER} ls -la /share SMB用户管理 sudo pdbedit -L sudo pdbedit -L -v -u ${USER} sudo smbpasswd -a new_username sudo smbpasswd ${USER} sudo smbpasswd -d ${USER} sudo smbpasswd -e ${USER} sudo smbpasswd -x ${USER} sudo smbstatus 系统更新 sudo apt update && sudo apt upgrade -y 安装 znapzend 自动快照系统 sudo apt install -y znapzend 配置 znapzend 自动快照 # 保留=>间隔:1d=>1h, 7d=>1d, 4w=>1w(无需递归) sudo znapzendzetup create --tsformat='znapzend-%Y-%m-%d-%H%M%S' SRC '1d=>1h,7d=>1d,4w=>1w' rpool/ROOT/lmde sudo znapzendzetup create --tsformat='znapzend-%Y-%m-%d-%H%M%S' SRC '1d=>1h,7d=>1d,4w=>1w' rpool/home sudo systemctl enable znapzend sudo systemctl start znapzend sudo systemctl kill -s HUP znapzend || true sudo znapzendzetup list 第十一部分:创建APT快照管理系统 创建快照管理脚本 sudo tee /usr/local/bin/zfs-apt-snapshot << 'EOF' #!/usr/bin/env bash # Create and prune ZFS snapshots around apt transactions. # Snapshots are named: apt_{pre|post}_YYYYmmdd_HHMMSS set -uo pipefail SNAPSHOT_PREFIX="apt" MAX_SNAPSHOTS=50 DATASETS=("rpool/ROOT/lmde" "rpool/home") LOG_FILE="/var/log/zfs-apt-snapshots.log" TIMESTAMP="$(date +%Y%m%d_%H%M%S)" log() { local msg="$1"; mkdir -p "$(dirname "$LOG_FILE")" 2>/dev/null || true; printf '[%s] %s\n' "$(date '+%F %T')" "$msg" >>"$LOG_FILE"; } require_cmd() { command -v "$1" >/dev/null 2>&1 || { log "missing: $1"; return 1; }; } acquire_lock() { exec 9>/run/zfs-apt-snapshot.lock || exec 9>/tmp/zfs-apt-snapshot.lock; flock -n 9 || { log "another instance"; return 1; }; } create_snapshot() { local phase="$1"; local snap="${SNAPSHOT_PREFIX}_${phase}_${TIMESTAMP}"; log "creating $phase: $snap" for ds in "${DATASETS[@]}"; do if zfs list -H -o name "$ds" >/dev/null 2>&1; then zfs snapshot "${ds}@${snap}" >/dev/null 2>&1 && log "created: ${ds}@${snap}" || log "error: ${ds}@${snap}" else log "missing dataset: $ds"; fi done } cleanup_snapshots() { log "pruning old apt snapshots (keep newest ${MAX_SNAPSHOTS})" for ds in "${DATASETS[@]}"; do zfs list -H -o name "$ds" >/dev/null 2>&1 || continue mapfile -t snaps < <(zfs list -H -t snapshot -o name -S creation -r "$ds" 2>/dev/null | awk -v ds="$ds" -F'@' '$1==ds && $2 ~ /^apt_/ {print $0}') local count=${#snaps[@]}; (( count<=MAX_SNAPSHOTS )) && { log "no prune: $ds ($count)"; continue; } for ((i=MAX_SNAPSHOTS;i<count;i++)); do zfs destroy "${snaps[$i]}" >/dev/null 2>&1 && log "destroyed: ${snaps[$i]}" || log "destroy failed: ${snaps[$i]}"; done done } main() { require_cmd zfs || return 0; acquire_lock || return 0 case "${1:-}" in pre) create_snapshot pre;; post) create_snapshot post; cleanup_snapshots;; *) echo "Usage: $0 {pre|post}";; esac return 0 } main "$@" || true; exit 0 EOF sudo chmod +x /usr/local/bin/zfs-apt-snapshot 创建APT钩子 sudo tee /etc/apt/apt.conf.d/00-zfs-snapshot-pre << 'EOF' DPkg::Pre-Invoke { "/usr/local/bin/zfs-apt-snapshot pre"; }; EOF sudo tee /etc/apt/apt.conf.d/99-zfs-snapshot-post << 'EOF' DPkg::Post-Invoke { "/usr/local/bin/zfs-apt-snapshot post"; }; EOF 测试快照系统 sudo /usr/local/bin/zfs-apt-snapshot pre sleep 2 sudo /usr/local/bin/zfs-apt-snapshot post zfs list -t snapshot | grep apt || echo "no apt snapshots" 第十二部分:ZFS维护管理 常用ZFS命令 zpool status zfs list sudo zfs snapshot rpool/ROOT/lmde@manual-$(date +%Y%m%d) zfs list -t snapshot sudo zfs destroy rpool/ROOT/lmde@manual-20240101 || true 磁盘健康监控 zpool status -v rpool zpool iostat -v rpool sudo smartctl -a $DISK1 性能监控 zpool iostat 1 zpool iostat -v 1 zfs get used,available,referenced,compressratio 第十三部分:故障排除 常见问题 问题1:启动时找不到ZFS池 ...

October 17, 2025 · wang1zhen

mpv 配置

前言 MPV 是一款强大而轻量的开源媒体播放器,支持高度自定义。 当前配置主要优化了以下方面: 使用 GPU 加速和 Anime4K 着色器提升画质 自定义快捷键实现高效操作 通过脚本扩展功能(现代化 OSC、播放列表管理、自动加载等) 优化中日文字幕显示和双字幕支持 核心配置文件 (mpv.conf) mpv.conf 是 MPV 的主配置文件,位于 =~/.config/mpv/mpv.conf=。 # ========== 画质设置 ========== profile=gpu-hq # 使用高画质预设 vo=gpu-next # 使用新的GPU渲染器(mpv 0.36+) gpu-api=auto # 自动选择最佳GPU API dither-depth=auto # 自动抖动深度 hwdec=auto-copy # 硬件解码(copy-back 模式,兼容 SVP) hwdec-codecs=all # 对所有编解码器启用硬件解码 video-sync=display-resample # 视频同步模式 interpolation # 启用帧插值(运动补偿) hr-seek-framedrop=no # 修复音频同步(SVP 需要) # ========== 播放控制 ========== keep-open=always # 每个文件播完后暂停 no-resume-playback # 禁用播放进度记忆(SVP 不兼容) # ========== 音频/字幕 ========== audio-file-auto=fuzzy # 自动加载外挂音轨 audio-channels=stereo # 双声道输出 audio-normalize-downmix=yes # 规范化降混 volume=100 # 默认音量 sub-auto=fuzzy # 自动加载外挂字幕 alang=ja,en,zh # 音轨语言优先级:日语>英语>中文 slang=zh,en,ja # 字幕语言优先级:中文>英语>日语 # 字幕样式 sub-font='Noto Sans CJK SC' # 中文字体 sub-font-size=48 sub-color='#FFFFFF' sub-border-size=3 sub-border-color='#000000' sub-shadow-offset=1 sub-shadow-color='#000000' # 次字幕配置(mpv 0.40+ 内置支持) # 注意:次字幕样式继承主字幕设置,只能调整位置 secondary-sid=auto # 自动选择次字幕轨道 secondary-sub-pos=95 # 位置(0-150,100=屏幕底部) secondary-sub-visibility=yes # 默认显示次字幕 # ========== 界面设置 ========== osc=no # 禁用默认OSC控制条 osd-bar=no # 禁用OSD进度条 border=no # 无窗口边框 autofit-larger=80%x80% # 窗口最大为屏幕80% volume-max=200 # 最大音量200% # ========== Anime4K画质增强 ========== # Optimized shaders for higher-end GPU: Mode A+A (HQ) glsl-shaders="~~/shaders/Anime4K_Clamp_Highlights.glsl:~~/shaders/Anime4K_Restore_CNN_VL.glsl:~~/shaders/Anime4K_Upscale_CNN_x2_VL.glsl:~~/shaders/Anime4K_Restore_CNN_M.glsl:~~/shaders/Anime4K_AutoDownscalePre_x2.glsl:~~/shaders/Anime4K_AutoDownscalePre_x4.glsl:~~/shaders/Anime4K_Upscale_CNN_x2_M.glsl" 画质设置详解 profile=gpu-hq : 启用 MPV 内置的高画质预设,包含多项优化选项 vo=gpu-next : 使用新一代 GPU 渲染器,性能更好,支持更多特性 gpu-api=auto : 自动选择 GPU API(Linux 通常选择 Vulkan 或 OpenGL) hwdec=auto-safe : 启用硬件解码,=auto-safe= 避免某些不稳定的解码器 video-sync=display-resample : 视频同步到显示器刷新率,配合插值使用 interpolation : 帧插值/运动补偿,让 24fps 视频在高刷屏上更流畅 播放控制 keep-open=always : 播放结束后暂停而不是关闭,方便查看最后一帧或重播 save-position-on-quit=yes : 记住播放进度,下次打开同一文件时从上次位置继续 音频和字幕配置 audio-file-auto=fuzzy : 模糊匹配自动加载外挂音轨文件 sub-auto=fuzzy : 模糊匹配自动加载外挂字幕文件 alang/slang : 设置音轨和字幕的语言优先级,我优先日语音轨+中文字幕 字幕样式使用 Noto Sans CJK SC 字体,确保中文显示美观,白色字体配黑色描边和阴影提升可读性。 ...

October 1, 2025 · wang1zhen

借助 cloudflared 配置 DNS over HTTPS

安装配置步骤 安装 cloudflared sudo pacman -S cloudflared 创建 systemd 服务文件 sudo vim /etc/systemd/system/cloudflared.service [Unit] Description=DNS over HTTPS proxy client Wants=network-online.target nss-lookup.target Before=nss-lookup.target [Service] AmbientCapabilities=CAP_NET_BIND_SERVICE CapabilityBoundingSet=CAP_NET_BIND_SERVICE DynamicUser=yes ExecStart=/usr/bin/cloudflared proxy-dns --port 5053 --upstream https://1.1.1.1/dns-query --upstream https://1.0.0.1/dns-query [Install] WantedBy=multi-user.target 启动 cloudflared 服务 # 重载 systemd 配置 sudo systemctl daemon-reload # 启用开机自启 sudo systemctl enable cloudflared # 立即启动服务 sudo systemctl start cloudflared # 检查服务状态 sudo systemctl status cloudflared 确认服务显示为 active (running) 。 ...

October 1, 2025 · wang1zhen

linux-to-go-debian

配置 Live 环境 切换到 root shell sudo -i 定义系统 ID 定义一个系统标识符,用作将要安装的文件系统的简短名称。 export ID=debian 配置和更新 APT cat <<EOF > /etc/apt/sources.list deb http://deb.debian.org/debian/ trixie main non-free-firmware contrib non-free deb-src http://deb.debian.org/debian/ trixie main non-free-firmware contrib non-free EOF apt update 注意: 已添加 non-free 源以支持 NVIDIA 驱动等专有软件 将 deb.debian.org 替换为本地镜像源可能会获得更快的下载速度 安装辅助工具 apt install debootstrap gdisk dkms linux-headers-$(uname -r) apt install zfsutils-linux arch-install-scripts 生成 /etc/hostid zgenhostid -f 定义磁盘变量 为方便操作并减少出错可能性,设置环境变量来引用将在安装过程中配置的设备。 重要: 对于 Linux To Go 系统,**必须使用** /dev/disk/by-id/ 路径来引用磁盘。这样可以确保在不同机器上插入 USB 设备时,磁盘标识保持持久性和唯一性,避免因设备顺序变化导致的启动问题。 ...

September 29, 2025 · wang1zhen

zfs 备份

硬盘初始化 确认设备 lsblk 清除旧分区表(可选) sudo wipefs -a /dev/sda 使用 gdisk 分区 sudo gdisk /dev/sda 输入 o → 新建空 GPT 表 输入 n → 新建分区(整盘) 类型代码:=BF00= (Solaris / ZFS) 输入 w → 写入 完成后得到 /dev/sda1 创建 ZFS 池 sudo zpool create -f backup /dev/sda1 优化设置 sudo zfs set mountpoint=/mnt/backup backup sudo zfs set compression=zstd backup 卸载/挂载池 sudo zpool export backup # 卸载 sudo zpool import # 查看可导入的池 sudo zpool import -d /dev/disk/by-id backup # 重新挂载(指定设备路径) 检查池状态 ...

September 26, 2025 · wang1zhen

用 podman 部署 file browser (免登录)

Quadlet 配置 路径:~/.config/containers/systemd/filebrowser.container [Unit] Description=<description> After=network-online.target [Container] Image=docker.io/filebrowser/filebrowser:latest ContainerName=<name> UserNS=keep-id PublishPort=<port>:8080 Volume=/share/web:/srv:ro Volume=/share/filebrowser/database:/database Volume=/share/filebrowser/config:/config Environment=FB_NOAUTH=true AutoUpdate=registry [Service] Restart=always TimeoutStartSec=900 [Install] WantedBy=default.target settings.ini /config/settings.ini { "port": 8080, "baseURL": "", "address": "", "log": "stdout", "database": "/database/filebrowser.db", "root": "/srv" } 配置要点 UserNS=keep-id:容器使用当前用户 UID/GID,避免权限错乱 Volume 映射 /share/web:/srv:ro:网站根目录,只读 /share/filebrowser/database:/database:数据库持久化 /share/filebrowser/config:/config:配置持久化 Restart=always:异常退出自动重启 AutoUpdate=registry:容器会根据镜像仓库版本自动更新 初次运行时必须确保 /database 是空的,否则 noauth 不生效! 自动升级机制 AutoUpdate=registry 启用后,Podman 的 systemd 集成会在 systemd.timer 定期触发时检查镜像更新 默认检查周期:每日(受 podman-auto-update.timer 控制) 升级时机: 如果仓库有新版本镜像 → 下载新镜像 自动重启受影响的服务,使用新镜像运行容器 可手动触发: systemctl --user start podman-auto-update.service 启动流程 mkdir -p /share/web \ /share/filebrowser/database \ /share/filebrowser/config loginctl enable-linger $USER systemctl --user daemon-reload systemctl --user enable --now filebrowser.service 验证 systemctl --user status filebrowser journalctl --user -u filebrowser.service -f podman ps | grep filebrowser 访问:<http://<宿主机ip>:8080>

September 25, 2025 · wang1zhen

podman 安装 immich

目录与环境变量 建议使用绝对路径。 样例目录 /share/immich/library /share/immich/postgres 环境文件路径 ~/.config/containers/systemd/immich/.env mkdir -p /share/immich/{library,postgres} mkdir -p ~/.config/containers/systemd/immich .env 样例 # 必填 - 改为绝对路径 UPLOAD_LOCATION=/share/immich/library DB_DATA_LOCATION=/share/immich/postgres # 版本标签 IMMICH_VERSION=release # 时区 TZ=Asia/Tokyo # 数据库 DB_PASSWORD=postgres DB_USERNAME=postgres DB_DATABASE_NAME=immich Quadlet 网络与命名卷 # ~/.config/containers/systemd/immich-network.network [Network] NetworkName=immich [Install] WantedBy=default.target # ~/.config/containers/systemd/model-cache.volume [Volume] VolumeName=model-cache [Install] WantedBy=default.target Valkey # ~/.config/containers/systemd/immich-redis.container [Unit] Description=Immich Redis (Valkey) [Container] Image=docker.io/valkey/valkey:8-bookworm ContainerName=immich_redis Network=immich RestartPolicy=always [Install] WantedBy=default.target Postgres # ~/.config/containers/systemd/immich-postgres.container [Unit] Description=Immich Postgres (vectorchord + pgvector) After=network-online.target Wants=network-online.target [Container] EnvironmentFile=%h/.config/containers/systemd/immich/.env Environment=POSTGRES_PASSWORD=%E{DB_PASSWORD} Environment=POSTGRES_USER=%E{DB_USERNAME} Environment=POSTGRES_DB=%E{DB_DATABASE_NAME} Environment=POSTGRES_INITDB_ARGS=--data-checksums Image=ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0 ContainerName=immich_postgres Volume=%E{DB_DATA_LOCATION}:/var/lib/postgresql/data ShmSize=128m Network=immich RestartPolicy=always [Install] WantedBy=default.target Machine Learning - CPU 基础版 # ~/.config/containers/systemd/immich-machine-learning.container [Unit] Description=Immich Machine Learning After=immich-redis.service immich-postgres.service Wants=immich-redis.service immich-postgres.service [Container] EnvironmentFile=%h/.config/containers/systemd/immich/.env Image=ghcr.io/immich-app/immich-machine-learning:%E{IMMICH_VERSION} ContainerName=immich_machine_learning Volume=model-cache:/cache Network=immich RestartPolicy=always [Install] WantedBy=default.target Server - CPU 基础版 # ~/.config/containers/systemd/immich-server.container [Unit] Description=Immich Server After=immich-redis.service immich-postgres.service Wants=immich-redis.service immich-postgres.service [Container] EnvironmentFile=%h/.config/containers/systemd/immich/.env Image=ghcr.io/immich-app/immich-server:%E{IMMICH_VERSION} ContainerName=immich_server PublishPort=2283:2283 Volume=%E{UPLOAD_LOCATION}:/data Volume=/etc/localtime:/etc/localtime:ro Network=immich RestartPolicy=always [Install] WantedBy=default.target 启动与管理 systemctl --user daemon-reload systemctl --user enable --now immich-network.network model-cache.volume systemctl --user enable --now immich-postgres.service immich-redis.service systemctl --user enable --now immich-machine-learning.service immich-server.service # 查看日志 journalctl --user -u immich-server.service -f journalctl --user -u immich-machine-learning.service -f GPU 加速 - 总览 只改两处:immich-machine-learning.container 与 immich-server.container。 NVIDIA - CUDA 推理与 NVENC 转码 主机准备 安装专有驱动与 NVIDIA Container Toolkit(启用 OCI Hook)。 确认 usr/share/containers/oci/hooks.d 存在 nvidia hook。 immich-machine-learning.container [Container] EnvironmentFile=%h/.config/containers/systemd/immich/.env Image=ghcr.io/immich-app/immich-machine-learning:%E{IMMICH_VERSION}-cuda ContainerName=immich_machine_learning Volume=model-cache:/cache Network=immich Environment=NVIDIA_VISIBLE_DEVICES=all Environment=NVIDIA_DRIVER_CAPABILITIES=compute,video,utility Device=/dev/nvidiactl Device=/dev/nvidia0 Device=/dev/nvidia-uvm RestartPolicy=always immich-server.container [Container] EnvironmentFile=%h/.config/containers/systemd/immich/.env Image=ghcr.io/immich-app/immich-server:%E{IMMICH_VERSION} ContainerName=immich_server PublishPort=2283:2283 Volume=%E{UPLOAD_LOCATION}:/data Volume=/etc/localtime:/etc/localtime:ro Network=immich Environment=NVIDIA_VISIBLE_DEVICES=all Environment=NVIDIA_DRIVER_CAPABILITIES=video,utility Device=/dev/nvidiactl Device=/dev/nvidia0 Device=/dev/nvidia-uvm RestartPolicy=always AMD - ROCm 推理与 VA-API 转码 主机准备 安装 ROCm 运行时。 将用户加入 render 与 video 组。 sudo usermod -aG render,video "$USER" newgrp render immich-machine-learning.container [Container] EnvironmentFile=%h/.config/containers/systemd/immich/.env Image=ghcr.io/immich-app/immich-machine-learning:%E{IMMICH_VERSION}-rocm ContainerName=immich_machine_learning Volume=model-cache:/cache Network=immich Device=/dev/kfd Device=/dev/dri RestartPolicy=always immich-server.container [Container] EnvironmentFile=%h/.config/containers/systemd/immich/.env Image=ghcr.io/immich-app/immich-server:%E{IMMICH_VERSION} ContainerName=immich_server PublishPort=2283:2283 Volume=%E{UPLOAD_LOCATION}:/data Volume=/etc/localtime:/etc/localtime:ro Network=immich Device=/dev/dri RestartPolicy=always 改动后重载 systemctl --user daemon-reload systemctl --user restart immich-machine-learning.service immich-server.service 映射目录与设备说明 Volume=%E{UPLOAD_LOCATION}:/data Immich 媒体与派生数据的根。 典型结构 original/ 原始媒体 thumbs/ 缩略图与预览 encoded-video/ 转码缓存 backup/ 应用内部备份 faces/ clips/ index/ 特征与向量索引缓存 Volume=%E{DB_DATA_LOCATION}:/var/lib/postgresql/data Postgres 数据目录。 结构 base/ 表文件 pg_wal/ 预写式日志 global/ 全局元数据 其他系统目录 Volume=model-cache:/cache ML 模型与推理缓存,避免重复下载或编译。 Volume=/etc/localtime:/etc/localtime:ro 容器时间与宿主同步,日志时间正确。 Device=/dev/dri 暴露渲染节点给容器,开启 VA-API 或 QuickSync。 Device=/dev/nvidiactl /dev/nvidia0 /dev/nvidia-uvm 直通 NVIDIA 设备,配合 OCI Hook 启用 CUDA 与 NVENC。 故障排查 权限 rootless 需加入 render、video 组。检查 ls -l /dev/dri。 编码失败 查看 ffmpeg 日志 journalctl --user -u immich-server.service -f Intel 可尝试设置 LIBVA_DRIVER_NAME=iHD。 CUDA 不可见 检查 NVIDIA OCI Hook 是否存在。 确认容器内可运行 nvidia-smi。 模型重复下载 确认 /cache 已挂载命名卷 model-cache。

September 24, 2025 · wang1zhen