Debian10 上安装部分应用,速度几乎为0,至少需要Debian11以上,512M内存足够。

安装 Docker

1.首先,更新现有的软件包列表:

1
sudo apt update -y

2.接下来,安装一些必备软件包,让 apt 通过 HTTPS 使用软件包。

1
sudo apt install apt-transport-https ca-certificates curl gnupg2 software-properties-common -y

3.然后将官方 Docker hub 的 GPG key 添加到系统中。

1
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -

4.将 Docker 版本库添加到APT源:

1
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"

5.接下来,我们用新添加的 Docker 软件包来进行升级更新。

1
sudo apt update -y

6.安装 Docker

1
sudo apt install docker-ce -y

7.检查 Docker 是否正在运行

1
2
docker --version
sudo systemctl status docker

8.重启 docker 并设置开机自启

1
2
3
sudo systemctl enable docker
sudo systemctl daemon-reload
sudo systemctl restart docker

9.修改Docker配置(来自烧饼博客

以下配置会增加一段自定义内网 IPv6 地址,开启容器的 IPv6 功能,以及限制日志文件大小,防止 Docker 日志塞满硬盘(泪的教训)

1
2
3
4
5
6
7
8
9
10
11
12
13
cat > /etc/docker/daemon.json <<EOF
{
"log-driver": "json-file",
"log-opts": {
"max-size": "20m",
"max-file": "3"
},
"ipv6": true,
"fixed-cidr-v6": "fd00:dead:beef:c0::/80",
"experimental":true,
"ip6tables":true
}
EOF

然后重启 Docker 服务:

1
systemctl restart docker

在 Docker 中使用镜像

1.要查看已下载到计算机的镜像:

1
docker images

2.删除某个docker镜像

1
docker rmi <your-image-id>

3.一次删除多张镜像

1
docker rmi <your-image-id> <your-image-id> ...

4.一次删除所有镜像

1
docker rmi $(docker images -q)

在 Docker 中使用容器

1.要查看所有的容器对象,请使用:

1
docker ps -a

docker ps -a -q 分解

  • docker ps 列出活动中容器。
  • -a 这个选项用于列出所有容器,包括停止运行的。如果没有这个选项,则默认只列出在运行的容器。
  • -q 这个选项列出容器的数字 ID,而不是容器的所有信息。

2.要启动已停止的容器,请使用docker start命令+容器ID或容器名

  • 停止所有容器运行:docker stop $(docker ps -a -q)

3.通过docker rm命令来删除不用的容器。

  • 先使用docker ps -a命令查找相关镜像关联的容器的容器ID或名称,然后通过docker rm命令来删除其删除。
  • 删除所有停止运行的容器:docker rm $(docker ps -a -q)

Docker 容器开机自启

1.在使用docker run启动容器时,使用–restart参数来设置:

1
docker run -m 512m --memory-swap 1G -it -p 58080:8080 --restart=always  

2.如果创建时未指定 –restart=always ,可通过update 命令设置

1
docker update --restart=always 容器ID或名称

安装 Docker Compose

1.安装

1
2
3
4
export LATEST_VERSION=$(wget -qO- -t1 -T2 "https://api.github.com/repos/docker/compose/releases/latest" | grep "tag_name" | head -n 1 | awk -F ":" '{print $2}' | sed 's/\"//g;s/,//g;s/ //g')
sudo curl -L https://github.com/docker/compose/releases/download/$LATEST_VERSION/docker-compose-linux-`uname -m` > ./docker-compose
sudo chmod +x ./docker-compose
sudo mv ./docker-compose /usr/local/bin/docker-compose

2.查看版本

1
docker-compose --version

3.使用 -d 选项以分离模式启动 Compose(后台)

1
docker-compose up -d

4.要查看正在运行的 docker 容器,请使用以下命令

1
docker-compose ps

5.删除容器

1
2
3
4
5
cd /root/data/docker_data/joplin  # 进入docker-compose所在的文件夹

docker-compose down # 停止容器,此时不会删除映射到本地的数据

rm -rf /root/data/docker_data/joplin # 完全删除映射到本地的数据

6.一些 Docker Compose 常用命令:

1
2
3
4
5
docker-compose restart  # 重启容器
docker-compose stop # 暂停容器
docker-compose down # 删除容器
docker-compose pull # 更新镜像
docker-compose exec artalk bash # 进入容器

7.Docker Compose升级

拉取最新镜像,然后重新创建容器即可。

1
2
3
docker-compose pull
docker-compose up -d
docker image prune

8.使用 Watchtower 自动更新

Watchtower 可自动检测并更新 Docker 容器到最新镜像。

1
2
3
4
5
6
7
8
services:
watchtower:
image: containrrr/watchtower
container_name: watchtower
volumes:
- /var/run/docker.sock:/var/run/docker.sock
command: --interval 86400 --cleanup
restart: always

开机自动启动应用容器

1.方法一、通过 Docker Restart Policy 方法

在 Docker 中,支持 –restart 选项,来控制容器自动启动。在 Docker Compose 中,应该使用 restart 属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
version: '2'
services:
database:
build: ./mysql/
command: mysqld --user=root --verbose
+ restart: always
environment:
MYSQL_DATABASE: "web_level3_sqli"
MYSQL_USER: "web_level3_sqli"
MYSQL_PASSWORD: "thisisasecurepassword123"
MYSQL_ROOT_PASSWORD: "root"
MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
web:
build: ./www/
+ restart: always
ports:
- "12000:80"
volumes:
- ./www/src:/var/www/html
links:
- database

注意事项:
1)Docker 并不知道这些服务的依赖关系及启动顺序,需要我们精心编排 docker-compose.yaml 文件;
2)Docker Compose 不支持 deploy:restart_policy 属性,该属性只能用于 a swarm with docker stack deploy 环境;

2.方法二、通过进程管理服务(推荐)

该方法本质上还是在执行 docker-compose 命令。

使用 systemd 管理
如下示例,可以根据需要进行设置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# cat /etc/systemd/system/docker-compose-app.service

[Unit]
Description=Docker Compose Application Service
Requires=docker.service
After=docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/srv/docker/app/
ExecStart=/usr/local/bin/docker-compose up -d
ExecStop=/usr/local/bin/docker-compose down
TimeoutStartSec=0

[Install]
WantedBy=multi-user.target

7.卸载 Docker Compose

1
sudo rm /usr/local/bin/docker-compose

Docker Compose 部署tv

参考:Memos Docker-Compose部署

1.创建 tv 工作目录

1
2
3
mkdir -p /root/docker/tv
cd /root/docker/tv
vi docker-compose.yml

2.编写 docker-compose.yml 文件:

注意更改 - PASSWORD=你的密码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
services:
decotv-core:
image: ghcr.io/decohererk/decotv:latest
container_name: decotv-core
restart: always # You can keep 'unless-stopped' or 'always' as preferred
ports:
- '3000:3000'
environment:
- USERNAME=admin
- PASSWORD=你的密码
- NEXT_PUBLIC_STORAGE_TYPE=kvrocks
- KVROCKS_URL=redis://decotv-kvrocks:6666
- NEXT_PUBLIC_DISABLE_YELLOW_FILTER=false
networks:
- decotv-network
depends_on:
- decotv-kvrocks

decotv-kvrocks:
image: apache/kvrocks
container_name: decotv-kvrocks
restart: always # You can keep 'unless-stopped' or 'always' as preferred
volumes:
- kvrocks-data:/var/lib/kvrocks
networks:
- decotv-network

watchtower:
image: containrrr/watchtower
container_name: watchtower
volumes:
- /var/run/docker.sock:/var/run/docker.sock
command: --interval 86400 --cleanup
restart: always # You can keep 'unless-stopped' or 'always' as preferred

networks:
decotv-network:
driver: bridge

volumes:
kvrocks-data:

3.执行命令,tv 后端程序将运行在 http://localhost:端口号

1
docker-compose up -d

4.配置域名访问,参考:域名访问

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
server {
listen 80;
server_name tv.bore.vip;

# Redirect all HTTP traffic to HTTPS
return 301 https://$host$request_uri;
}

server {
listen 443 ssl http2;
server_name tv.bore.vip;
root /data/wwwroot/tv.bore.vip;

# SSL setting
ssl_certificate /etc/letsencrypt/live/tv.bore.vip/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/tv.bore.vip/privkey.pem;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
add_header Strict-Transport-Security "max-age=31536000";

# proxy to 3000
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header REMOTE-HOST $remote_addr;
add_header X-Cache $upstream_cache_status;
# cache
add_header Cache-Control no-cache;
expires 12h;
}

location ^~ /.well-known/acme-challenge/ {
default_type "text/plain";
allow all;
root /data/wwwroot/tv.bore.vip/;
}
}

5.视频源配置:

精简版见:LunaTV-config

6.更新(更新前最好在后台先备份数据

1
2
3
4
cd /root/docker/tv
docker-compose pull
docker-compose up -d
docker image prune

PS:是否需要 docker-compose down?(问chatgpt)

一般 不需要,除非:

  • 改过网络、volume、端口等会冲突的配置
  • 某些服务需要完全重建
  • 想彻底清理旧容器

如果你只是更新镜像 → 重启服务,那么 不加 down 是正确的


PS:以下参考chatgpt

1.先把原始 logo 名字查出来

1
docker exec -it decotv-core ls /app/public

你大概率会看到:

1
2
3
VERSION.txt          logo.png             screenshot1.png      wechat.jpg
favicon.ico manifest.json screenshot2.png workbox-e9849328.js
icons robots.txt sw.js

2.下载原来的logo,查看logo尺寸

访问:

下载logo到本地

3.宿主机准备文件

(1)在宿主机创建logo目录

1
2
cd /root/docker/tv
mkdir -p public

(2)利用Xterminalssh管理工具上传自定义logo

4.在 docker-compose.yml里面的**decotv-core 服务里,新增 volumes只挂载这两个文件**。

1
2
3
volumes:
- ./public/favicon.ico:/app/public/favicon.ico # 挂载宿主机上的 favicon.ico
- ./public/logo.png:/app/public/logo.png # 挂载宿主机上的 logo.png

5.重启

1
2
docker-compose down
docker-compose up -d

PS:以下参考chatgpt

1.先把PWA原始 logo 名字查出来

1
docker exec -it decotv-core ls /app/public/icons

你大概率会看到:

1
icon-192x192.png  icon-256x256.png  icon-384x384.png  icon-512x512.png

2.宿主机准备目录和图片

1
2
cd /root/docker/tv
mkdir -p public/icons

准备 4张正方形 PNG(非常重要),名称要和上方一致,利用Xterminalssh管理工具上传到相应目录

3.docker-compose.yml 挂载

1
2
3
4
volumes:
- ./public/icons:/app/public/icons
- ./public/favicon.ico:/app/public/favicon.ico
- ./public/logo.png:/app/public/logo.png

4.重启

1
2
docker-compose down
docker-compose up -d

如果 PWA 图标还是没变,删除已添加的 PWA,重新 “添加到主屏幕”

更改PWA名称

PS:以下参考chatgpt

最开始以为修改manifest.json就行,后来发现每次manifest.json都会重写,所以直接修改**generate-manifest.js**

1.复制generate-manifest.js到宿主机

1
2
3
cd /root/docker/tv
mkdir -p public/scripts
docker cp decotv-core:/app/scripts/generate-manifest.js /root/docker/tv/scripts/

2.修改generate-manifest.js

1
2
cd /root/docker/tv/scripts
vi generate-manifest.js

3.修改此处:

1
2
// 从环境变量获取站点名称
const siteName = process.env.NEXT_PUBLIC_SITE_NAME || '影视聚合';

4.docker-compose.yml 挂载

1
2
3
4
5
volumes:
- ./scripts/generate-manifest.js:/app/scripts/generate-manifest.js # 挂载宿主机上的 generate-manifest.js
- ./public/icons:/app/public/icons # 挂载宿主机上的 icons 文件夹
- ./public/favicon.ico:/app/public/favicon.ico # 挂载宿主机上的 favicon.ico
- ./public/logo.png:/app/public/logo.png # 挂载宿主机上的 logo.png

5.重启

1
2
docker-compose down
docker-compose up -d

最终docker-compose.yml

注意更改 - PASSWORD=你的密码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
services:
decotv-core:
image: ghcr.io/decohererk/decotv:latest
container_name: decotv-core
restart: always # You can keep 'unless-stopped' or 'always' as preferred
ports:
- '3000:3000'
environment:
- USERNAME=admin
- PASSWORD=你的密码
- NEXT_PUBLIC_STORAGE_TYPE=kvrocks
- KVROCKS_URL=redis://decotv-kvrocks:6666
- NEXT_PUBLIC_DISABLE_YELLOW_FILTER=false
volumes:
- ./scripts/generate-manifest.js:/app/scripts/generate-manifest.js # 挂载宿主机上的 generate-manifest.js
- ./public/icons:/app/public/icons # 挂载宿主机上的 icons 文件夹
- ./public/favicon.ico:/app/public/favicon.ico # 挂载宿主机上的 favicon.ico
- ./public/logo.png:/app/public/logo.png # 挂载宿主机上的 logo.png
networks:
- decotv-network
depends_on:
- decotv-kvrocks

decotv-kvrocks:
image: apache/kvrocks
container_name: decotv-kvrocks
restart: always # You can keep 'unless-stopped' or 'always' as preferred
volumes:
- kvrocks-data:/var/lib/kvrocks
networks:
- decotv-network

watchtower:
image: containrrr/watchtower
container_name: watchtower
volumes:
- /var/run/docker.sock:/var/run/docker.sock
command: --interval 86400 --cleanup
restart: always # You can keep 'unless-stopped' or 'always' as preferred

networks:
decotv-network:
driver: bridge

volumes:
kvrocks-data:

generate-manifest.js更新历史

  • Commits on Oct 2, 2025

常见问题

1.出错提示:error storing credentials - err: exit status 1, out: Cannot autolaunch D-Bus without X11 $DISPLAY

解决方法:

1
sudo apt install gnupg2 pass -y

参考链接