服务器迁移记录

125 阅读5分钟

环境

  • centos-docker
  • 之前服务器win10 IIS部署,现在切成linux版centos

登录服务器

ssh root@111.231.33.102
10.0.16.17 // 内网ip

mkdir home
cd /home  // 工作目录

mkdir mysql

mkdir nginx

mkdir node

mkdir py

Mysql

  • Dockerfile
# 使用官方MySQL镜像作为基础镜像
FROM mysql:5.7

# 设置MySQL root用户的密码
ENV MYSQL_ROOT_PASSWORD=YourPassword

# 暴露MySQL默认的端口3306
EXPOSE 3306

# 启动MySQL服务
CMD ["mysqld"]
  • 操作
// 切换到 mysql目录 
cd mysql

// 把上面Dockerfile 放到目录下 并执行构建命令
docker build -t mysql:5.7 .

// 运行(这里要做资源映射)
docker run -d --name mysql-3306 -v /root/home/mysql:/var/lib/mysql -p 3306:3306 mysql-5.7

// 进入docker 测试
docker exec -it mysql-3306 /bin/sh

// 连接mysql
mysql -u root -p

// 显示数据库
show databases

// 显示用户
SELECT User, Host FROM mysql.user;

# 设置允许的ip
RENAME USER 'user'@'10.0.16.17' TO 'user'@'%'; 

# 重启
FLUSH PRIVILEGES;

Nginx

  • Dockerfile
# 使用官方Nginx镜像的1.24版本
FROM nginx:1.24

# 设置工作目录
WORKDIR /usr/share/nginx

# 暴露80端口
EXPOSE 80

# 启动Nginx
CMD ["nginx", "-g", "daemon off;"]
  • 操作
// 构建
docker build -t nginx:1.24 .

// 运行并映射(目录要加/)
docker run -d --name nginx-80 \
-v /root/home/nginx/nginx/html/:/etc/nginx/html/ \
-v /root/home/nginx/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /root/home/nginx/nginx/logs/:/var/log/nginx/ \
-p 80:80 \
nginx:1.24

后端Node和PM2

  • Dockerfile
# 使用 Node.js 18 版本的官方镜像作为基础镜像
FROM node:18-alpine

# 设置工作目录为 /app
WORKDIR /app

# 修改npm安装源
RUN npm config set registry https://registry.npmmirror.com


# 安装pm2
RUN npm install pm2 -g

# 暴露容器端口
EXPOSE 8001

EXPOSE 8002

EXPOSE 8003

EXPOSE 8004

EXPOSE 8005

EXPOSE 8006

EXPOSE 8007

EXPOSE 8008

EXPOSE 8009

EXPOSE 8010

# 使用 PM2 运行 Nuxt 应用程序
CMD ["pm2-runtime", "start", "ecosystem.config.js"]
  • 操作
// 构建
docker build -t node:18 .

// 运行并映射(目录要加/)
docker run -d --name node \
-v /root/home/node/app/:/app/ \
-p 8001:8001 \
-p 8002:8002 \
-p 8003:8003 \
-p 8004:8004 \
-p 8005:8005 \
-p 8006:8006 \
-p 8007:8007 \
-p 8008:8008 \
-p 8009:8009 \
-p 8010:8010 \
node:18

Python

  • Dockerfile
FROM python:3.8

WORKDIR /app

COPY  ./app/requirements.txt .

RUN pip install -i https://mirrors.aliyun.com/pypi/simple/ -r requirements.txt

CMD ["python", "./pushdeer/main.py"]

操作

// 构建
docker build -t python:3.8 .

// 运行并映射
docker run -d --name python \
-v /root/home/python/app/:/app/ \
python:3.8

定时执行脚本

crontab -e // 命令打开cron表

12 05 * * * docker restart python // 每天的05:12重启动下docker容器

crontab -l // 命令查看cron任务列表

设置docker时区(和宿主一致)

临时设置

# 1. 进入运行中的容器(--user root 确保权限)
docker exec -it --user root 容器名 /bin/bash

# 2. 安装tzdata并设置时区(Ubuntu/Debian)
apt update && apt install -y tzdata
# 执行后会弹出交互界面,按提示选择「Asia」→「Shanghai」

# 如果没弹出
# 2.1 设成交互模式(临时)
unset DEBIAN_FRONTEND
# 2.2 重新触发配置向导
dpkg-reconfigure tzdata
# 2.3 按提示选择「Asia」→「Shanghai」

# 3. 验证时间(容器时间应与宿主机一致)
date

挂载宿主

docker run -d \
  -v /etc/timezone:/etc/timezone:ro \  # 挂载时区标识文件(只读)
  -v /etc/localtime:/etc/localtime:ro \  # 挂载时区软链接(只读)
  --name 容器名 镜像名

Redis

  • Dockerfile
# 使用最新版本的Redis官方镜像
FROM redis

# 暴露Redis端口
EXPOSE 6379

# 执行Redis服务
CMD ["redis-server"]
  • 操作
// 构建
docker build -t redis:7.0 .

// 运行并映射
docker run -d -p 6379:6379 --name redis \
-v /root/home/redis/app/conf/redis.conf:/etc/redis/redis.conf \
redis:7.0
  • 测试
  1. Docker部署环境-redis

RssHub

  • docker-compose.yml
version: "3"
services:
    rsshub:
        image: rsshub
        restart: always
        ports:
            - "1200:1200"
        environment:
            ACCESS_KEY: "your-secret-key"
            NODE_ENV: "production"
            LISTEN_INADDR_ANY: "0" # 是否禁止公网访问,如果不打算使用 nginx 进行反向代理则应设置为 "1"
            CACHE_TYPE: "redis"
            REDIS_URL: "redis://redis:6379/"
            PUPPETEER_WS_ENDPOINT: "ws://browserless:3000"
            PROXY_URI: "http://proxy:7890" # 代理,若不使用代理则去掉代理相关配置
            PROXY_URL_REGEX: "https?:\\/\\/(.*)(v2ex|twitter|youtube)(.*)\\.(.*)" # 在使用 browserless 的情况下尽量按需设置需要代理的网站 url
            REQUEST_TIMEOUT: 3600000

        depends_on:
            - proxy # 不需要部署 proxy 服务则移除该行
            - browserless
            - redis

    browserless:
        image: browserless/chrome
        restart: always
        environment:
            DEFAULT_BLOCK_ADS: "true"
            DEFAULT_IGNORE_HTTPS_ERRORS: "true"
            # 启动 chrome 实例时的默认参数,若不使用代理则去掉 `--proxy-server` 
            DEFAULT_LAUNCH_ARGS: '["--window-size=375,820","--proxy-server=http://proxy:7890"]' 
            CONNECTION_TIMEOUT: "600000"
        ulimits:
            core:
                hard: 0
                soft: 0
        depends_on:
            - proxy # 不需要部署 proxy 服务则移除该行

    redis:
        image: redis:alpine
        restart: always
        volumes:
            - redis-data:/data

    # 按需添加,不需要则去掉 proxy 相关配置
    proxy:
        image: dreamacro/clash
        restart: always
        ports:
            - "7890:7890"
        volumes:
            # 使用自己的 proxy 配置文件并放置到 `.artifacts` 目录下
            - /root/home/rsshub/app/clash/config.yaml:/root/.config/clash/config.yaml

volumes:
    redis-data:
  • 制作本地脚本卷轴

docker cp rsshub-rsshub-1:/app/lib/config.ts /root/home/rsshub/app/lib/config.ts

docker cp rsshub-rsshub-1:/app/lib/routes/ /root/home/rsshub/app/lib/routes/

  • 操作
// 运行
docker compose up -d

// 修改配置 不需要重新构建
docker compose up -d --no-build

// 停止
docker compose down

// 重启
docker compose restart

// 重启单个
docker compose restart rsshub

测试

curl http://127.0.0.1:1200/xiaohongshu/user/593032945e87e77791e03696/notes

问题

重启服务器问题

  1. 要先启动mysql服务再启动对应node程序
  2. 要重新配置mysql连接