Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

迁移 docker Jellyfin 到全新机器 #197

Open
Bpazy opened this issue Aug 10, 2021 · 2 comments
Open

迁移 docker Jellyfin 到全新机器 #197

Bpazy opened this issue Aug 10, 2021 · 2 comments

Comments

@Bpazy
Copy link
Owner

Bpazy commented Aug 10, 2021

0. 前言

各设备 IP:
NAS: 192.168.31.20
旧设备: 192.168.31.21
新设备: 192.168.31.31

1. 旧机器导出 jellyfin 数据

旧机器 docker 容器的详情
这是我的 QNAP 设备
[/share/Installer/temp_20210811] # docker inspect e153ae723f1a
[
    {
        "Id": "e153ae723f1ab69a3c62cc7c926d1ffda268056d38833949e0db83ad7782b2ca",
        "Created": "2020-03-16T16:16:17.153304574Z",
        "Path": "./jellyfin/jellyfin",
        "Args": [
            "--datadir",
            "/config",
            "--cachedir",
            "/cache",
            "--ffmpeg",
            "/usr/local/bin/ffmpeg"
        ],
        "State": {
            "Status": "exited",
            "Running": false,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 0,
            "ExitCode": 143,
            "Error": "",
            "StartedAt": "2021-03-10T14:41:26.253973907Z",
            "FinishedAt": "2021-08-10T17:53:21.548132521Z"
        },
        "Image": "sha256:f4a95483e8262f36c3581d01b4f797f6a625e39f80181d56e0e0329f93d3f12b",
        "ResolvConfPath": "/share/CACHEDEV1_DATA/Container/container-station-data/lib/docker/containers/e153ae723f1ab69a3c62cc7c926d1ffda268056d38833949e0db83ad7782b2ca/resolv.conf",
        "HostnamePath": "/share/CACHEDEV1_DATA/Container/container-station-data/lib/docker/containers/e153ae723f1ab69a3c62cc7c926d1ffda268056d38833949e0db83ad7782b2ca/hostname",
        "HostsPath": "/share/CACHEDEV1_DATA/Container/container-station-data/lib/docker/containers/e153ae723f1ab69a3c62cc7c926d1ffda268056d38833949e0db83ad7782b2ca/hosts",
        "LogPath": "/share/CACHEDEV1_DATA/Container/container-station-data/lib/docker/containers/e153ae723f1ab69a3c62cc7c926d1ffda268056d38833949e0db83ad7782b2ca/e153ae723f1ab69a3c62cc7c926d1ffda268056d38833949e0db83ad7782b2ca-json.log",
        "Name": "/jellyfin-1-temporary-1590291633",
        "RestartCount": 0,
        "Driver": "overlay2",
        "Platform": "linux",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "",
        "ExecIDs": null,
        "HostConfig": {
            "Binds": [
                "/share/jellyfin/cache:/cache",
                "/share/media:/media",
                "/share/jellyfin/config:/config"
            ],
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "json-file",
                "Config": {}
            },
            "NetworkMode": "host",
            "PortBindings": {},
            "RestartPolicy": {
                "Name": "no",
                "MaximumRetryCount": 0
            },
            "AutoRemove": false,
            "VolumeDriver": "",
            "VolumesFrom": null,
            "CapAdd": null,
            "CapDrop": null,
            "Dns": [],
            "DnsOptions": [],
            "DnsSearch": [],
            "ExtraHosts": null,
            "GroupAdd": null,
            "IpcMode": "shareable",
            "Cgroup": "",
            "Links": null,
            "OomScoreAdj": 0,
            "PidMode": "",
            "Privileged": false,
            "PublishAllPorts": false,
            "ReadonlyRootfs": false,
            "SecurityOpt": null,
            "UTSMode": "",
            "UsernsMode": "",
            "ShmSize": 67108864,
            "Runtime": "runc",
            "ConsoleSize": [
                0,
                0
            ],
            "Isolation": "",
            "CpuShares": 0,
            "Memory": 0,
            "NanoCpus": 0,
            "CgroupParent": "",
            "BlkioWeight": 0,
            "BlkioWeightDevice": [],
            "BlkioDeviceReadBps": null,
            "BlkioDeviceWriteBps": null,
            "BlkioDeviceReadIOps": null,
            "BlkioDeviceWriteIOps": null,
            "CpuPeriod": 0,
            "CpuQuota": 0,
            "CpuRealtimePeriod": 0,
            "CpuRealtimeRuntime": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "Devices": [
                {
                    "PathOnHost": "/dev/dri/renderD128",
                    "PathInContainer": "/dev/dri/renderD128",
                    "CgroupPermissions": "rwm"
                }
            ],
            "DeviceCgroupRules": null,
            "DiskQuota": 0,
            "KernelMemory": 0,
            "MemoryReservation": 0,
            "MemorySwap": 0,
            "MemorySwappiness": null,
            "OomKillDisable": false,
            "PidsLimit": 0,
            "Ulimits": null,
            "CpuCount": 0,
            "CpuPercent": 0,
            "IOMaximumIOps": 0,
            "IOMaximumBandwidth": 0
        },
        "GraphDriver": {
            "Data": {
                "LowerDir": "/share/CACHEDEV1_DATA/Container/container-station-data/lib/docker/overlay2/42fae3b91ee5d46d270ba2ac8681c04e9fd7b22d75a8c71bdf25c6af45580cf0-init/diff:/share/CACHEDEV1_DATA/Container/container-station-data/lib/docker/overlay2/cf0759cb81923b0f57e7a909cd174185255e9b617340e97ce454a8eb7fb7a747/diff:/share/CACHEDEV1_DATA/Container/container-station-data/lib/docker/overlay2/f0f31c3cec79753a8471292d9b323bca4f8d53bc1cff712a742b9d36d0ce80b7/diff:/share/CACHEDEV1_DATA/Container/container-station-data/lib/docker/overlay2/b7499b5bf659d5b211f4b10d72599b629f3c3541fb1cbd220a0e1ad602403723/diff:/share/CACHEDEV1_DATA/Container/container-station-data/lib/docker/overlay2/1746d846c3e1ed4cdc6f125ebbd86e830a51935130ab2692c764e692c289d223/diff:/share/CACHEDEV1_DATA/Container/container-station-data/lib/docker/overlay2/ca5b3391c32348ac738d8158be04146e3591cab75b7bb688cf35f07a0067124c/diff",
                "MergedDir": "/share/CACHEDEV1_DATA/Container/container-station-data/lib/docker/overlay2/42fae3b91ee5d46d270ba2ac8681c04e9fd7b22d75a8c71bdf25c6af45580cf0/merged",
                "UpperDir": "/share/CACHEDEV1_DATA/Container/container-station-data/lib/docker/overlay2/42fae3b91ee5d46d270ba2ac8681c04e9fd7b22d75a8c71bdf25c6af45580cf0/diff",
                "WorkDir": "/share/CACHEDEV1_DATA/Container/container-station-data/lib/docker/overlay2/42fae3b91ee5d46d270ba2ac8681c04e9fd7b22d75a8c71bdf25c6af45580cf0/work"
            },
            "Name": "overlay2"
        },
        "Mounts": [
            {
                "Type": "bind",
                "Source": "/share/jellyfin/cache",
                "Destination": "/cache",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            },
            {
                "Type": "bind",
                "Source": "/share/jellyfin/config",
                "Destination": "/config",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            },
            {
                "Type": "bind",
                "Source": "/share/media",
                "Destination": "/media",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],
        "Config": {
            "Hostname": "nHan-453Bmini",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": true,
            "AttachStderr": true,
            "ExposedPorts": {
                "8096/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "NVIDIA_DRIVER_CAPABILITIES=compute,video,utility",
                "DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1"
            ],
            "Cmd": null,
            "Image": "jellyfin/jellyfin:latest",
            "Volumes": {
                "/cache": {},
                "/config": {},
                "/media": {}
            },
            "WorkingDir": "",
            "Entrypoint": [
                "./jellyfin/jellyfin",
                "--datadir",
                "/config",
                "--cachedir",
                "/cache",
                "--ffmpeg",
                "/usr/local/bin/ffmpeg"
            ],
            "OnBuild": null,
            "Labels": {}
        },
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "6a5645d3bf40514fee310142bc4ae2a85765f787104cbd2695b2236208ee0782",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {},
            "SandboxKey": "/var/run/docker/netns/default",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "",
            "Gateway": "",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "",
            "IPPrefixLen": 0,
            "IPv6Gateway": "",
            "MacAddress": "",
            "Networks": {
                "host": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "0cade7f3f08c241ceec07a5c1dce07079145a89c2f6500d674f4d367810dab68",
                    "EndpointID": "",
                    "Gateway": "",
                    "IPAddress": "",
                    "IPPrefixLen": 0,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "",
                    "DriverOpts": null
                }
            }
        }
    }
]

其中 cache, config, media 这几个目录是需要被 copy 到新机器的,其中 media 我是通过 smb 挂载的,所以这里我就无需复制了。

2. 新机器挂载远程 media 目录

这里有一些 Linux SMB 的知识点,如依赖等,参考这里: #160

永久挂载,直接修改 /etc/fstab 文件:

sudo mkdir /mnt/media
sudo cat <<EOF >>/etc/fstab
//192.168.31.20/media /mnt/media cifs defaults,username=YOUR_SMB_USERNAME,password=YOUR_SMB_PASSWORD
EOF
sudo mount -a

如果你要的是临时挂载:

sudo mount -o username=YOUR_SMB_USERNAME,password=YOUR_SMB_PASSWORD //192.168.31.20/media /mnt/media

3. 新机器安装 docker Jellyfin

注意:这里已经安装了 docker, docker-compose

mkdir jellyfin && cd jellyfin
# 将最开始备份的 config, cache 复制到 jellyfin 目录,这里我用的是 rz 命令上传备份 zip 的
rz
unzip jellyfin.zip

此时目录应该有 config, cache 两个目录。然后继续上面的命令启动 docker:

touch docker-compose.yaml
cat <<EOF >docker-compose.yaml
version: '3'
services:
  jellyfin:
    image: jellyfin/jellyfin:latest
    user: 0:0
    restart: unless-stopped
    network_mode: host
    volumes:
      - ./config:/config
      - /mnt/media:/media
      - ./cache:/cache
    environment:
      - JELLYFIN_PublishedServerUrl=http://media.home.com
EOF

sudo docker-compose up -d

注意,这里有个问题,第一次启动时,旧用户密码未加载,需要重启一次 docker 才能正常登录旧用户,原因未知。

4. 新机器安装 Nginx 并配置

sudo apt install nginx
sudo touch /etc/nginx/sites-available/jellyfin
sudo cat <<EOF >/etc/nginx/sites-available/jellyfin
server {
    listen 80;
    server_name media.home.com;

    location / {
        proxy_pass http://127.0.0.1:8096;
    }
}
EOF
sudo ln -s /etc/nginx/sites-available/jellyfin /etc/nginx/sites-enabled/jellyfin
sudo nginx -s reload

5. 修改 dnsmasq,将域名映射到新机器

这里我的路由器是 Padavan,所以直接在路由器界面设置即可,以前的配置为:

address=/home.com/192.168.31.21

修改为:

address=/media.home.com/192.168.31.31
address=/home.com/192.168.31.21

6. 大功告成

image

@Bpazy Bpazy added the NAS label Aug 10, 2021
@Bpazy
Copy link
Owner Author

Bpazy commented Sep 15, 2021

cannot read: permission deined

威联通共享文件后,新创建了用户,并授予了 media 目录权限,但是其他机器通过该账户访问时,发现有部分文件无法查看。具体表现为,一个目录下有多个文件,但是其中有一个文件无法展示出来,即 ls -a 命令也无法展示。但是通过 cp 命令强制访问该文件,则提示权限不足。
原因暂时未知。

cp: cannot open '复仇者联盟.mp4' for reading: Permission denied

解决方案: 挂载的时候使用 admin 用户

sudo mount -o username=admin,password=YOUR_ADMIN_PASSWORD //192.168.31.20/media /mnt/media

@Bpazy Bpazy added the Jellyfin label Jan 3, 2022
@Bpazy
Copy link
Owner Author

Bpazy commented Mar 22, 2022

关于 SMB 的详细知识,如命令安装、开机自动挂载等,参考这里: #160

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant