docker搭建nps

yml文件nps-docker-compose.yml

version: "3.7"
services:
  frps:
    image: ffdfgdfg/nps
    container_name: nps
    hostname: frps
    restart: unless-stopped
    ports:
      - "7443:8080"
    #   # - 7400:7400
    #   - 7000:7000
    #   - 8888:8888
    volumes:
      - nps:/conf
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.nps.entrypoints=websecure"
      - "traefik.http.routers.nps.rule=Host(`nps.weiyoun.com`)"
      - "traefik.http.routers.nps.tls.certresolver=lets-encr"
      - traefik.http.routers.nps.service=nps #多路由必须定义不同的服务名
      - "traefik.http.services.nps.loadbalancer.server.port=8080"
      - "traefik.docker.network=proxy"
      # - "traefik.http.routers.frpshttp.entrypoints=websecure"
      # - "traefik.http.routers.frpshttp.rule=Host(`frpshttp.weiyoun.com`)"
      # - "traefik.http.routers.frpshttp.tls.certresolver=lets-encr"
      # - traefik.http.routers.frpshttp.service=frpshttp #多路由必须定义不同的服务名
      # - "traefik.http.services.frpshttp.loadbalancer.server.port=8888"
      # - "traefik.http.routers.a.entrypoints=websecure"
      # - "traefik.http.routers.a.rule=Host(`a.weiyoun.com`)"
      # - "traefik.http.routers.a.tls.certresolver=lets-encr"
      # - traefik.http.routers.a.service=a #多路由必须定义不同的服务名
      # - "traefik.http.services.a.loadbalancer.server.port=8888"
      # # - "traefik.docker.network=proxy"
networks:
  default:
    external:
      name: traefik
volumes:
  nps:

下载配置文件放入映射的文件夹下:

-   下载[conf文件夹](https://minhaskamal.github.io/DownGit/#/home?url=https://github.com/ehang-io/nps/tree/master/conf)并解压,或前往[项目主页](https://github.com/ehang-io/nps)自行下载**(升级请忽略)**
-   继续阅读[文档](https://ehang-io.github.io/nps/#/example)按照不同的启动方式启动**(升级请忽略)**

就可以用域名访问了。

docker安装wagtail探索过程

221205构建成功

[docker安装wagtail核心配置文件]

进入容器报错

[root@iZ8vbajg9wo8iwynfb1lgeZ dc_wagtail]# docker exec -it wagtail bash
OCI runtime exec failed: exec failed: unable to start container process: exec: "bash": executable file not found in $PATH: unknown

由于使用的是python镜像为基础镜像,使用的是精简系统alphine,没有安装bash,只有sh,所以进入容器无法使用bash命令。
需要用python

docker exec -it wagtail python

或者使用

docker exec -it wagtail /bin/sh

查找python位置

/ # find . -name 'python'
./usr/local/bin/python
/ # find . -name 'wagtail'
./usr/local/bin/wagtail
./usr/local/lib/python3.11/site-packages/wagtail
/ # 
/ # wagtail start app
Creating a Wagtail project called app
Success! app has been created
/ # cd app
/app # python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, home, sessions, taggit, wagtailadmin, wagtailcore, wagtaildocs, wagtailembeds, wagtailforms, wagtailimages, wagtailredirects, wagtailsearch, wagtailusers
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK

非交互创建用户

/app # echo "from django.contrib.auth.models import User; User.objects.create_superuser('myadmin', 'myemail@example.com', 'hunter2')" | python manage.py shell
/app # 

在docker中直接搭建时采用如下用户名

# echo "from django.contrib.auth.models import User; User.objects.create_superuser('myadmin', 'myemail@example.com', 'wagtailadmin')" | python manage.py shell

容器内部运行服务日志,不推荐这个开启方法

/app # echo "from django.contrib.auth.models import User; User.objects.create_superuser('myadmin', 'myemail@example.com', 'hunter2')" | python manage.py shell
/app # python manage.py runserverpython manage.py runserver
Unknown command: 'runserverpython'. Did you mean runserver?
Type 'manage.py help' for usage.
/app # python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
December 05, 2022 - 06:21:25
Django version 4.1.3, using settings 'app.settings.dev'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
/app # python manage.py runserver 127.0.0.1:80
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
December 05, 2022 - 06:24:19
Django version 4.1.3, using settings 'app.settings.dev'
Starting development server at http://127.0.0.1:80/
Quit the server with CONTROL-C.

docker中直接运行wagtail会无法访问

/app/app # python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
December 05, 2022 - 07:11:47
Django version 4.1.3, using settings 'app.settings.dev'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

需要指定地址0.0.0.0才行

/app/app # python manage.py runserver 0.0.0.0:8000
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
December 05, 2022 - 07:25:03
Django version 4.1.3, using settings 'app.settings.dev'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.
[05/Dec/2022 07:25:11] "GET / HTTP/1.1" 200 6830
[05/Dec/2022 07:25:11] "GET /static/css/app.css HTTP/1.1" 200 0
[05/Dec/2022 07:25:11] "GET /static/css/welcome_page.css HTTP/1.1" 200 2522
[05/Dec/2022 07:25:11] "GET /static/js/app.js HTTP/1.1" 200 0
Not Found: /favicon.ico
[05/Dec/2022 07:25:11] "GET /favicon.ico HTTP/1.1" 404 3365

wagtail使用域名访问报错

CSRF verification failed. Request aborted.

setting文件增加
**CSRF_TRUSTED_ORIGINS = ['https://wagtail.weiyoun.com/']**
就可以了

改完后记得保存,wagtail会自动重新加载,域名外的方括号是必须的。

参考下面这个很可能可以解决上面问题


> echo "from django.contrib.auth import get_user_model; get_user_model().objects.create_superuser('admin', '', 'changeme')" | python manage.py shell
<!--autointro-->

docker安装wagtail核心配置文件

docker安装wagtail核心配置文件

yml文件

version: '3.7'
services:
  wagtail:
    container_name: wagtail
    # restart: unless-stopped
    image: wagtail:selfV1
    build:
      context: .
      dockerfile: Dockerfile  
    # stdin_open: true
    # tty: true
    volumes:
      - wagtailpython:/usr/local/lib/python3.11
      - wagtailapp:/app
    # ports:
    #   - "5212:8000"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.wagtail.entrypoints=websecure"
      - "traefik.http.routers.wagtail.rule=Host(`wagtail.weiyoun.com`)"
      - "traefik.http.routers.wagtail.tls.certresolver=lets-encr"
      - traefik.http.routers.wagtail.service=wagtail #多路由必须定义不同的服务名
      - "traefik.http.services.wagtail.loadbalancer.server.port=8000"
networks:
  default:
    external:
      name: traefik
volumes:
  wagtailpython:
  wagtailapp:

dockerfile


FROM python:3.11-alpine3.17
LABEL maintainer="weiyoun.com"
# 为了及时输出日志
# 221205报错Watching for file changes with StatReloader
# ENV PYTHONUNBUFFERED 0
ENV PYTHONUNBUFFERED 1
# 保持运行,在docker-compose中添加也可以,放在具体服务的子集中。不添加会因为没有任务而退出容器
ENV stdin_open true
ENV tty true
# pip安装列表,里面写需要pip安装的包
ADD requirements.txt ./
# 安装,构建网站,设置超级用户
RUN pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple \
    && wagtail start app \
    && cd app \
    && python manage.py migrate \
    && echo "from django.contrib.auth.models import User; User.objects.create_superuser('myadmin', 'myemail@example.com', 'wagtailadmin')" | python manage.py shell
# 运行网站不能写入RUN,否则不能成功构建镜像  
    # && python manage.py runserver 0.0.0.0:8000
EXPOSE 8000
VOLUME /app   /usr/local/lib/python3.11
# VOLUME ["/app"]
# VOLUME ["/usr/local/lib/python3.11"]
# VOLUME ["/app","/usr/local/lib/python3.11"]
# VOLUME [/usr/local/lib/python3.11]
# ADD . ./
CMD cd /app \
    && python manage.py runserver 0.0.0.0:8000
# sh: manage.py,: unknown operand
# CMD cd /app \
#     && [ "python", "manage.py", "runserver", "0.0.0.0:8000" ]
# 报错python: can't open file '//manage.py': [Errno 2] No such file or directory
# CMD [ "python", "manage.py", "runserver", "0.0.0.0:8000" ]
# 下面命令导致进入/app/app,wagtail exited with code 0
# CMD cd app \
#     && [ "python manage.py runserver 0.0.0.0:8000" ]
# 会在根目录执行,找不到命令
# CMD [ "python manage.py runserver 0.0.0.0:8000" ]
# 报错python: can't open file '//manage.py': [Errno 2] No such file or directory
# CMD python manage.py runserver 0.0.0.0:8000
# 下面的形式无法正常运行,把"manage.py runserver 0.0.0.0:8000"当成了一个参数,提示没有文件
# CMD [ "python", "manage.py runserver 0.0.0.0:8000" ]

cloudreve搭建过程

最近折腾nextcloud了,但是在我搭建好LNMP环境下安装总是不能完全正常工作。搜索解决办法也无效。所以还是打算再搭建一个cloudreve。
之前用过cloudreve,这个网盘无论搭建还是使用都很简单,界面也很清爽。
![[Pasted image 20221020183935.png]]
以前是直接运行应用程序,然后配置一下就可以了。
这一次打算用docker配置,这样会更方便管理且容易扩展。
下面记录了我的搭建过程。

  1. 创建目录结构
    这一步的目的是为了docker数据的持久化以及配置等文件的放置设置。
    首先进入你想要放置cloudreve的文件夹,运行以下命令:

    mkdir -vp cloudreve/{uploads,avatar} \
    && touch cloudreve/conf.ini \
    && touch cloudreve/cloudreve.db \
    && mkdir -p aria2/config \
    && mkdir -p data/aria2 \
    && chmod -R 777 data/aria2
  2. 新建docker-compose文件
  3. 在当前文件夹下新建docker-compose.yml文件,写入以下内容。
    yml文件内容:

    version: "3.8"
    services:
      cloudreve:
        container_name: cloudreve
        image: cloudreve/cloudreve:latest
        restart: unless-stopped
        ports:
          - "5212:5212"
          - "443:443"
        volumes:
          - temp_data:/data
          # - ./cloudreve:/cloudreve # 221018 add ,error
          - ./cloudreve/uploads:/cloudreve/uploads
          - ./cloudreve/conf.ini:/cloudreve/conf.ini
          - ./cloudreve/cloudreve.db:/cloudreve/cloudreve.db
          - ./cloudreve/avatar:/cloudreve/avatar
        depends_on:
          - aria2
      aria2:
        container_name: aria2
        image: p3terx/aria2-pro
        restart: unless-stopped
        environment:
          - RPC_SECRET=your_aria_rpc_token
          - RPC_PORT=6800
        volumes:
          - ./aria2/config:/config
          - temp_data:/data
    volumes:
      temp_data:
        driver: local
        driver_opts:
          type: none
          device: $PWD/data
          o: bind
  4. 运行docker-compose
    运行docker-compose有两种方式如下:

    # 后台运行模式,可以从 docker/docker-compose 的日志中获取默认管理员账户用户名和密码
    docker-compose up -d
    # 或者,直接运行,log 将会直接输出在当前控制台中,请注意退出之后保持当前容器运行
    docker-compose up

    第二种方式可以看到实时日志,使用<ctrl+z>

用自己的服务器搭建nextcloud网盘方案

背景

最近换了服务器,准备再搭建一下网盘用于以后的使用。
以前用的cloudreve,功能比较简单,由于用得少,渐渐停用了。
这次尝试了nextcloud和seafile。
这次搭建网盘花费了不少时间,因为总是不太顺利。这可能和我对docker不够熟悉有关,另外网盘的搭建教程多少有点不完善。
单单是搭建LNMP环境找合适的dockerfile和yml文件就很不容易。要找到适合自己的只能一步一步学习探索。幸运的是最后终于写出了适合自己的php8.0的dockerfile文件,并且可以正常使用。该文件也已经附在文章当中。希望对你有用。
虽然nextcloud用户比较多,但自己去搭建网盘服务的毕竟是少数。所以有很多问题找不到答案。
因此我把我的搭建过程写下来,给后来的人一些参考,少走一些弯路。不过需要说明的是,本片文章是我对探索出来可用的配置做一个记录,方便今后直接使用。内容比较简单,因此不适合新手当作教程用,因为可能会遇到其他问题不知道怎么解决。这篇文章供有一定基础的人参考,作用在于提供一个核心配置和一点思路。
seafile直接使用官方的方法搭建成功了。但是再启用https的时候又坑,虽然官方说新版本已经解决,但实际上并没有。并且官方给的解决办法不起作用。
seafile整体功能还可以,不过它会创建很多数据库,还有不少服务,再加上界面我也不太喜欢,所以就没用。
nextcloud功能很丰富,界面比较喜欢,不过用了很多方法去搭建,只有一种能完全成功的运行,并且还不确定如果让我再搭建一次还能不能成功。其他的都会有部分功能不正常。已经查明的原因有:

  1. 权限设置不符合程序要求,
  2. nginx配置设置不完善。
    还有些也不知道具体原因,感觉程序日志不完善。
    下面是我安装nextcloud安装方式中的两种方案,一个是使用官方的应用镜像,一个是自己搭好LNMP环境用单文件脚本装的。
    两种方式都是用到docker-compose工具。
    第一种方案所有功能可以正常使用,但是不确定是否可以复现。
    第二种方案基本功能可以正常使用,但是有写功能不能正常加载,目前不清楚原因。

利用官方镜像安装

docker-compose使用的yml文件:

version: "3.4"
services:
  mysql:
    hostname: mysql
    restart: always
    image: mysql:5.6
    container_name: mysql
    ports:
      - "3306:3306"
    volumes:
      - mysql-config:/etc/mysql
      - mysql-log:/var/log/mysql
      - mysql-data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: rootpw
      MYSQL_DATABASE: nextcloud
      MYSQL_USER: user
      MYSQL_PASSWORD: user123
      # sort_buffer_size : 524288 #220920add no use
  cache:
    image: redis
    restart: unless-stopped
    expose:
     - "6379"
    volumes:
     - ./cache:/data
    command: redis-server --requirepass 'redis_password' # 这里的redis_password换成你要配置的redis密码
    # command指的是启动容器后代替默认启动指令来启动服务的指令
  app:
    image: nextcloud:fpm
    restart: unless-stopped
    expose:
     - "9000"
    volumes:
     - ./app/html:/var/www/html
     - ./app/data:/var/www/html/data
     - ./app/config:/var/www/html/config
     - ./app/custom_apps:/var/www/html/custom_apps
    links:
    # links将容器与当前容器链接起来,以使得当前容器可以访问目标容器expose的端口
    # 格式为 容器的原名:映射到当前容器中的名称
     - mysql:mysql
     - cache:cache
    depends_on:
    # 依赖的容器列表,只有这些容器都成功启动了,才会启动当前容器
     - mysql
     - cache
  nginx:
    hostname: nginx
    restart: always
    container_name: nginx
    image: nginx:1.17.0
    ports:
      - "80:80"
      - "443:443"
    links:
      #- "php:php"
      - app:app
    volumes:
      - nginx-config:/etc/nginx
      - nginx-log:/var/log/nginx
      - nginx-html:/usr/share/nginx/html    
      - ./app/html:/var/www/html
      - ./proxy/conf.d:/etc/nginx/conf.d:ro
      - ./proxy/ssl_certs:/etc/nginx/ssl_certs:ro
    depends_on:
     - app
volumes:
  mysql-config:
  mysql-log:
  mysql-data:
  nginx-html:
  php-config:
  nginx-config:
  nginx-log:

搭建LNMP环境后再安装Nextcloud

搭建LNMP环境使用的yml:

version: "3.4"
services:
  mysql:
    hostname: mysql
    restart: always
    image: mysql:5.6
    container_name: mysql
    ports:
      - "3306:3306"
    volumes:
      - /home/mysql-config:/etc/mysql
      - /home/mysql-log:/var/log/mysql
      - /home/mysql-data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: rootpw
      MYSQL_USER: user
      MYSQL_PASSWORD: user123
  php:
    hostname: php
    restart: always
    image: php:8.0
    container_name: php
    build:
      context: ./php
      dockerfile: Dockerfile
    ports:
      - "9000:9000"
    links:
      - mysql:mysql
    volumes:
      - /home/nginx-html:/var/www/html
      - /home/php-workspace:/workspace
      - /home/php-config:/usr/local/etc
    depends_on:
        # 依赖的容器列表,只有这些容器都成功启动了,才会启动当前容器
        - mysql
        - redis      
  nginx:
    hostname: nginx
    restart: always
    container_name: nginx
    image: nginx:1.17.0
    ports:
      - "80:80"
      - "443:443"
    links:
      - "php:php"
    volumes:
      - /home/nginx-config:/etc/nginx
      - /home/nginx-log:/var/log/nginx
      - /home/nginx-html:/usr/share/nginx/html
      # - /home/nginx-config/conf.d:/etc/nginx/conf.d:ro
      # - /home/nginx-config/ssl_certs:/etc/nginx/ssl_certs:ro      
    depends_on:
     - php
  redis:
    image: redis
    restart: unless-stopped
    expose:
      - "6379"
    volumes:
      - /home/redis:/data
    command: redis-server --requirepass 'redis_password' # 这里的redis_password换成你要配置的redis密码
    # command指的是启动容器后代替默认启动指令来启动服务的指令

php的dockerfile:
此文件放入上面yml文件的同级目录的php文件夹下。


FROM php:8.0-fpm
#docker中php扩展安装方式
#1、PHP源码文件目录自带扩展 docker-php-ext-install直接安装
#2、pecl扩展 因为一些扩展不包含在PHP源码文件中,PHP 的扩展库仓库中存在。用 pecl install 安装扩展,再用 docker-php-ext-enable 命令 启用扩展
#3、其他扩展 一些既不在 PHP 源码包,也不再 PECL 扩展仓库中的扩展,可以通过下载扩展程序源码,编译安装的方式安装
#redis扩展 仓库地址 https://pecl.php.net/package/redis
ENV PHPREDIS_VERSION 5.3.4
#memcached扩展 仓库地址 https://pecl.php.net/package/memcached
ENV MEMCACHED_VERSION 3.1.5
#mongodb扩展 https://pecl.php.net/package/mongodb
ENV MONGODB_VERSION 1.11.1
# 设置时间
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && echo 'Asia/Shanghai' <!--autointro-->

误删docker映射文件夹

使用lsof命令查看已经被删除的dc1目录

lsof | grep dc1

报了很多如下错误
lsof: no pwd entry for UID 201
加上-w参数

[root@host dc1]# lsof -w | grep dc1
rsyslogd      958                               root  mem       REG              253,1   8388608   19328181 /var/log/journal/20200914151302543507749550121287/system@648eeedc1a184078a509085b963bf9c5-0000000000000001-0005eb62d7d08cb7.journal
rsyslogd      958                               root   13r      REG              253,1   8388608   19328181 /var/log/journal/20200914151302543507749550121287/system@648eeedc1a184078a509085b963bf9c5-0000000000000001-0005eb62d7d08cb7.journal
rsyslogd      958     967 in:imjour             root  mem       REG              253,1   8388608   19328181 /var/log/journal/20200914151302543507749550121287/system@648eeedc1a184078a509085b963bf9c5-0000000000000001-0005eb62d7d08cb7.journal
rsyslogd      958     967 in:imjour             root   13r      REG              253,1   8388608   19328181 /var/log/journal/20200914151302543507749550121287/system@648eeedc1a184078a509085b963bf9c5-0000000000000001-0005eb62d7d08cb7.journal
rsyslogd      958     973 rs:main               root  mem       REG              253,1   8388608   19328181 /var/log/journal/20200914151302543507749550121287/system@648eeedc1a184078a509085b963bf9c5-0000000000000001-0005eb62d7d08cb7.journal
rsyslogd      958     973 rs:main               root   13r      REG              253,1   8388608   19328181 /var/log/journal/20200914151302543507749550121287/system@648eeedc1a184078a509085b963bf9c5-0000000000000001-0005eb62d7d08cb7.journal
bash      1513232                               root  cwd       DIR              253,1         6    6274715 /var/lib/docker/volumes/dc1 (deleted)
docker-co 1515153                               root  cwd       DIR              253,1         6    6274715 /var/lib/docker/volumes/dc1 (deleted)
docker-co 1515153 1515352 docker-co             root  cwd       DIR              253,1         6    6274715 /var/lib/docker/volumes/dc1 (deleted)
docker-co 1515153 1515353 docker-co             root  cwd       DIR              253,1         6    6274715 /var/lib/docker/volumes/dc1 (deleted)
docker-co 1518112                               root  cwd       DIR              253,1         6    6274715 /var/lib/docker/volumes/dc1 (deleted)
docker-co 1518112 1518233 docker-co             root  cwd       DIR              253,1         6    6274715 /var/lib/docker/volumes/dc1 (deleted)
docker-co 1518112 1518234 docker-co             root  cwd       DIR              253,1         6    6274715 /var/lib/docker/volumes/dc1 (deleted)
docker-co 1525311                               root  cwd       DIR              253,1         6    6274715 /var/lib/docker/volumes/dc1 (deleted)
docker-co 1525311 1525413 docker-co             root  cwd       DIR              253,1         6    6274715 /var/lib/docker/volumes/dc1 (deleted)
docker-co 1525311 1525415 docker-co             root  cwd       DIR              253,1         6    6274715 /var/lib/docker/volumes/dc1 (deleted)
lsof      1537283                               root  cwd       DIR              253,1         6    6274715 /var/lib/docker/volumes/dc1 (deleted)
grep      1537284                               root  cwd       DIR              253,1         6    6274715 /var/lib/docker/volumes/dc1 (deleted)
lsof      1537285                               root  cwd       DIR              253,1         6    6274715 /var/lib/docker/volumes/dc1 (deleted)

[root@host dc1]# cd /proc/1513232/fd
[root@host fd]# ll
total 0
lrwx------ 1 root root 64 Dec  3 15:35 0 -<!--autointro-->

基于docker搭建kodcloud与“Mixed Content”问题解决

221021

布置好后直接用https访问,但一直卡在环境检查部分

按下F2才发现有很多错误
其中一个错误很关键

Mixed Content: The page at 'https://cloud.weiyoun.com/' was loaded over HTTPS, but requested an insecure stylesheet 'http://kodcloud/static/style/dist/main.css'. This request has been blocked; the content must be served over HTTPS.

很明显这是在https条件下访问了http的css资源所以被阻止了。
为了顺利安装,我把防火墙的1111端口开放然后用http访问进入正常的界面。

然后修改配置文件`config/config.php
将【大概在95行代码】:

if(!defined('HOST')){ define('HOST',rtrim(get_host(),'/').'/');} 修改为: if(!defined(‘HOST’)){ define(‘HOST’,’https://你的域名/‘);}
后https可以正常访问了。
![[Pasted image 20221021144104.png]]

整体感觉kodbox这款网盘不错,功能比较丰富,同时速度很快并且资源占用少,搭建问题也少。

搭建使用traefik

1. 创建文件夹和文件

mkdir ~/traefik
cd ~/traefik
mkdir -p data/configurations
touch docker-compose.yml
touch data/traefik.yml
touch data/acme.json
touch data/configurations/dynamic.yml
chmod 600 data/acme.json

2. 配置 docker-compose.yml

文件路径为 ~/traefik/docker-compose.yml

version: '3.7'
services:
traefik:
image: traefik:v2.4
container_name: traefik
restart: always
security_opt:
- no-new-privileges:true
ports:
- 80:80
- 443:443
volumes:
# 如果宿主机是标准 linux 系统,可以设置一下localtime
- /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./data/traefik.yml:/traefik.yml:ro # 映射静态配置文件
- ./data/acme.json:/acme.json # 映射证书文件,SSL 证书申请成功后,就会存在这个文件中
- ./data/configurations:/configurations # 映射动态配置文件
networks:
- traefik
labels:
# 下面这些标签,可以帮助 traefik 正确处理该服务
- 'traefik.enable=true'
- 'traefik.docker.network=traefik' # 指定 docker network
# 指定服务入口为 websecure,websecure 会在静态配置文件traefik.yml中定义
- 'traefik.http.routers.traefik-secure.entrypoints=websecure'
# 定义访问域名,需要做 DNS 解析
- 'traefik.http.routers.traefik-secure.rule=Host(`traefik.yourdomain.com`)'
- 'traefik.http.routers.traefik-secure.middlewares=user-auth@file'
- 'traefik.http.routers.traefik-secure.service=api@internal'
networks:
traefik:
external: true

创建 docker-compose.yml 内需要的 network

docker network create traefik

3. 修改静态配置文件

文件路径为 ~/traefik/data/traefik.yml

api:
  dashboard: true
entryPoints:
  web:
    address: :80
    http:
      redirections:
        entryPoint:
          to: websecure
  websecure:
    address: :443
    http:
      middlewares:
        - secureHeaders@file
        - nofloc@file
      tls:
        certResolver: lets-encr
pilot:
  dashboard: false
providers:
  docker:
    endpoint: 'unix:///var/run/docker.sock'
    exposedByDefault: false
  file:
    filename: /configurations/dynamic.yml # 动态配置文件位置
certificatesResolvers:
  lets-encr:
    acme:
      #caServer: https://acme-staging-v02.api.letsencrypt.org/directory
      storage: acme.json
      email: xxxxxx
      httpChallenge:
        entryPoint: web

4. 修改动态配置文件

文件路径为 ~/traefik/data/configurations/dynamic.yml

# Dynamic configuration
http:
middlewares:
nofloc:
headers:
customResponseHeaders:
Permissions-Policy: 'interest-cohort=()'
secureHeaders:
headers:
sslRedirect: true
forceSTSHeader: true
stsIncludeSubdomains: true
stsPreload: true
stsSeconds: 31536000
# UserName : admin
# Password : qwer1234
user-auth:
basicAuth:
# users 选项是认证用户的列表
# 使用 echo $(htpasswd -nb user password) | sed -e s/\\$/\\$\\$/g
# 来创建 user:password 键值对
users:
- 'admin:$apr1$tm53ra6x$FntXd6jcvxYM/YH0P2hcc1'
tls:
options:
default:
cipherSuites:
- TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
- TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
- TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
- TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
- TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305
- TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305
minVersion: VersionTLS12

5. 解析域名

在 docker-compose.yml 中,我们指定了使用 traefik.yourdomain.com 作为访问域名。因此,我们需要将 traefik.yourdomain.com 解析至 traefik 服务入口 IP 地址。

frp点对点内网穿透

点对点内网穿透

这个示例将会演示一种不通过服务器中转流量的方式来访问内网服务。

frp 提供了一种新的代理类型 xtcp 用于应对在希望传输大量数据且流量不经过服务器的场景。

使用方式同 stcp 类似,需要在两边都部署上 frpc 用于建立直接的连接。

目前处于开发的初级阶段,并不能穿透所有类型的 NAT 设备,所以穿透成功率较低。穿透失败时可以尝试 stcp 的方式。

  1. frps.ini 内容如下,需要额外配置监听一个 UDP 端口用于支持该类型的客户端:

    [common]
    bind_port = 7000
    bind_udp_port = 7000
  2. 在需要暴露到外网的机器上部署 frpc,且配置如下:

    [common]
    server_addr = x.x.x.x
    server_port = 7000
    [p2p_ssh]
    type = xtcp
    # 只有 sk 一致的用户才能访问到此服务
    sk = abcdefg
    local_ip = 127.0.0.1
    local_port = 22
  3. 在想要访问内网服务的机器上也部署 frpc,且配置如下:

    [common]
    server_addr = x.x.x.x
    server_port = 7000
    [p2p_ssh_visitor]
    type = xtcp
    # xtcp 的访问者
    role = visitor
    # 要访问的 xtcp 代理的名字
    server_name = p2p_ssh
    sk = abcdefg
    # 绑定本地端口用于访问 ssh 服务
    bind_addr = 127.0.0.1
    bind_port = 6000
  4. 通过 SSH 访问内网机器,假设用户名为 test:

    ssh -oPort=6000 test@127.0.0.1