如何拥有一个私人云相册
你厌倦了厂商的云盘了嘛?手机厂商5GB的云盘存储能存多少照片?几十块钱的会员才几十GB,你怎么看?上面百度、夸克、阿里每年下来多少钱?SMB、NFS、FTP等都可以传输,但是使用起来真的方便嘛?如果你想要一个备份图片视频的工具,能够随时随地的存储,并且是跨平台,能够通过手机App实现备份,那么我推荐使用immich。如果想要存放多媒体等内容呢Jellyfin也是一个不错的选择。
而成本呢?相对于NAS是比较少的,我们可以使用破烂古董、使用廉政主机、使用电视盒子、使用废弃的笔记本电脑、或者一块一两百的开发版,例如树莓派之类的,我们主要的成本就在于硬盘存储上,其他的成本我们是能压缩就能压缩的,得益于Termux等工具在Android上的发展,我们还可以使用大存储的破旧手机来存储,当然我不建议,涉及到改造成本,比起长期氪金和一次性氪金较多,我们属于节省成本,废物利用。
演示环境:VMware虚拟机+ubuntu desktop【Linux系统没有限制、可以是是ubuntu、fedora等】
现实环境:使用U盘安装Linux系统即可【针对开发版:TF卡烧录插入开发板】
无论选择哪一个系统都有很多问题,还是比较推荐Ubuntu22和Fedora这两个系统,稳定性很好的同时,依赖也比较完整,文章也很多,我这里用Fedora42来演示。
docker安装
首先我们要解决的是上网的问题,docker安装问题,这是非常头疼的问题。使用如下命令查看docke的包有哪些?
sudo dnf list | grep docker
安装docker
sudo dnf install -y docker docker-compose
此时会安装好相关的依赖:
启动docker
# 查看docker的状态,是否启动
sudo systemctl status docker
# 启动
sudo systemctl start docker
# 开机自启动
sudo systemctl enable docker
如果你不想使用国际网络,那么只能换源了
immich安装
首先需要安装wget、curl、vim、openshh-server这些常用工具。
sudo dnf install -y wget curl vim openssh-server
# 可选择,更新所有系统依赖和组件
sudo dnf update
接下来我们需要创建一个目录immach-app,创建的位置可以是用户目录下,也可以是opt目录下
在用户目录下创建[推荐:防止权限问题]:
cd /home/用户名
#使用pwd命令即可查看当前所处目录
# 创建目录
sudo mkdir immich-app
# 切换到immich-app目录
cd immich-app
在opt目录下创建:
cd /opt/
#使用pwd命令即可查看当前所处目录
# 创建目录
sudo mkdir immich-app
# 切换到immich-app目录
cd immich-app
下载 docker-compose.yml and example.env 文件
sudo wget -O docker-compose.yml https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
sudo wget -O .env https://github.com/immich-app/immich/releases/latest/download/example.env
注意:下载的时候访问的是Github,不会上网的话可能没办法下载成功,建议使用国际网络
成功下载如下图:
配置文件
使用自定义值填充 .env 文件,默认的环境变量内容如下:
# You can find documentation for all the supported env variables at https://immich.app/docs/install/environment-variables
# The location where your uploaded files are stored
UPLOAD_LOCATION=./library
# The location where your database files are stored. Network shares are not supported for the database
DB_DATA_LOCATION=./postgres
# To set a timezone, uncomment the next line and change Etc/UTC to a TZ identifier from this list: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List
# TZ=Etc/UTC
# The Immich version to use. You can pin this to a specific version like "v1.71.0"
IMMICH_VERSION=release
# Connection secret for postgres. You should change it to a random password
# Please use only the characters `A-Za-z0-9`, without special characters or spaces
DB_PASSWORD=postgres
# The values below this line do not need to be changed
###################################################################################
DB_USERNAME=postgres
DB_DATABASE_NAME=immich
以上内容可以不修改,解释如下:
使用您存储备份资产的首选位置填充 UPLOAD_LOCATION。它应该是服务器上具有足够可用空间的新目录。
考虑将 DB_PASSWORD 更改为自定义值。Postgres 未公开,因此此密码仅用于本地身份验证。为避免 Docker 解析此值时出现问题,最好仅使用字符 A-Za-z0-9。PWGEN 是一个方便的实用程序。
通过取消注释 TZ= 行来设置您的时区。
启动容器安装
使用如下命令进行安装:
sudo docker compose up -d
推荐方案:在国际网络环境下使用安装,网速决定安装是否成功
备用方案:如果不会上网,可以尝试更改docker的镜像源为国内的镜像源。
国内源如下:
https://mirror.ccs.tencentyun.com
https://docker.1panel.live
https://docker.mirrors.ustc.edu.cn
https://dockerhub.usts.edu.cn
编辑 Docker 配置文件(没有则新建):
sudo mkdir -p /etc/docker
sudo vim /etc/docker/daemon.json
添加以下内容(以中科大为例,可以换成你选的其他源):
json复制编辑{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn"
]
}
重启docker服务
sudo systemctl daemon-reexec
sudo systemctl restart docker
如果您收到 unknown shorthand flag: 'd' in -d or open
检查是否安装成功
sudo docker ps -a
成功如下:
配置网站
关闭防火墙
在Fedora中,一般服务器版本是有专本的web界面来控制防火墙的,工作站版本是没有的。我们需要手动关闭或者开放端口。为了安全考虑我们采用开放端口的操作:
sudo firewall-cmd --permanent --add-port=2283/tcp
重新载入配置让其生效:
sudo firewall-cmd --reload
检查是否放行:
sudo firewall-cmd --list-ports
# 可选操作:详细地查看当前区域的配置
sudo firewall-cmd --zone=public --list-all
# iptables放行
sudo iptables -A INPUT -p udp --dport 2283 -j ACCEPT
sudo service iptables save
输入http://ip:2283 进行访问。如果还是访问不到,就关闭防火墙,
sudo systemctl stop friewalld.service
如果都没有,检查日志,发现是数据库的权限问题:
chown: changing ownership of '/var/lib/postgresql/data': Permission denied
Using SSD storage
chmod: changing permissions of '/var/lib/postgresql/data': Permission denied
chown: changing ownership of '/var/lib/postgresql/data': Permission denied
这是因为feodra作为企业级服务器,面对的客户群体不一样,默认是开启SELinux的,而Ubuntu没有开启,将其关闭即可访问,一般情况下不建议关闭,这回导致一些安全问题。
关闭即可:
sudo setenforce 0
SELINUX=disabled
再次访问看到如下界面:
现在开始注册账号:
然后就是点击下一步,一直点就可以了。
最后是这样的效果:
手机连接
下载immich App,使用手机连接,输入地址,然后登陆
Jellyfin安装
Ubuntu/Debian安装
执行如下命令进行安装,
curl https://repo.jellyfin.org/install-debuntu.sh | sudo bash
Docker安装[推荐]
下载最新的容器映像
sudo docker pull jellyfin/jellyfin
为配置和缓存数据创建持久存储。
sudo mkdir -p /jellyfin/config
sudo mkdir -p /jellyfin/cache
sudo mkdir -p /mnt/jellyfin/data/
sudo chown -R 1000:1000 /jellyfin
或者创建两个持久卷
sudo docker volume create jellyfin-config
sudo docker volume create jellyfin-cache
运行创建容器
sudo docker run -d \
--name jellyfin \
--user 1000:1000 \
-p 8096:8096 \
-p 8920:8920 \
-v /jellyfin/config:/config \
-v /jellyfin/cache:/cache \
--mount type=bind,source=/mnt/jellyfin/data/,target=/media \
--restart=unless-stopped \
jellyfin/jellyfin
配置网站
输入http://ip:8096 进行访问,如图:
设置账户密码:
手机连接
由于是虚拟机演示,手机Ip地址段和虚拟机不在同一个IP段上,所以无法连接
后面的可以不看了,看需求。
其他
需要绑定挂载将文件夹从主机作系统传递到容器作系统,而卷由 Docker 维护,可以认为更容易由外部程序备份和控制。 对于简单的设置,使用 Bind Mounts 而不是 volumes 被认为更容易。 如果需要,可以绑定挂载多个媒体库:
--mount type=bind,source=/path/to/media1,target=/media1
--mount type=bind,source=/path/to/media2,target=/media2,readonly
...etc
可以选择性地绑定挂载自定义服务器端系统字体目录,以便在转码过程中使用这些字体并进行字幕烧录:
--mount type=bind,source=/path/to/fonts,target=/usr/local/share/fonts/custom,readonly
也可以挂载回退字体的目录。在这种情况下,您必须在 Jellyfin 服务器设置面板中将回退字体的目录设置为 :/fallback_fonts
--mount type=bind,source=/path/to/fallback/fonts,target=/fallback_fonts,readonly
Docker Compose安装
创建包含以下内容的文件。添加您希望运行 jellyfin 的 UID 和 GID,如下面的 user 行所示,或删除 user 行以使用默认 (root)。docker-compose.yml
services:
jellyfin:
image: jellyfin/jellyfin
container_name: jellyfin
user: uid:gid
network_mode: 'host'
volumes:
- /path/to/config:/config
- /path/to/cache:/cache
- type: bind
source: /path/to/media
target: /media
- type: bind
source: /path/to/media2
target: /media2
read_only: true
# Optional - extra fonts to be used during transcoding with subtitle burn-in
- type: bind
source: /path/to/fonts
target: /usr/local/share/fonts/custom
read_only: true
restart: 'unless-stopped'
# Optional - alternative address used for autodiscovery
environment:
- JELLYFIN_PublishedServerUrl=http://example.com
# Optional - may be necessary for docker healthcheck to pass if running in host network mode
extra_hosts:
- 'host.docker.internal:host-gateway'
然后,在与运行相同的文件夹中时:docker-compose.yml
docker compose up
要在后台运行容器,请添加到上述命令。-d