1 云服务器已安装应用列表

  • nginx_1.14.0
  • docker
  • docker-compose
  • portainer.io (docker)
  • mysql_5.7.30 (docker)
  • redis_6.2.1 (docker)
  • mongo_4.1.7 (docker)
  • halo (docker)
  • bark-server (docker)
  • xxl-job-admin (docker)
  • cloudreve_3.3.2
  • aliyundriver (docker)
  • simple-tool (docker)
  • mysql-clinet
  • davfs2
  • automysqlbakup

2 linux应用

2.1 nginx_1.14.0

安装ngix

sudo apt update
sudo apt install nginx

配置反向代理(https)(以portainer.foraixh.xyz举例)

  1. 申请https证书
  2. 配置云解析(为域名portainer.foraixh.xyz配置解析到服务器公网IP)
  3. 证书解压到指定文件(如/etc/nginx/cert)
  4. 增加portainer.foraixh.xyz的解析配置(如下)
events {}
http {
    client_max_body_size 20m;
    
	# portainer配置
    server {
      listen 443 ssl;
      #配置HTTPS的默认访问端口为443。
      #如果未在此处配置HTTPS的默认访问端口,可能会造成Nginx无法启动。
      #如果您使用Nginx 1.15.0及以上版本,请使用listen 443 ssl代替listen 443和ssl on。
      #需要将yourdomain.com替换成证书绑定的域名。
      server_name portainer.foraixh.xyz;

      if ($http_host ~* "^(.*?)\.foraixh\.xyz$") {    #正则表达式
         set $domain $1;                     #设置变量
      }

      root html;
      index index.html index.htm;
      ssl_certificate cert/portainer.foraixh.xyz.pem;  #需要将cert-file-name.pem替换成已上传的证书文件的名称 。
      ssl_certificate_key cert/portainer.foraixh.xyz.key; #需要将cert-file-name.key替换成已上传的证书密钥文件的名称。
      ssl_session_timeout 5m;
      ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
      #表示使用的加密套件的类型。
      ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #表示使用的TLS协议的类型。
      ssl_prefer_server_ciphers on;
      location / {
        if ($domain ~* "portainer") {
     			# 将portainer.foraixh.xyz反向代理到对应服务
                proxy_pass http://127.0.0.1:8080;
        }
        
        proxy_set_header HOST $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      }
    }
}
# 重启nginx服务即可生效
nginx service restart

2.2 docker

https://docs.docker.com/engine/install/ubuntu/

2.3 docker-compose

https://docs.docker.com/compose/install/

2.4 cloudreve_3.3.2

2.4.1 下载cloudreve

cd /home
mkdir cloudreve && cd
wget https://github.com/cloudreve/Cloudreve/releases/download/3.3.2/cloudreve_3.3.2_linux_amd64.tar.gz

2.4.2 创建数据库cloudreve

create user cloudreve identified by 'cloudreve';
CREATE database if NOT EXISTS `cloudreve` default character set utf8mb4 collate utf8mb4_unicode_ci;
grant all privileges on cloudreve.* to cloudreve@'%' identified by 'cloudreve';
flush privileges;

2.4.3 编写配置文件conf.ini

[System]
; 运行模式
Mode = master
; 监听端口
Listen = :25000
; 是否开启 Debug
Debug = false
; Session 密钥, 一般在首次启动时自动生成
SessionSecret = 
; Hash 加盐, 一般在首次启动时自动生成
HashIDSalt =

; SSL 相关
;[SSL]
; SSL 监听端口
;Listen = :443
; 证书路径
;CertPath = C:\Users\i\Documents\fullchain.pem
; 私钥路径
;KeyPath = C:\Users\i\Documents\privkey.pem

; 启用 Unix Socket 监听
[UnixSocket]
;Listen = /run/cloudreve/cloudreve.sock

; 数据库相关,如果你只想使用内置的 SQLite数据库,这一部分直接删去即可
[Database]
; 数据库类型,目前支持 sqlite/mysql/mssql/postgres
Type = mysql
; MySQL 端口
Port = 3306
; 用户名
User = cloudreve
; 密码
Password = cloudreve
; 数据库地址
Host = 127.0.0.1
; 数据库名称
Name = cloudreve
; 数据表前缀
TablePrefix = cr_
; 字符集
Charset = utf8
; SQLite 数据库文件路径
;DBFile = cloudreve.db

; 从机模式下的配置
[Slave]
; 通信密钥
;Secret = 1234567891234567123456789123456712345678912345671234567891234567
; 回调请求超时时间 (s)
;CallbackTimeout = 20
; 签名有效期
;SignatureTTL = 60

; 跨域配置
[CORS]
AllowOrigins = *
AllowMethods = OPTIONS,GET,POST
AllowHeaders = *
AllowCredentials = false

; Redis 相关
[Redis]
Server = 127.0.0.1:6379
Password = cloudreve
DB = 0

; 从机模式缩略图
[Thumbnail]
;MaxWidth = 400
;MaxHeight = 300
;FileSuffix = ._thumb

2.4.4 进程守护配置

# 编辑配置文件
vim /usr/lib/systemd/system/cloudreve.service
[Unit]
Description=Cloudreve
Documentation=https://docs.cloudreve.org
After=network.target
Wants=network.target

[Service]
WorkingDirectory=/home/cloudreve
ExecStart=/home/cloudreve/cloudreve -c /home/cloudreve/conf.ini
Restart=on-abnormal
RestartSec=5s
KillMode=mixed

StandardOutput=/home/cloudreve/log/log.log
StandardError=syslog

[Install]
WantedBy=multi-user.target
# 更新配置
systemctl daemon-reload
# 启动服务
systemctl restart cloudreve
# 设置开机启动
systemctl enable cloudreve
#查看日志
journalctl -u cloudreve.service -f 

2.4.5 登陆检查

登陆并修改管理员密码(管理员密码会在日志中打印输出)

2.5 mysql-clinet

sudo apt-get install mysql-client

2.6 davfs2

sudo apt-get install davfs2

2.7 automysqlbakup

https://www.cnblogs.com/tinywan/p/9891160.html

3 docker应用

3.1 portainer.io

https://docs.portainer.io/v/ce-2.9/start/install/server/docker/linux

3.2 mysql_5.7.30

配置docker-compose.yml文件

version: '3'
services:
  #服务名称
  mysql:
   #容器名称
   container_name: mysql-5.7.30
   #镜像名称
   image: mysql:5.7.30
   #自动启动
   restart: always
   #端口映射
   ports:
     - "3306:3306"
   #环境变量
   environment:
     - MYSQL_ROOT_PASSWORD=root-password
     - MYSQL_USER=user
     - MYSQL_PASS=password
   #挂载
   volumes:
     - /home/ubuntu/docker-iamges/mysql-5.7.30/conf.d:/etc/mysql/conf.d
     - /home/ubuntu/docker-iamges/mysql-5.7.30/logs:/logs
     - /home/ubuntu/docker-iamges/mysql-5.7.30/data:/var/lib/mysql

启动容器,进入容器配置用户和数据库

docker-compose up -d
docker exec -it mysql-5.7.30 bash

create user username identified by 'password';
CREATE database if NOT EXISTS `database` default character set utf8mb4 collate utf8mb4_unicode_ci;
grant all privileges on database.* to username@'%' identified by 'password';
flush privileges;

3.3 redis_6.2.1

配置docker-compose.yml文件并启动容器

version: '3'
redis:
  image: redis
  #容器名称
  container_name: redis
  restart: always
  ports:
    - 6379:6379
  volumes:
    - /home/ubuntu/docker-iamges/redis:/home/docker/redis/data
  # redis启动命令;并配置密码
  command: redis-server --appendonly yes --requirepass "redis-password"

3.4 mongo_4.1.7

安装mongo并配置副本集模式

docker network create my-mongo-cluster
mongo:
  image: mongo:4.1.7
  container_name: "mongo"
  net: "my-mongo-cluster"
  ports:
    - "27017:27017"
  command: mongod --replSet mongoreplset --bind_ip_all --auth

启动容器并进入容易,登陆mongo配置副本集

db.createUser({user: 'root', pwd: 'password', roles: ['root']})
db.auth('root', 'password') 
db.createUser({user:'dbuser',pwd:'dbpassword',roles: [{role:'readWrite',db:'db'}]})
 
config = {"_id" : "mongoreplset","protocolVersion" : 1,"members" : [{"_id" : 0,"host" : "ip:27017"}]}
rs.initiate(config) 
rs.reconfig(config, {force:true})
rs.conf()

3.5 halo

https://docs.halo.run/getting-started/install/docker

3.6 xxl-job-admin

1 创建数据库

create user xxladmin identified by '123456';
CREATE database if NOT EXISTS `xxl_job` default character set utf8mb4 collate utf8mb4_unicode_ci;
grant all privileges on xxl_job.* to xxladmin@'%' identified by '123456';
flush privileges;

2 运行初始化脚本

#
# XXL-JOB v2.3.0
# Copyright (c) 2015-present, xuxueli.

CREATE database if NOT EXISTS `xxl_job` default character set utf8mb4 collate utf8mb4_unicode_ci;
use `xxl_job`;

SET NAMES utf8mb4;

CREATE TABLE `xxl_job_info` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `job_group` int(11) NOT NULL COMMENT '执行器主键ID',
  `job_desc` varchar(255) NOT NULL,
  `add_time` datetime DEFAULT NULL,
  `update_time` datetime DEFAULT NULL,
  `author` varchar(64) DEFAULT NULL COMMENT '作者',
  `alarm_email` varchar(255) DEFAULT NULL COMMENT '报警邮件',
  `schedule_type` varchar(50) NOT NULL DEFAULT 'NONE' COMMENT '调度类型',
  `schedule_conf` varchar(128) DEFAULT NULL COMMENT '调度配置,值含义取决于调度类型',
  `misfire_strategy` varchar(50) NOT NULL DEFAULT 'DO_NOTHING' COMMENT '调度过期策略',
  `executor_route_strategy` varchar(50) DEFAULT NULL COMMENT '执行器路由策略',
  `executor_handler` varchar(255) DEFAULT NULL COMMENT '执行器任务handler',
  `executor_param` varchar(512) DEFAULT NULL COMMENT '执行器任务参数',
  `executor_block_strategy` varchar(50) DEFAULT NULL COMMENT '阻塞处理策略',
  `executor_timeout` int(11) NOT NULL DEFAULT '0' COMMENT '任务执行超时时间,单位秒',
  `executor_fail_retry_count` int(11) NOT NULL DEFAULT '0' COMMENT '失败重试次数',
  `glue_type` varchar(50) NOT NULL COMMENT 'GLUE类型',
  `glue_source` mediumtext COMMENT 'GLUE源代码',
  `glue_remark` varchar(128) DEFAULT NULL COMMENT 'GLUE备注',
  `glue_updatetime` datetime DEFAULT NULL COMMENT 'GLUE更新时间',
  `child_jobid` varchar(255) DEFAULT NULL COMMENT '子任务ID,多个逗号分隔',
  `trigger_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '调度状态:0-停止,1-运行',
  `trigger_last_time` bigint(13) NOT NULL DEFAULT '0' COMMENT '上次调度时间',
  `trigger_next_time` bigint(13) NOT NULL DEFAULT '0' COMMENT '下次调度时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `xxl_job_log` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `job_group` int(11) NOT NULL COMMENT '执行器主键ID',
  `job_id` int(11) NOT NULL COMMENT '任务,主键ID',
  `executor_address` varchar(255) DEFAULT NULL COMMENT '执行器地址,本次执行的地址',
  `executor_handler` varchar(255) DEFAULT NULL COMMENT '执行器任务handler',
  `executor_param` varchar(512) DEFAULT NULL COMMENT '执行器任务参数',
  `executor_sharding_param` varchar(20) DEFAULT NULL COMMENT '执行器任务分片参数,格式如 1/2',
  `executor_fail_retry_count` int(11) NOT NULL DEFAULT '0' COMMENT '失败重试次数',
  `trigger_time` datetime DEFAULT NULL COMMENT '调度-时间',
  `trigger_code` int(11) NOT NULL COMMENT '调度-结果',
  `trigger_msg` text COMMENT '调度-日志',
  `handle_time` datetime DEFAULT NULL COMMENT '执行-时间',
  `handle_code` int(11) NOT NULL COMMENT '执行-状态',
  `handle_msg` text COMMENT '执行-日志',
  `alarm_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '告警状态:0-默认、1-无需告警、2-告警成功、3-告警失败',
  PRIMARY KEY (`id`),
  KEY `I_trigger_time` (`trigger_time`),
  KEY `I_handle_code` (`handle_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `xxl_job_log_report` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `trigger_day` datetime DEFAULT NULL COMMENT '调度-时间',
  `running_count` int(11) NOT NULL DEFAULT '0' COMMENT '运行中-日志数量',
  `suc_count` int(11) NOT NULL DEFAULT '0' COMMENT '执行成功-日志数量',
  `fail_count` int(11) NOT NULL DEFAULT '0' COMMENT '执行失败-日志数量',
  `update_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `i_trigger_day` (`trigger_day`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `xxl_job_logglue` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `job_id` int(11) NOT NULL COMMENT '任务,主键ID',
  `glue_type` varchar(50) DEFAULT NULL COMMENT 'GLUE类型',
  `glue_source` mediumtext COMMENT 'GLUE源代码',
  `glue_remark` varchar(128) NOT NULL COMMENT 'GLUE备注',
  `add_time` datetime DEFAULT NULL,
  `update_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `xxl_job_registry` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `registry_group` varchar(50) NOT NULL,
  `registry_key` varchar(255) NOT NULL,
  `registry_value` varchar(255) NOT NULL,
  `update_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `i_g_k_v` (`registry_group`,`registry_key`,`registry_value`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `xxl_job_group` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `app_name` varchar(64) NOT NULL COMMENT '执行器AppName',
  `title` varchar(12) NOT NULL COMMENT '执行器名称',
  `address_type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '执行器地址类型:0=自动注册、1=手动录入',
  `address_list` text COMMENT '执行器地址列表,多地址逗号分隔',
  `update_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `xxl_job_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(50) NOT NULL COMMENT '账号',
  `password` varchar(50) NOT NULL COMMENT '密码',
  `role` tinyint(4) NOT NULL COMMENT '角色:0-普通用户、1-管理员',
  `permission` varchar(255) DEFAULT NULL COMMENT '权限:执行器ID列表,多个逗号分割',
  PRIMARY KEY (`id`),
  UNIQUE KEY `i_username` (`username`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `xxl_job_lock` (
  `lock_name` varchar(50) NOT NULL COMMENT '锁名称',
  PRIMARY KEY (`lock_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO `xxl_job_group`(`id`, `app_name`, `title`, `address_type`, `address_list`, `update_time`) VALUES (1, 'xxl-job-executor-sample', '示例执行器', 0, NULL, '2018-11-03 22:21:31' );
INSERT INTO `xxl_job_info`(`id`, `job_group`, `job_desc`, `add_time`, `update_time`, `author`, `alarm_email`, `schedule_type`, `schedule_conf`, `misfire_strategy`, `executor_route_strategy`, `executor_handler`, `executor_param`, `executor_block_strategy`, `executor_timeout`, `executor_fail_retry_count`, `glue_type`, `glue_source`, `glue_remark`, `glue_updatetime`, `child_jobid`) VALUES (1, 1, '测试任务1', '2018-11-03 22:21:31', '2018-11-03 22:21:31', 'XXL', '', 'CRON', '0 0 0 * * ? *', 'DO_NOTHING', 'FIRST', 'demoJobHandler', '', 'SERIAL_EXECUTION', 0, 0, 'BEAN', '', 'GLUE代码初始化', '2018-11-03 22:21:31', '');
INSERT INTO `xxl_job_user`(`id`, `username`, `password`, `role`, `permission`) VALUES (1, 'admin', 'e10adc3949ba59abbe56e057f20f883e', 1, NULL);
INSERT INTO `xxl_job_lock` ( `lock_name`) VALUES ( 'schedule_lock');

commit;

3 拉取docker镜像

docker pull xuxueli/xxl-job-admin:2.3.0

4 自定义配置文件

### web
server.port=8080
server.servlet.context-path=/xxl-job-admin

### actuator
management.server.servlet.context-path=/actuator
management.health.mail.enabled=false

### resources
spring.mvc.servlet.load-on-startup=0
spring.mvc.static-path-pattern=/static/**
spring.resources.static-locations=classpath:/static/

### freemarker
spring.freemarker.templateLoaderPath=classpath:/templates/
spring.freemarker.suffix=.ftl
spring.freemarker.charset=UTF-8
spring.freemarker.request-context-attribute=request
spring.freemarker.settings.number_format=0.##########

### mybatis
mybatis.mapper-locations=classpath:/mybatis-mapper/*Mapper.xml
#mybatis.type-aliases-package=com.xxl.job.admin.core.model

### xxl-job, datasource
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=xxladmin
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

### datasource-pool
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.minimum-idle=10
spring.datasource.hikari.maximum-pool-size=30
spring.datasource.hikari.auto-commit=true
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.pool-name=HikariCP
spring.datasource.hikari.max-lifetime=900000
spring.datasource.hikari.connection-timeout=10000
spring.datasource.hikari.connection-test-query=SELECT 1
spring.datasource.hikari.validation-timeout=1000

### xxl-job, email
spring.mail.host=smtp.qq.com
spring.mail.port=25
spring.mail.from=**@qq.com
spring.mail.username=**@qq.com
spring.mail.password=******
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory

### xxl-job, access token
xxl.job.accessToken=

### xxl-job, i18n (default is zh_CN, and you can choose "zh_CN", "zh_TC" and "en")
xxl.job.i18n=zh_CN

## xxl-job, triggerpool max size
xxl.job.triggerpool.fast.max=20
xxl.job.triggerpool.slow.max=10

### xxl-job, log retention days
xxl.job.logretentiondays=30

5 创建容器并运行

docker run -p 8080:8080 -e JAVA_OPTS=-Xmx256m -v /home/xxl-job/application.properties:/application.properties -v /tmp:/data/applogs  -e PARAMS='--spring.config.location=/application.properties' --restart always --name xxl-job-admin  -d xuxueli/xxl-job-admin:2.3.0

6 登陆后台并修改密码

http://127.0.0.1:8080/xxl-job-admin

3.7 aliyundriver

配置文件docker-compose.yml

# 部署阿里云盘dav
version: "3.0"
services:
  webdav-aliyundriver:
    image: zx5253/webdav-aliyundriver
    container_name: aliyundriver
    environment:
      - TZ=Asia/Shanghai
      - ALIYUNDRIVE_REFRESH_TOKEN=*******
      - ALIYUNDRIVE_AUTH_USER-NAME=123456
      - ALIYUNDRIVE_AUTH_PASSWORD=123456
      - JAVA_OPTS=-Xmx128m
    volumes:
      - /home/ubuntu/docker-iamges/webdav-aliyundriver/:/etc/aliyun-driver/
      - /etc/localtime:/etc/localtime 
    ports:
      - 8080:8080
    restart: always

启动容器,则对外暴露了阿里云盘的webdav服务

3.8 simple-tool_1.0.0

简单的工具应用,当前支持公交到站提醒

应用打成jar包上传到服务器,构建docker镜像,生成容器启动,配合xxl_job可实现定时公交到站提醒服务

使用jar包构建docker镜像

# 该镜像需要依赖的基础镜像
FROM openjdk:17

# 将当前目录下的jar包复制到docker容器的/目录下
ADD simple-tool-1.0.0.RELEASE.jar /simple-tool-1.0.0.RELEASE.jar

# 解决Docker容器时区问题
ENV TIME_ZONE=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TIME_ZONE /etc/localtime && echo $TIME_ZONE > /etc/timezone

# 运行过程中创建一个simple-tool-1.0.0.RELEASE.jar文件
RUN bash -c 'touch /simple-tool-1.0.0.RELEASE.jar'

# 声明服务运行在26666端口
EXPOSE 26666

# 指定docker容器启动时运行jar包
ENTRYPOINT ["java", "-jar","/simple-tool-1.0.0.RELEASE.jar"]

# 指定维护者的名字
MAINTAINER foraixh
docker build /home/simple-tool/ -t  foraixh/simple-tool:1.0.0

生成容器启动

docker run -d -p 26666:26666 -v /etc/localtime:/etc/localtime  --name simple-tool --restart always foraixh/simple-tool:1.0.0