本文最后更新于 2024-08-14,

若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益, 请联系我 删除。

本站只有Telegram群组为唯一交流群组, 点击加入

文章内容有误?申请成为本站文章修订者或作者? 向站长提出申请

优点

极速搭建

一键安装脚本,降低部署门槛,快速搭建系统

国际化

系统语言支持中文/English/한국인/فارسی

多代理支持

节点类型支持Xray/Trojan-Go/Hysteria/NaiveProxy

分布式

前后端分离开发,减少模块之间耦合度,可以自由组合部署在多个服务器

功能强大

支持登录注册/用户管理/节点管理/邮件管理/黑名单管理/自定义伪装网站/系统看板等

所见即所得

支持多节点管理,自动化管理远程节点,自动化申请/续签证书,面板内编辑节点,远程服务实时修改节点配置

自动安装教程

#准备

#系统要求

系统:: CentOS 7+ / Ubuntu 18+ / Debian 10+

CPU: linux/amd64 / linux/arm/v6 / linux/arm/v7 / linux/arm64 / linux/s390x / linux/ppc64le / linux/386

内存: ≥ 1G

#相关端口

端口描述
80伪装Web
8863Caddy/Nginx转发
8888Trojan Panel前端
8081Trojan Panel后端
8082Trojan Panel Core
8100Trojan Panel Core API端口
9507MariaDB
6378Redis

提示:

  1. 如果使用的服务器控制面板有防火墙设置需要自己在控制面板自行开放以上端口。
  2. 如果没有没有远程节点,尽量关闭 95076378端口。

#注意

  1. 控制面板和节点都推荐部署在国外服务器上,否则会由于网络问题使用一键安装脚本会因为远程下载文件超时报错。
  2. 提前准备一个解析到服务的二级域名
  3. 数据库和Redis的密码尽量设置复杂(数据库密码不支持部分特殊字符),否则存在被撞库的安全风险。
  4. 建议的安装顺序: 网络加速 > Trojan Panel Backend > Trojan Panel Frontend -> Trojan Panel Core
    建议在脚本运行中需要手动输入的部分,如果没有特殊需求或者不知道这个选项是干什么的, 除数据库密码和Redis密码自定义以外,其他默认即可
  5. 如果是远程多节点的情况,节点服务器只需要安装一次Trojan Panel Core,在面板界面才可以操作远程服务器从而远程自动化管理节点。
  6. 如果使用Caddy2自动申请/续签证书,需要开放Caddy端口(默认80)并且保证Caddy端口没有被其他进程占用

#一键安装脚本

  1. 联机版(推荐)
    source <(curl -L https://github.com/trojanpanel/install-script/raw/main/install_script.sh)
    
    
  2. 单机版
    source <(curl -L https://github.com/trojanpanel/install-script/raw/main/install_script_standalone.sh)
    
  3. 安装旧版(opens new window)

#安装Trojan Panel

  1. 设置伪装Web

推荐使用Caddy 2,可以作为伪装Web也可以自动申请/续签证书。

  1. 请输入Caddy的端口(默认:80)

默认即可,除非80端口被墙或者被其他进程占用。

  1. 请输入Caddy的转发端口(用于申请证书,默认:8863)

默认即可,除非8863端口被墙。

  1. 请输入你的域名(必填)

输入你提前解析到本机的域名。

  1. 请输入你的邮箱(可选)

默认即可,或输入一个合法的邮箱地址。

  1. 请选择设置证书的方式?(1/自动申请和续签证书 2/手动设置证书路径 默认:1/自动申请和续签证书)

推荐自动申请和续签证书,如果自己有证书或者自动申请和续签证书失败可以选择手动设置证书路径(24小时内申请2次以上可能会导致自动申请证书失败,如果搭建频繁,建议选择手动设置证书路径)。

  1. 请选择申请证书的方式(1/acme 2/zerossl 默认:1/acme)

默认即可,选择自动申请证书的方式。

  1. 请输入证书的.crt文件路径(必填)

使用.crt文件的绝对路径,例如:/root/www.google.com.crt

  1. 请输入证书的.key文件路径(必填)

使用.key文件的绝对路径,例如:/root/www.google.com.key

  1. 请输入数据库的用户名(默认:root)

默认即可,除非有自定义数据库用户的需求。

  1. 请输入数据库的密码(必填)

输入一个较为复杂且你能记得住的密码。

  1. 请输入Redis的密码(必填)

输入一个较为复杂且你能记得住的密码。

  1. 请输入数据库的IP地址(默认:本地数据库)

如果数据库安装在本机则默认即可,如果数据库安装在其他服务器这里填远程服务器的IP地址。

  1. 请输入数据库的端口(默认:本地数据库端口)

如果数据库安装在本机则默认即可,如果数据库安装在其他服务器这里填远程服务器的数据库端口。

  1. 请输入数据库的用户名(默认:root)

默认即可,除非有自定义数据库用户的需求。

  1. 请输入数据库的密码(必填)

如果数据库安装在本机则填写本机数据库密码,如果数据库安装在其他服务器这里填远程服务器的数据库密码。

  1. 请输入Redis的IP地址(默认:本机Redis)

如果Redis安装在本机则默认即可,如果Redis安装在其他服务器这里填远程服务器的IP地址。

  1. 请输入Redis的端口(默认:本机Redis端口)

如果Redis安装在本机则默认即可,如果Redis安装在其他服务器这里填远程服务器的Redis端口。

  1. 请输入Redis的密码(必填)

如果Redis安装在本机则填写本机Redis密码,如果Redis安装在其他服务器这里填远程服务器的Redis密码。

  1. 请输入Trojan Panel前端端口(默认:8888)

默认即可,除非有自定义Trojan Panel前端端口的需求。

  1. 请选择Trojan Panel前端是否开启https?(0/关闭 1/开启 默认:1/开启)

默认即可,除非有自定义择Trojan Panel前端是否开启https的需求。如果开启https,则管理面板地址为 https://你的域名:端口 ,如果未开启https,则管理面板地址为 http://你的域名:端口

提示

  1. 安装结束后,访问你的域名如果是一个静态网页,说明已经安装成功。
  2. 安装成功后,Trojan Panel管理面板地址: 你的域名:8888 系统管理员 默认用户名: sysadmin 默认密码: 123456 请及时登陆管理面板修改密码。

#安装Trojan Panel Core

  1. 请输入数据库的IP地址(默认:本地数据库)

如果数据库安装在本机则默认即可,如果数据库安装在其他服务器这里填远程服务器的IP地址。

  1. 请输入数据库的端口(默认:本地数据库端口)

如果数据库安装在本机则默认即可,如果数据库安装在其他服务器这里填远程服务器的数据库端口。

  1. 请输入数据库的用户名(默认:root)

默认即可,除非有自定义数据库用户的需求。

  1. 请输入数据库的密码(必填)

如果数据库安装在本机则填写本机数据库密码,如果数据库安装在其他服务器这里填远程服务器的数据库密码。

  1. 请输入数据库名称(默认:trojan_panel_db)

默认即可,除非有自定义数据库名称的需求。

  1. 请输入数据库的用户表名称(默认:account)

默认即可,除非有自定义数据库的用户表的需求。

  1. 请输入Redis的IP地址(默认:本机Redis)

如果Redis安装在本机则默认即可,如果Redis安装在其他服务器这里填远程服务器的IP地址。

  1. 请输入Redis的端口(默认:本机Redis端口)

如果Redis安装在本机则默认即可,如果Redis安装在其他服务器这里填远程服务器的Redis端口。

  1. 请输入Redis的密码(必填)

如果Redis安装在本机则填写本机Redis密码,如果Redis安装在其他服务器这里填远程服务器的Redis密码。

  1. 请输入API的端口(默认:8100)

默认即可,除非8100端口被墙。

手动安装教程

#准备

#安装顺序

Docker -> Caddy2 -> MariaDB -> Redis -> Trojan Panel Backend -> Trojan Panel Frontend -> Trojan Panel Core

#版本对应关系

名称版本
Dockerlatest
Nginx1.20-alpine
Caddy22.6.2
MariaDB10.7.3
Redis6.2.7
Trojan Panel Frontendlatest
Trojan Panel Backendlatest
Trojan Panel Corelatest

#安装Docker

Docker官方安装教程:https://docs.docker.com/engine/install/

#安装Caddy2

Docker Hub:https://hub.docker.com/\_/caddy

  1. Pull the image
    docker pull caddy:2.6.2
    
            Copied!
    
    
  2. Start a container
    docker run -d --name trojan-panel-caddy --restart always \
    --network=host \
    -v "${CADDY_CONFIG}":"${CADDY_CONFIG}" \
    -v ${CERT_PATH}:"/tpdata/cert/certificates/acme-v02.api.letsencrypt.org-directory/${domain}/" \
    -v ${WEB_PATH}:${WEB_PATH} \
    -v ${CADDY_LOG}:${CADDY_LOG} \
    caddy:2.6.2 caddy run --config ${CADDY_CONFIG}
    
            Copied!
    
    

参数解释:

  • --name trojan-panel-redis:定义容器的名称
  • --restart always:容器随着Docker启动而启动
  • --network=host:使用Host网络模式
  • -v "${CADDY_CONFIG}":"${CADDY_CONFIG}":映射Caddy配置文件
  • -v ${CERT_PATH}:"/tpdata/cert/certificates/acme-v02.api.letsencrypt.org-directory/${domain}/":映射证书文件夹
  • -v ${WEB_PATH}:${WEB_PATH}:映射伪装网站文件夹
  • -v ${CADDY_LOG}:${CADDY_LOG}:日志文件夹
  • caddy run --config ${CADDY_CONFIG}:指定配置文件运行

Caddy配置举例

  1. acme自动申请和续签
{
    "admin":{
        "disabled":true
    },
    "logging":{
        "logs":{
            "default":{
                "writer":{
                    "output":"file",
                    "filename":"${CADDY_LOG}error.log"
                },
                "level":"ERROR"
            }
        }
    },
    "storage":{
        "module":"file_system",
        "root":"${CERT_PATH}"
    },
    "apps":{
        "http":{
            "http_port": ${caddy_port},
            "servers":{
                "srv0":{
                    "listen":[
                        ":${caddy_port}"
                    ],
                    "routes":[
                        {
                            "match":[
                                {
                                    "host":[
                                        "${domain}"
                                    ]
                                }
                            ],
                            "handle":[
                                {
                                    "handler":"static_response",
                                    "headers":{
                                        "Location":[
                                            "https://{http.request.host}:${caddy_remote_port}{http.request.uri}"
                                        ]
                                    },
                                    "status_code":301
                                }
                            ]
                        }
                    ]
                },
                "srv1":{
                    "listen":[
                        ":${caddy_remote_port}"
                    ],
                    "routes":[
                        {
                            "handle":[
                                {
                                    "handler":"subroute",
                                    "routes":[
                                        {
                                            "match":[
                                                {
                                                    "host":[
                                                        "${domain}"
                                                    ]
                                                }
                                            ],
                                            "handle":[
                                                {
                                                    "handler":"file_server",
                                                    "root":"${WEB_PATH}",
                                                    "index_names":[
                                                        "index.html",
                                                        "index.htm"
                                                    ]
                                                }
                                            ],
                                            "terminal":true
                                        }
                                    ]
                                }
                            ]
                        }
                    ],
                    "tls_connection_policies":[
                        {
                            "match":{
                                "sni":[
                                    "${domain}"
                                ]
                            }
                        }
                    ],
                    "automatic_https":{
                        "disable":true
                    }
                }
            }
        },
        "tls":{
            "certificates":{
                "automate":[
                    "${domain}"
                ]
            },
            "automation":{
                "policies":[
                    {
                        "issuers":[
                            {
                                "module":"acme",
                                "email":""
                            }
                        ]
                    }
                ]
            }
        }
    }
}
 
        Copied!
  

参数解释:

  • ${CADDY_LOG}:日志文件夹
  • ${CERT_PATH}:证书文件夹
  • ${caddy_port}:Caddy端口
  • ${domain}:你的域名
  • ${caddy_remote_port}:Caddy转发的端口
  • ${WEB_PATH}:伪装网站文件夹
  1. 手动设置自定义证书
{
    "admin":{
        "disabled":true
    },
    "logging":{
        "logs":{
            "default":{
                "writer":{
                    "output":"file",
                    "filename":"${CADDY_LOG}error.log"
                },
                "level":"ERROR"
            }
        }
    },
    "storage":{
        "module":"file_system",
        "root":"${CERT_PATH}"
    },
    "apps":{
        "http":{
            "http_port": ${caddy_port},
            "servers":{
                "srv0":{
                    "listen":[
                        ":${caddy_port}"
                    ],
                    "routes":[
                        {
                            "match":[
                                {
                                    "host":[
                                        "${domain}"
                                    ]
                                }
                            ],
                            "handle":[
                                {
                                    "handler":"static_response",
                                    "headers":{
                                        "Location":[
                                            "https://{http.request.host}:${caddy_remote_port}{http.request.uri}"
                                        ]
                                    },
                                    "status_code":301
                                }
                            ]
                        }
                    ]
                },
                "srv1":{
                    "listen":[
                        ":${caddy_remote_port}"
                    ],
                    "routes":[
                        {
                            "handle":[
                                {
                                    "handler":"subroute",
                                    "routes":[
                                        {
                                            "match":[
                                                {
                                                    "host":[
                                                        "${domain}"
                                                    ]
                                                }
                                            ],
                                            "handle":[
                                                {
                                                    "handler":"file_server",
                                                    "root":"${WEB_PATH}",
                                                    "index_names":[
                                                        "index.html",
                                                        "index.htm"
                                                    ]
                                                }
                                            ],
                                            "terminal":true
                                        }
                                    ]
                                }
                            ]
                        }
                    ],
                    "tls_connection_policies":[
                        {
                            "match":{
                                "sni":[
                                    "${domain}"
                                ]
                            }
                        }
                    ],
                    "automatic_https":{
                        "disable":true
                    }
                }
            }
        },
        "tls":{
            "certificates":{
                "automate":[
                    "${domain}"
                ],
                "load_files":[
                    {
                        "certificate":"/tpdata/cert/certificates/acme-v02.api.letsencrypt.org-directory/${domain}/${domain}.crt",
                        "key":"/tpdata/cert/certificates/acme-v02.api.letsencrypt.org-directory/${domain}/${domain}.key"
                    }
                ]
            },
            "automation":{
                "policies":[
                    {
                        "issuers":[
                            {
                                "module":"acme",
                                "email":""
                            }
                        ]
                    }
                ]
            }
        }
    }
}
 
        Copied!
  

注意:需要将证书文件上传至证书文件夹:/tpdata/cert/,证书文件名称格式为 ${domian}.crt${domian}.key

参数解释:

  • ${CADDY_LOG}:日志文件夹
  • ${CERT_PATH}:证书文件夹
  • ${caddy_port}:Caddy端口
  • ${domain}:你的域名
  • ${caddy_remote_port}:Caddy转发的端口
  • ${WEB_PATH}:伪装网站文件夹

#安装MariaDB

Docker Hub:https://hub.docker.com/\_/mariadb

  1. Pull the image
    docker pull mariadb:10.7.3
    
            Copied!
    
    
  2. Start a container
    docker run -d --name trojan-panel-mariadb --restart always \
    --network=host \
    -e MYSQL_DATABASE="trojan_panel_db" \
    -e MYSQL_ROOT_PASSWORD="${mariadb_pas}" \
    -e TZ=Asia/Shanghai \
    mariadb:10.7.3 \
    --port ${mariadb_port}
    
            Copied!
    
    

参数解释:

  • --name trojan-panel-mariadb:定义容器的名称
  • --restart always:容器随着Docker启动而启动
  • --network=host:使用Host网络模式
  • -e MYSQL_DATABASE="trojan_panel_db":容器启动时创建一个默认的 trojan_panel_db
  • -e MYSQL_ROOT_PASSWORD="${mariadb_pas}":设置MariaDB密码为 ${mariadb_pas}
  • -e TZ=Asia/Shanghai:设置时区为上海
  • --port ${mariadb_port}:自定义数据库端口(默认:9507)

#安装Redis

Docker Hub:https://hub.docker.com/\_/redis

  1. Pull the image
    docker pull redis:6.2.7
    
            Copied!
    
    
  2. Start a container
    docker run -d --name trojan-panel-redis --restart always \
    --network=host \
    redis:6.2.7 \
    redis-server --requirepass "${redis_pass}" --port ${redis_port}
    
            Copied!
    
    

参数解释:

  • --name trojan-panel-redis:定义容器的名称
  • --restart always:容器随着Docker启动而启动
  • --network=host:使用Host网络模式
  • redis-server --requirepass "${redis_pass}" --port ${redis_port}:设置Redis密码为 ${redis_pass} 设置Redis端口为 ${redis_port}(默认:6378)

#安装Trojan Panel Backend

Docker Hub:https://hub.docker.com/r/jonssonyan/trojan-panel

  1. Pull the image
    docker pull jonssonyan/trojan-panel
    
            Copied!
    
    
  2. Start a container
    docker run -d --name trojan-panel --restart always \
    --network=host \
    -v ${WEB_PATH}:/tpdata/trojan-panel/webfile/ \
    -v ${TROJAN_PANEL_LOGS}:/tpdata/trojan-panel/logs/ \
    -v ${TROJAN_PANEL_EXPORT}:/tpdata/trojan-panel/export/ \
    -v ${TROJAN_PANEL_TEMPLATE}:/tpdata/trojan-panel/template/ \
    -v /etc/localtime:/etc/localtime \
    -e GIN_MODE=release \
    -e "mariadb_ip=${mariadb_ip}" \
    -e "mariadb_port=${mariadb_port}" \
    -e "mariadb_user=${mariadb_user}" \
    -e "mariadb_pas=${mariadb_pas}" \
    -e "redis_host=${redis_host}" \
    -e "redis_port=${redis_port}" \
    -e "redis_pass=${redis_pass}" \
    jonssonyan/trojan-panel
    
            Copied!
    
    

参数解释:

  • --name trojan-panel:定义容器的名称
  • --restart always:容器随着Docker启动而启动
  • --network=host:使用Host网络模式
  • -v ${WEB_PATH}:/tpdata/trojan-panel/webfile/:映射伪装网站文件夹
  • -v ${TROJAN_PANEL_LOGS}:/tpdata/trojan-panel/logs/:映射日志文件夹
  • -v ${TROJAN_PANEL_EXPORT}:/tpdata/trojan-panel/export/:映射导出文件文件夹
  • -v ${TROJAN_PANEL_TEMPLATE}:/tpdata/trojan-panel/template/:映射模板文件夹
  • -v /etc/localtime:/etc/localtime:同步宿主机和容器的时区
  • -e GIN_MODE=release:release模式启动
  • -e "mariadb_ip=${mariadb_ip}"${mariadb_ip}为 MariaDB 数据库的 IP 地址(默认:本机数据库)
  • -e "mariadb_port=${mariadb_port}"${mariadb_port}为 MariaDB 数据库的端口(默认:本机数据库端口)
  • -e "mariadb_user=${mariadb_user}"${mariadb_user}为 MariaDB 数据库的用户名(默认:root)
  • -e "mariadb_pas=${mariadb_pas}"${mariadb_pas}为 MariaDB 数据库密码(必填)
  • -e "redis_host=${redis_host}"${redis_host}为 Redis 的 IP 地址(默认:本机 Redis)
  • -e "redis_port=${redis_port}"${redis_port}为 Redis 的端口(默认:本机 Redis 端口)
  • -e "redis_pass=${redis_pass}"${redis_pass}为 Redis 的密码(必填)

#安装Trojan Panel Frontend

Docker Hub:https://hub.docker.com/r/jonssonyan/trojan-panel-ui

  1. Pull the image
    docker pull jonssonyan/trojan-panel-ui
    
            Copied!
    
    
  2. Start a container
    docker run -d --name trojan-panel-ui --restart always \
    --network=host \
    -v "${UI_NGINX_CONFIG}":"/etc/nginx/conf.d/default.conf" \
    -v ${CERT_PATH}:${CERT_PATH} \
    jonssonyan/trojan-panel-ui
    
            Copied!
    
    

参数解释:

  • --name trojan-panel-ui:定义容器名称
  • --restart always:容器随着Docker启动而启动
  • --network=host:使用Host网络模式
  • -v "${NGINX_CONFIG}":"/etc/nginx/conf.d/default.conf":映射Nginx配置文件
  • -v ${CERT_PATH}:${CERT_PATH}:映射证书文件夹

Nginx配置举例

  1. 使用 https
server {
    listen       ${trojan_panel_ui_port} ssl;
    server_name  localhost;
    #强制ssl
    ssl on;
    ssl_certificate      ${CERT_PATH}${domain}.crt;
    ssl_certificate_key  ${CERT_PATH}${domain}.key;
    #缓存有效期
    ssl_session_timeout  5m;
    #安全链接可选的加密协议
    ssl_protocols  TLSv1.3;
    #加密算法
    ssl_ciphers  ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    #使用服务器端的首选算法
    ssl_prefer_server_ciphers  on;
    #access_log  /var/log/nginx/host.access.log  main;
    location / {
        root   ${TROJAN_PANEL_UI_DATA};
        index  index.html index.htm;
    }
    location /api {
        proxy_pass http://127.0.0.1:8081;
    }
    #error_page  404              /404.html;
    #497 http->https
    error_page  497               https://\$host:${trojan_panel_ui_port}\$request_uri;
    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
 
        Copied!
  

参数解释:

  • ${trojan_panel_ui_port}:Trojan Panel 端口
  • ${CERT_PATH}:证书文件夹
  • ${domain}:你的域名
  • ${TROJAN_PANEL_UI_DATA}:前端编译文件所在的文件夹
  1. 使用 http
server {
    listen       ${trojan_panel_ui_port};
    server_name  localhost;
    location / {
        root   ${TROJAN_PANEL_UI_DATA};
        index  index.html index.htm;
    }
    location /api {
        proxy_pass http://127.0.0.1:8081;
    }
    error_page  497               http://\$host:${trojan_panel_ui_port}\$request_uri;
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
 
        Copied!
  

参数解释:

  • ${trojan_panel_ui_port}:Trojan Panel 前端端口
  • ${TROJAN_PANEL_UI_DATA}:前端编译文件所在的文件夹

#安装Trojan Panel Core

Docker Hub:https://hub.docker.com/r/jonssonyan/trojan-panel-core

  1. Pull the image
    docker pull jonssonyan/trojan-panel-core
    
            Copied!
    
    
  2. Start a container
    docker run -d --name trojan-panel-core --restart always \
    --network=host \
    -v ${TROJAN_PANEL_CORE_DATA}bin/xray/config:${TROJAN_PANEL_CORE_DATA}bin/xray/config \
    -v ${TROJAN_PANEL_CORE_DATA}bin/trojango/config:${TROJAN_PANEL_CORE_DATA}bin/trojango/config \
    -v ${TROJAN_PANEL_CORE_DATA}bin/hysteria/config:${TROJAN_PANEL_CORE_DATA}bin/hysteria/config \
    -v ${TROJAN_PANEL_CORE_DATA}bin/naiveproxy/config:${TROJAN_PANEL_CORE_DATA}bin/naiveproxy/config \
    -v ${TROJAN_PANEL_CORE_LOGS}:${TROJAN_PANEL_CORE_LOGS} \
    -v ${TROJAN_PANEL_CORE_SQLITE}:${TROJAN_PANEL_CORE_SQLITE} \
    -v ${CERT_PATH}:${CERT_PATH} \
    -v ${WEB_PATH}:${WEB_PATH} \
    -v /etc/localtime:/etc/localtime \
    -e GIN_MODE=release \
    -e "mariadb_ip=${mariadb_ip}" \
    -e "mariadb_port=${mariadb_port}" \
    -e "mariadb_user=${mariadb_user}" \
    -e "mariadb_pas=${mariadb_pas}" \
    -e "database=${database}" \
    -e "account-table=${account_table}" \
    -e "redis_host=${redis_host}" \
    -e "redis_port=${redis_port}" \
    -e "redis_pass=${redis_pass}" \
    -e "crt_path=${CERT_PATH}${domain}.crt" \
    -e "key_path=${CERT_PATH}${domain}.key" \
    -e "grpc_port=${grpc_port}" \
    jonssonyan/trojan-panel-core
    
            Copied!
    
    

参数解释:

  • --name trojan-panel-core:定义容器名称
  • --restart always:容器随着Docker启动而启动
  • --network=host:使用Host网络模式
  • -v ${TROJAN_PANEL_CORE_DATA}bin/xray/config:${TROJAN_PANEL_CORE_DATA}bin/xray/config:映射Xray配置文件夹
  • -v ${TROJAN_PANEL_CORE_DATA}bin/trojango/config:${TROJAN_PANEL_CORE_DATA}bin/trojango/config:映射TrojanGo配置文件夹
  • -v ${TROJAN_PANEL_CORE_DATA}bin/hysteria/config:${TROJAN_PANEL_CORE_DATA}bin/hysteria/config:映射Hysteria配置文件夹
  • -v ${TROJAN_PANEL_CORE_DATA}bin/naiveproxy/config:${TROJAN_PANEL_CORE_DATA}bin/naiveproxy/config:映射NaiveProxy配置文件夹
  • -v ${TROJAN_PANEL_CORE_LOGS}:${TROJAN_PANEL_CORE_LOGS}:映射日志文件夹
  • -v ${TROJAN_PANEL_CORE_SQLITE}:${TROJAN_PANEL_CORE_SQLITE}:映射SQLite文件夹
  • -v ${CERT_PATH}:${CERT_PATH}:映射证书文件夹
  • -v ${WEB_PATH}:${WEB_PATH}:映射回落资源文件夹
  • -v /etc/localtime:/etc/localtime:同步宿主机和容器的时区
  • -e GIN_MODE=release:release模式启动
  • -e "mariadb_ip=${mariadb_ip}"${mariadb_ip}为 MariaDB 数据库的 IP 地址(默认:本机数据库)
  • -e "mariadb_port=${mariadb_port}"${mariadb_port}为 MariaDB 数据库的端口(默认:本机数据库端口)
  • -e "mariadb_user=${mariadb_user}"${mariadb_user}为 MariaDB 数据库的用户名(默认:root)
  • -e "mariadb_pas=${mariadb_pas}"${mariadb_pas}为 MariaDB 数据库密码(默认:123456)
  • -e "database=${database}"${database}为数据库名称
  • -e "account-table=${account_table}"${account_table}为用户表名称
  • -e "redis_host=${redis_host}"${redis_host}为 Redis 的 IP 地址(默认:本机 Redis)
  • -e "redis_port=${redis_port}"${redis_port}为 Redis 的端口(默认:本机 Redis 端口)
  • -e "redis_pass=${redis_pass}"${redis_pass}为 Redis 的密码(默认:123456)
  • -e "crt_path=${CERT_PATH}${domain}.crt":自定义证书.crt文件路径
  • -e "key_path=${CERT_PATH}${domain}.key":自定义证书.key文件路径
  • -e "grpc_port=${grpc_port}":自定义服务器之间的通讯端口

Docker Compose方式安装

#准备

#设置伪装网站

将静态网站文件上传至伪装网站文件夹:/tpdata/web/

#新建Caddy配置文件

文件路径:/tpdata/caddy/config.json

Caddy配置举例

  1. acme自动申请和续签
{
    "admin": {
        "disabled": true
    },
    "logging": {
        "logs": {
            "default": {
                "writer": {
                    "output": "file",
                    "filename": "/tpdata/caddy/logs/error.log"
                },
                "level": "ERROR"
            }
        }
    },
    "storage": {
        "module": "file_system",
        "root": "/tpdata/cert/"
    },
    "apps": {
        "http": {
            "http_port": 80,
            "servers": {
                "srv0": {
                    "listen": [
                        ":80"
                    ],
                    "routes": [
                        {
                            "match": [
                                {
                                    "host": [
                                        "${domain}"
                                    ]
                                }
                            ],
                            "handle": [
                                {
                                    "handler": "static_response",
                                    "headers": {
                                        "Location": [
                                            "https://{http.request.host}:8863{http.request.uri}"
                                        ]
                                    },
                                    "status_code": 301
                                }
                            ]
                        }
                    ]
                },
                "srv1": {
                    "listen": [
                        ":8863"
                    ],
                    "routes": [
                        {
                            "handle": [
                                {
                                    "handler": "subroute",
                                    "routes": [
                                        {
                                            "match": [
                                                {
                                                    "host": [
                                                        "${domain}"
                                                    ]
                                                }
                                            ],
                                            "handle": [
                                                {
                                                    "handler": "file_server",
                                                    "root": "/tpdata/web/",
                                                    "index_names": [
                                                        "index.html",
                                                        "index.htm"
                                                    ]
                                                }
                                            ],
                                            "terminal": true
                                        }
                                    ]
                                }
                            ]
                        }
                    ],
                    "tls_connection_policies": [
                        {
                            "match": {
                                "sni": [
                                    "${domain}"
                                ]
                            }
                        }
                    ],
                    "automatic_https": {
                        "disable": true
                    }
                }
            }
        },
        "tls": {
            "certificates": {
                "automate": [
                    "${domain}"
                ]
            },
            "automation": {
                "policies": [
                    {
                        "issuers": [
                            {
                                "module": "acme",
                                "email": ""
                            }
                        ]
                    }
                ]
            }
        }
    }
}
 
        Copied!
  

参数解释

  • ${domain}:你的域名
  1. 手动设置自定义证书
{
    "admin": {
        "disabled": true
    },
    "logging": {
        "logs": {
            "default": {
                "writer": {
                    "output": "file",
                    "filename": "/tpdata/caddy/logs/error.log"
                },
                "level": "ERROR"
            }
        }
    },
    "storage": {
        "module": "file_system",
        "root": "/tpdata/cert/"
    },
    "apps": {
        "http": {
            "http_port": 80,
            "servers": {
                "srv0": {
                    "listen": [
                        ":80"
                    ],
                    "routes": [
                        {
                            "match": [
                                {
                                    "host": [
                                        "${domain}"
                                    ]
                                }
                            ],
                            "handle": [
                                {
                                    "handler": "static_response",
                                    "headers": {
                                        "Location": [
                                            "https://{http.request.host}:8863{http.request.uri}"
                                        ]
                                    },
                                    "status_code": 301
                                }
                            ]
                        }
                    ]
                },
                "srv1": {
                    "listen": [
                        ":8863"
                    ],
                    "routes": [
                        {
                            "handle": [
                                {
                                    "handler": "subroute",
                                    "routes": [
                                        {
                                            "match": [
                                                {
                                                    "host": [
                                                        "${domain}"
                                                    ]
                                                }
                                            ],
                                            "handle": [
                                                {
                                                    "handler": "file_server",
                                                    "root": "/tpdata/web/",
                                                    "index_names": [
                                                        "index.html",
                                                        "index.htm"
                                                    ]
                                                }
                                            ],
                                            "terminal": true
                                        }
                                    ]
                                }
                            ]
                        }
                    ],
                    "tls_connection_policies": [
                        {
                            "match": {
                                "sni": [
                                    "${domain}"
                                ]
                            }
                        }
                    ],
                    "automatic_https": {
                        "disable": true
                    }
                }
            }
        },
        "tls": {
            "certificates": {
                "automate": [
                    "${domain}"
                ],
                "load_files": [
                    {
                        "certificate": "/tpdata/cert/certificates/acme-v02.api.letsencrypt.org-directory/${domain}/${domain}.crt",
                        "key": "/tpdata/cert/certificates/acme-v02.api.letsencrypt.org-directory/${domain}/${domain}.key"
                    }
                ]
            },
            "automation": {
                "policies": [
                    {
                        "issuers": [
                            {
                                "module": "acme",
                                "email": ""
                            }
                        ]
                    }
                ]
            }
        }
    }
}
 
        Copied!
  

注意:需要将证书文件上传至证书文件夹:/tpdata/cert/,证书文件名称格式为 ${domian}.crt${domian}.key

参数解释

  • ${domain}:你的域名

#新建Nginx配置文件

文件路径:/tpdata/trojan-panel-ui/nginx/default.conf

  1. 使用 https
server {
    listen       8888 ssl;
    server_name  localhost;
    #强制ssl
    ssl on;
    ssl_certificate      /tpdata/cert/${domain}.crt;
    ssl_certificate_key  /tpdata/cert/${domain}.key;
    #缓存有效期
    ssl_session_timeout  5m;
    #安全链接可选的加密协议
    ssl_protocols  TLSv1.3;
    #加密算法
    ssl_ciphers  ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    #使用服务器端的首选算法
    ssl_prefer_server_ciphers  on;
    #access_log  /var/log/nginx/host.access.log  main;
    location / {
        root   /tpdata/trojan-panel-ui/;
        index  index.html index.htm;
    }
    location /api {
        proxy_pass http://127.0.0.1:8081;
    }
    #error_page  404              /404.html;
    #497 http->https
    error_page  497               https://\$host:8888\$request_uri;
    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
 
        Copied!
  

参数解释

  • ${domain}:你的域名
  1. 使用 http
server {
    listen       8888;
    server_name  localhost;
    location / {
        root   /tpdata/trojan-panel-ui/;
        index  index.html index.htm;
    }
    error_page  497               http://\$host:8888\$request_uri;
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
 
        Copied!
  

#配置文件

version: '3'

services:
  trojan-panel-caddy:
    image: caddy:2.6.2
    container_name: trojan-panel-caddy
    restart: always
    network_mode: host
    volumes:
      - "/tpdata/caddy/config.json:/tpdata/caddy/config.json"
      - "/tpdata/cert/:/tpdata/cert/certificates/acme-v02.api.letsencrypt.org-directory/${domain}/"
      - "/tpdata/web/:/tpdata/web/"
      - "/tpdata/caddy/logs/:/tpdata/caddy/logs/"
    command: caddy run --config /tpdata/caddy/config.json

  trojan-panel-mariadb:
    image: mariadb:10.7.3
    container_name: trojan-panel-mariadb
    restart: always
    network_mode: host
    environment:
      MYSQL_DATABASE: trojan_panel_db
      MYSQL_ROOT_PASSWORD: "${mariadb_pas}"
      TZ: Asia/Shanghai
    command: --port=9507

  trojan-panel-redis:
    image: redis:6.2.7
    container_name: trojan-panel-redis
    restart: always
    network_mode: host
    command: redis-server --requirepass ${redis_pass} --port 6378

  trojan-panel:
    image: jonssonyan/trojan-panel
    container_name: trojan-panel
    restart: always
    network_mode: host
    volumes:
      - "/tpdata/web/:/tpdata/trojan-panel/webfile/"
      - "/tpdata/trojan-panel/logs/:/tpdata/trojan-panel/logs/"
      - "/tpdata/trojan-panel/export:/tpdata/trojan-panel/export"
      - "/tpdata/trojan-panel/template:/tpdata/trojan-panel/template"
      - "/etc/localtime:/etc/localtime"
    environment:
      - "GIN_MODE=release"
      - "mariadb_ip=127.0.0.1"
      - "mariadb_port=9507"
      - "mariadb_user=root"
      - "mariadb_pas=${mariadb_pas}"
      - "redis_host=127.0.0.1"
      - "redis_port=6378"
      - "redis_pass=${redis_pass}"
      - "server_port=8081"

  trojan-panel-ui:
    image: jonssonyan/trojan-panel-ui
    container_name: trojan-panel-ui
    restart: always
    network_mode: host
    volumes:
      - "/tpdata/trojan-panel-ui/nginx/default.conf:/etc/nginx/conf.d/default.conf"
      - "/tpdata/cert/:/tpdata/cert/"

  trojan-panel-core:
    image: jonssonyan/trojan-panel-core
    container_name: trojan-panel-core
    restart: always
    network_mode: host
    volumes:
      - "/tpdata/trojan-panel-core/bin/xray/config:/tpdata/trojan-panel-core/bin/xray/config"
      - "/tpdata/trojan-panel-core/bin/trojango/config:/tpdata/trojan-panel-core/bin/trojango/config"
      - "/tpdata/trojan-panel-core/bin/hysteria/config:/tpdata/trojan-panel-core/bin/hysteria/config"
      - "/tpdata/trojan-panel-core/bin/naiveproxy/config:/tpdata/trojan-panel-core/bin/naiveproxy/config"
      - "/tpdata/trojan-panel-core/logs/:/tpdata/trojan-panel-core/logs/"
      - "/tpdata/trojan-panel-core/config/sqlite/:/tpdata/trojan-panel-core/config/sqlite/"
      - "/tpdata/cert/:/tpdata/cert/"
      - "/tpdata/web/:/tpdata/web/"
      - "/etc/localtime:/etc/localtime"
    environment:
      - "GIN_MODE=release"
      - "mariadb_ip=127.0.0.1"
      - "mariadb_port=9507"
      - "mariadb_user=root"
      - "mariadb_pas=${mariadb_pas}"
      - "database=trojan_panel_db"
      - "account-table=account"
      - "redis_host=127.0.0.1"
      - "redis_port=6378"
      - "redis_pass=${redis_pass}"
      - "crt_path=/tpdata/cert/${domain}.crt"
      - "key_path=/tpdata/cert/${domain}.key"
      - "grpc_port=8100"
      - "server_port=8082"
 
        Copied!
  

参数解释:

  • ${mariadb_pas}:MariaDB 数据库密码
  • ${redis_pass}:Redis 的密码
  • ${domain}:你的域名

#部署

在Docker Compose配置文件同一级目录下执行

docker compose up