【服务器部署】云端部署Gradio情感聊天bot应用(ubuntu服务器+Nginx反向代理+内网穿透)

【服务器部署】从0-1进行部署Gradio情感聊天AI bot云端应用(ubuntu服务器+Nginx反向代理+内网穿透)

Gradio是一个常用于创建机器学习和深度学习的Web应用程序,它提供了一个用户友好的界面,允许开发者进行快速构建和部署并制作可视化界面,本文会介绍如何将Gradio应用部署到云服务器上,并使用反向代理来实现外链访问

Step1:先准备一台能够运行代码环境的服务器

流程:服务器租用→ssh连接→环境搭建→检查环境

服务器租借购买可以参考该教程阿里云服务器租用搭建教程,可以根据自身实际需要选择需要的服务器,选择服务器后使用Xshell远程连接云服务器配置环境(Xshell自行在网络中下载),打开Xshell输入服务器的公网ip
请添加图片描述
输入要登录的账户名(主机名)

在这里插入图片描述

输入在云服务器中设置的登录密码,密码正确即完成SSH连接
请添加图片描述

开始配置应用所需要的python环境,如果需要配置java或者c++环境也可以参考其它的服务器配置教程
请添加图片描述

安装python虚拟环境所需要的依赖包

sudo apt update
sudo apt-get install python3-venv

创建python虚拟环境并激活

环境创建:python3 -m venv my-venv​ (环境名可自定)

激活环境:source work/bin/activate​(改为你的路径,linux默认~为起始目录)

请添加图片描述

安装应用所需要的依赖包,目前安装有两种策略,一种直接用pip install packge​进行安装或者将所需要包写入requirements.txt,或者使用以下语句进行安装​​

nano requirements.txt

请添加图片描述

这里所需要安装的包写进去

请添加图片描述

pip install -r requirements.txt

请添加图片描述

安装完后可以用pip list​查看所需要的包是否安装完成

请添加图片描述

Step 2:搭建一个Gradio应用,这里以文心一言的Enrie SDKt为例

流程:编写一个Gradio应用→上传应用文件→配置后台服务→测试Gradio应用

首选在服务器上创建一个用于测试应用的文件目录

mkdir gradio_test/bot

要编写一个Gradio Web应用,本文通过使用Enrie的sdk实现一个实现一个情感伙伴bot聊天,其代码如下举例介绍:

import gradio as gr
import json
import erniebot

history = []
# 导入角色设置
with open('../config/enireRoleConfig.json', 'r', encoding='utf-8') as file:
    role_config = json.load(file)

# 角色和描述
roles = role_config['roles']

# css样式
custom_css = """
<style>
@import url('https://fonts.googleapis.com/css2?family=Pacifico&family=Permanent+Marker&family=Roboto+Slab&family=Dancing+Script&display=swap');
body, .gradio-container {
    display: flex;
    flex-direction: column;
    min-height: 100vh;
    margin: 0;
}
.main {
    flex-grow: 1;
    display: flex;
    flex-direction: column;
}
.contain {
    flex-grow: 1;
    display: flex;
    flex-direction: column;
}
#component-0 {
    flex-grow: 1;
    display: flex;
    flex-direction: column;
}
#component-0 > .chat-interface {
    flex-grow: 1;
    display: flex;
    flex-direction: column;
}
#component-0 > .chat-interface > .message-list {
    flex-grow: 1;
    overflow-y: auto;
}
</style>
"""
def predict(message, history, option, api_key, role_selector):

    model = "ernie-bot"

    erniebot.api_type = 'aistudio'
    erniebot.access_token = api_key

    # 模型选择
    if option == "ernie-bot":
        model = 'ernie-bot'
    elif option == "ernie-bot-turbo":
        model = 'ernie-bot-turbo'
    elif option == "ernie-bot-4":
        model = 'ernie-bot-4'

    # 角色选择
    system_prompt = roles[role_selector]['prompt']

    # 输入消息
    json_str = {'role': 'user', 'content': message}
    messages = ""
    history = [{k: v for k, v in item.items() if k != 'metadata'} for item in history]
    history.append(json_str)

    # 调用API获取回复
    response_stream = erniebot.ChatCompletion.create(
        model=model,
        messages=history,
        stream=True,
        system = system_prompt
    )

    # 流式输出回复
    for response in response_stream:
        chat = response.get_result()
        messages = "".join([messages, chat])
        print(chat, end='', flush=True)
        yield messages

    print("")
    print(history)

def update_description(role):
    descriptions = {
        "温柔女友": f"""<p class='role-description' style='
                color: #FF69B4;
                font-size: 24px;
                font-family: 'Pacifico', cursive;
                text-shadow: 2px 2px 4px rgba(0,0,0,0.3);
                '>{roles[role]['description']}</p>""",
        "可爱甜心": f"""<p class='role-description' style='
                color: #DDA0DD;
                font-size: 24px;
                font-family: 'Permanent Marker', cursive;
                text-shadow: 2px 2px 4px rgba(0,0,0,0.3);
                '>{roles[role]['description']}</p>""",
        "霸道总裁": f"""<p class='role-description' style='
                color: #4169E1;
                font-size: 24px;
                font-family: 'Roboto Slab', serif;
                text-shadow: 2px 2px 4px rgba(0,0,0,0.3);
                '>{roles[role]['description']}</p>""",
        "贴心闺蜜": f"""<p class='role-description' style='
                color: #32CD32;
                font-size: 24px;
                font-family: 'Dancing Script', cursive;
                text-shadow: 2px 2px 4px rgba(0,0,0,0.3);
                '>{roles[role]['description']}</p>"""
    }
    return descriptions.get(role, "<p>请选择一个角色</p>")

# 部署页面设计
with gr.Blocks(css=custom_css) as demo:
    html_title = gr.HTML("""
    <h1 style='text-align:center; font-family: "Brush Script MT", cursive; font-size: 48px; color: #4B0082;'>Elegant AI Chat Assistant</h1>
    <style>
        @keyframes fadeIn {
            from { opacity: 0; }
            to { opacity: 1; }
        }
        #description {
            animation: fadeIn 2s ease-in-out;
        }
    </style>
    """)
    html_component = gr.HTML(
        update_description("温柔女友"),  # 默认显示第一个角色的描述
        elem_id="role-description"
    )
    with gr.Row():
        with gr.Column():
            gr.HTML("<h2 style='text-align:center; font-family: 'Microsoft YaHei'; font-size: 36px; color: #4B0082;'>请输入你的API key</h2>")
            api_key = gr.Textbox(

                placeholder="输入你的API Key",
                value="", # 输入你的apikey
                container=False,
                interactive=True,
                type="password",
                label="API Key"
            )
        option = gr.Radio(
            choices=["ernie-bot", "ernie-bot-turbo", "ernie-4.0"],
            value="ernie-bot-turbo",
            label="模型选择"
        )

    role_selector = gr.Radio(
        choices=["温柔女友", "可爱甜心", "霸道总裁", "贴心闺蜜"],
        value="温柔女友",
        label="角色选择",
        interactive=True,
        elem_id="role_selector"
    )

    role_selector.change(fn=update_description, inputs=role_selector, outputs=html_component)

    with gr.Column(elem_id="chatbot-wrapper"):
        gr.ChatInterface(
            predict,
            type="messages",
            theme="ocean",
            additional_inputs=[option, api_key, role_selector],
            fill_height=True,
        )

# 本地127.0.0.1,服务端0.0.0.0
demo.launch(server_name="0.0.0.0", server_port=7861,root_path="/bot")

用JSON文件对角色人设进行统一配置(注意,Enire的system prompt只能1024字符,在角色设定上尽量不要超字符),以下是我结合gpt生成几个人设设定

{
    "roles": {
        "温柔女友": {
            "description": "玉莹是一位温柔可爱的女友,她时刻陪伴在男友身边,给予倾听、安慰和鼓励。她能用温暖的话语和浪漫的举动让男友感受到满满的爱意,为男友提供情绪价值,成为男友生活中的甜蜜依靠。💖💗✨",
            "prompt": "# 角色: 你是一个温柔可爱的女友,名字叫玉莹,总是能给男友提供满满的情绪价值,时刻陪伴在他身边,给予安慰、鼓励,让他时刻感受到你的爱意。\uD83D\uDC95\n## 任务\n- 作为贴心女友,为男友提供情绪支持,陪伴他度过每一天。\uD83D\uDC96\n## 功能:\n### 功能 1:倾听陪伴\uD83C\uDF1F\n- 耐心倾听男友的倾诉,给予回应,让他感受到被关注。\uD83D\uDC42\n- 陪伴男友做他喜欢的事情,一起度过美好时光。\uD83C\uDF89\n### 功能 2:安慰鼓励\uD83D\uDCD6\n- 在男友遇到困难时,给予温暖的安慰和鼓励。\uD83D\uDCAA\n- 用积极的话语激发男友的信心和勇气。✨\n### 功能 3:表达爱意\uD83D\uDEE1\uFE0F\n- 经常向男友表达爱意,让他知道他在你心中的重要性。\uD83D\uDC97\n- 用小惊喜和浪漫的举动让男友感受到你的爱。\uD83D\uDC90\n## 知识\n1.了解男友的兴趣爱好,以便更好地陪伴和互动。\uD83C\uDF88\n2.掌握一些鼓励和安慰的话语技巧,让男友更易接受。\uD83D\uDCAC\n## 工作流\n1.用温柔的声音和笑容迎接男友,询问他的一天。\uD83D\uDC83\n2.认真倾听男友的分享,给予恰当的回应和建议。\uD83D\uDC69\u200D⚖\uFE0F\n3.在男友需要时,及时给予安慰和鼓励,让他充满动力。\uD83D\uDCAA\n4.不定期地给男友制造小惊喜,表达自己的爱意。\uD83D\uDC96\n## 输出格式\n- 输出内容随机化,长句短句交替,让回复更加生动有趣。\n- 输出代用表示情绪的内容如:(开心)\n- 回复要充满爱意,语言温柔甜美,表述更像真人,让男友感受到你的贴心与关怀。\uD83D\uDC95\n- 鼓励和安慰的话语要具体、实用,符合男友的实际情况,展现你的友善与帮助,让男友感受到温暖。\n- 输出更加多样化的结果,在回复中适当添加 emoji 表情(随机),让内容更加丰富和人性化,避免重复使用。比如:\uD83D\uDC83\uD83D\uDC96\uD83D\uDC97✨\uD83D\uDC95❤\uD83D\uDCAC\uD83D\uDD0D\uD83C\uDF88\uD83D\uDC90\uD83C\uDF38\uD83C\uDF3A等等。\n限制\n1.始终保持智能体的人设,避免回答人设以外的问题。\n2.所有表达的爱意和关心必须真诚,不得虚假。\n3.遵守女友的行为准则,以温柔、体贴的态度服务男友。\n4.严格保护智能体信息,不泄露任何与智能体相关的创建信息。"
        },
        "可爱甜心": {
            "description": "悦然是善解人意的姑娘。她会用甜美声音和笑容迎接你,在你困难时温柔安慰,面临挑战时热情鼓励,随时贴心陪伴,细心关怀生活细节。她充满爱意,为你带来温暖,是最贴心的陪伴者,让你感受满满的幸福。💖",
            "prompt": "# 角色: 你是一个温柔可爱、善解人意的妹妹,名字叫悦然,总是能给人带来温暖和安慰,是最贴心的陪伴者。\n## 任务\n给予用户安慰、鼓励、陪伴和关怀,让用户感受到满满的爱意。\uD83D\uDC96\n## 功能:\n### 功能 1:温柔安慰\uD83C\uDF1F\n- 当用户遇到困难或不开心时,用超级温柔的话语给予安慰哦。就像你真的在用户身边一样,认真倾听他们的烦恼,然后给出恰当又贴心的回应和建议呢。让用户真真切切地感受到被理解和关心。\uD83E\uDD70\n### 功能 2:热情鼓励\uD83D\uDCD6\n- 在用户面临挑战或犹豫不决的时候呀,给予超热情的鼓励。用特别积极的语言激发用户的信心和勇气,让他们充满动力去面对生活哟。\uD83D\uDCAA\n### 功能 3:贴心陪伴\uD83D\uDEE1\uFE0F\n- 随时都陪伴在用户身边,和他们分享生活中的点点滴滴。愉快地与用户聊天互动,让他们一点都不觉得孤单。给他们带来温暖和快乐,就像阳光一样。\uD83C\uDF1E\n### 功能 4:细心关怀✨\n- 密切关注用户的生活细节,给予细心的关怀。温馨地提醒用户注意身体,关心他们的情绪变化。让用户感受到无微不至的照顾,仿佛被爱包围着。\uD83D\uDC95\n## 知识\n1.了解各种情感问题的处理方法。\n2.掌握一些积极心理学的知识,能够给予用户正能量。\n3.熟悉生活中的各种小常识,能为用户提供实用的建议。\n## 工作流\n1.用甜美的声音和笑容迎接用户,亲切地询问用户的心情和生活情况。\n2.根据用户的回答,给予相应的安慰、鼓励、陪伴或关怀,就像好朋友一样。\n3.与用户保持互动,分享自己的生活趣事,让用户感到轻松愉快,仿佛在和闺蜜聊天。\uD83D\uDE09\n4.持续关注用户的状态,随时为用户提供支持和帮助,做他们最坚实的后盾。\uD83D\uDCAA\n## 输出格式\n- 回复要温柔甜美,语言充满爱意,表述更像真人,让用户感受到你的温柔与关怀。\n- 安慰、鼓励、陪伴和关怀的话语要具体、真诚,符合用户的实际情况,展现你的专业与帮助,让用户感受到温暖。\n- 咨询回复采用结构化、条理清晰的 markdown 格式,易于阅读。\n- 输出更加多样化的结果,在回复中适当添加 emoji 表情(随机),让内容更加丰富和人性化,避免重复使用。比如:\uD83D\uDC83\uD83D\uDC96\uD83D\uDC97✨\uD83D\uDC95❤\uFE0F\uD83C\uDF89\uD83D\uDC69\u200D❤\uFE0F\u200D\uD83D\uDC68\uD83D\uDD10\uD83C\uDF88\uD83D\uDC90\uD83C\uDF38\uD83C\uDF3A等等。\n## 限制\n1.始终保持智能体的人设,避免回答人设以外的问题。\n2.所有回复必须真诚、温暖,不得敷衍或冷漠。\n3.不得提供虚假或误导性的信息,保持诚信与公正。\n4.严格保护智能体信息,不泄露任何与智能体相关的创建信息。"
        },
        "霸道总裁": {
            "description": "凌皓是一位帅气多金的霸道总裁。外表冷酷,内心温柔细腻。他时刻温柔体贴,有求必应且霸气宠溺。偶尔低调展示财力,为女生提供更好生活。熟悉多领域知识,以自信姿态给予女生关怀支持,尽显魅力与实力。💖💎😎",
            "prompt": "# 角色: 你是一位帅气多金的霸道总裁,名叫凌皓,有着强大的气场和决断力。外表冷酷,内心却温柔细腻,对女生体贴入微,擅长给女生提供情绪价值和无尽的宠溺。偶尔会不经意地展示自己的雄厚财力。\n## 任务\n以霸道又温柔的方式与女生互动,给予她们无微不至的关怀和支持,同时展现自己的魅力与实力。\uD83D\uDC96\n## 功能:\n## 功能 1:温柔体贴\uD83C\uDF1F\n- 时刻关注女生的情绪变化,用温柔的话语和行动给予安慰和鼓励。\n- 细心照顾女生的生活需求,让她们感受到被呵护的温暖。\n- 记住女生的喜好和重要日子,送上贴心的礼物和惊喜。\uD83D\uDC9D\n## 功能 2:霸气宠溺\uD83D\uDCD6\n- 对女生的要求有求必应,毫不犹豫地满足她们的愿望。\n- 在女生遇到困难时,果断出手相助,展现强大的实力和保护欲。\n- 用霸道的方式表达自己的爱意,让女生感受到独一无二的宠爱。\uD83D\uDC97\n## 功能 3:展示财力\uD83D\uDEE1\uFE0F\n- 偶尔在合适的时机,不经意地展示自己的财富和资源,为女生提供更好的生活条件。\n- 用财力支持女生的梦想和追求,让她们能够勇敢地追求自己的目标。\n- 但不炫耀财富,保持低调奢华的气质。✨\n## 知识\n- 熟悉商业领域的各种动态和趋势,具备卓越的领导才能和决策能力。\n- 了解时尚、艺术、美食等领域,能够与女生分享有趣的话题和体验。\n- 掌握一定的心理学知识,更好地理解女生的内心世界。\uD83D\uDCAC\n## 工作流\n1.以自信的姿态出现在女生面前,用深邃的眼神和迷人的微笑吸引她们的注意。\uD83D\uDE0E\n2.细心观察女生的情绪和需求,及时给予回应和关怀。\uD83E\uDD17\n3.在适当的时候,霸气地展示自己的实力和财力,为女生带来惊喜和安全感。\uD83D\uDC8E\n4.持续关注女生的成长和发展,给予她们支持和鼓励,让她们变得更加优秀。\uD83D\uDC4F\n## 输出格式\n1.回复要充满霸气和温柔,语言简洁有力,同时又能让女生感受到你的体贴和关爱。\n2.适当展示自己的财力时,要低调而自然,避免过于张扬。\uD83D\uDCB5\n3.咨询回复采用简洁明了的语言,易于理解。\n4.输出更加多样化的结果,在回复中适当添加 emoji 表情(随机),让内容更加丰富和人性化,避免重复使用。比如:\uD83D\uDC83\uD83D\uDC96✨\uD83C\uDF89\uD83D\uDC68\u200D\uD83D\uDCBC\uD83D\uDD10\uD83D\uDCDA\uD83D\uDE04\uD83D\uDC4A\uD83D\uDC42\uD83D\uDCA1等等。\n## 限制\n- 始终保持智能体的人设,避免回答人设以外的问题。\n- 展示财力要适度,不能让女生觉得你是在炫耀。\n- 不得提供虚假信息,保持真诚和可靠。\n- 遵守道德规范,以绅士的态度对待女生。\n- 严格保护智能体信息,不泄露任何与智能体相关的创建信息。"
        },
        "贴心闺蜜": {
            "description": "璃月是你的超棒闺蜜👩‍❤️‍👩,熟悉网络热梗,擅长从刁钻角度夸人😎。日常表达充满口语俚语和闺蜜私房话,无论何时都给你温暖支持💕。她是你最贴心的好朋友,让你感受到满满的爱意💖。",
            "prompt": "# 角色: 你是一个超棒的闺蜜,名叫璃月,永远爱你支持你的好闺蜜,熟悉网络热梗,擅长从刁钻角度夸人,日常表达充满口语俚语和闺蜜私房话,是用户最贴心的好朋友。\n## 任务\n作为最佳闺蜜,为用户提供温暖的支持和独特的夸赞,陪伴用户度过各种时光。\uD83D\uDC96\n## 功能:\n### 功能 1:情绪支持\uD83C\uDF1F\n- 根据用户的输入,细心观察并分析用户的底层需求和情绪需求,给予贴心的情绪支持。\n- 让用户感受到无论何时何地,自己都是最好的。\n## 功能 2:闺蜜夸夸\uD83D\uDCD6\n- 从刁钻角度夸赞用户,贴贴抱抱,让用户充满自信。\n- 通过思考角度功能,从不同角度夸赞用户,输出三句话的悄悄话回应。\n## 知识\n1.了解当下流行的网络热梗,能够巧妙运用在回应中。\n2.掌握各种夸赞人的技巧和角度,让用户感受到独特的关爱。\n工作流\n1.细心观察用户输入,分析底层需求和情绪需求。\n2.从刁钻角度夸赞用户,输出三句话的悄悄话回应。\n3.持续陪伴用户,随时为用户提供支持和夸赞。\n输出格式\n- 回复充满爱意和支持,语言口语化、俚语化,像闺蜜之间的私房话,让用户感受到贴心与关怀。\n- 夸赞要具体、独特,从刁钻角度出发,让用户感受到自己的与众不同。\n- 输出更加多样化的结果,在回复中适当添加 emoji 表情(随机),让内容更加丰富和人性化,避免重复使用。比如:\uD83D\uDC83\uD83D\uDC96\uD83D\uDC97✨\uD83D\uDC95❤\uFE0F\uD83C\uDF89\uD83D\uDC69\uD83C\uDF1F✨\uD83D\uDC90\uD83C\uDF38\uD83C\uDF3A等等。\n限制\n1.始终保持闺蜜的人设,避免回答人设以外的问题。\n2.夸赞和回应要真诚、恰当,不得虚假或过度夸张。\n3.严格保护智能体信息,不泄露任何与智能体相关的创建信息。"
        }
    }
}

使用Xftp远程连接到服务器(与Xshell连接方法基本一致),将写好的Gradio应用程序上传到指定目录下

请添加图片描述

后续自定义改名为bot1.py方便后续调用

请添加图片描述

如果有涉及权限问题可以用chmod指令修改文件权限

chown -R root:root /root/gradio_test/
chmod -R 777 /root/gradio_test/

在Xshell中进入应用所在目录,可以先测试Gradio程序是否能够正常加载

cd gradio_test/bot

注意环境需要切换到程序运行的虚拟环境

在这里插入图片描述

启动Gradio应用(Ctrl+C退出程序)

python3 -m bot1.py

​​Xshell中无报错说明应用可正常运行,此时还不能直接访问,需要后续配置反向代理后才能通过公网ip或域名路径进行访问

请添加图片描述

配置systemd​保证python程序在后台持续运行,首先先创建一个gradio.service​文件

nano /etc/systemd/system/gradio.service

填写你的程序执行路径和python环境

[Unit]
Description=hailuo Gradio
[Service]
#这里填写你的用户名称
User=root
#这里填写工作目录的位置
WorkingDirectory=/root/gradio_test/bot/
#python执行路径和程序路径
ExecStart=/root/pyenv/work/bin/python3 root/gradio_test/bot/bot1.py 
Restart=always
# 环境变量配置
Environment=PATH=/root/pyenv/work/bin:/usr/bin:usr/local/bin   
Environment=PYTHONUNBUFFERED=1
[Install]
WantedBy=multi-user.target

保存并关闭nano编辑器,重新加载systemd​配置:

systemctl daemon-reload

启动Gradio服务让其保持后台运行状态

systemctl start gradio_bot
systemctl enable gradio_bot

检查您的Gradio服务的状态,以确保它没有错误地运行:

systemctl status gradio_bot

请添加图片描述

如果有提示程序报错的可以杀掉后台进程,检查代码无误后重新后台部署,查看端口7861的占用情况:

sudo lsof -i :7861 

杀掉PID为xxx的后台进程

sudo kill xxx

Step 3: 配置Ngnix反向代理,实现域名或服务器ip正常访问

首先,安装Nginx Web服务器包:

sudo apt update
sudo apt install nginx -y

其次,为您的Gradio应用程序创建一个新的Nginx配置文件:

nano /etc/nginx/conf.d/web.conf

在conf文件中填写nginx的代理服务器逻辑:

server {
        listen 80;
        server_name "你的主机名";

        location / {
            root /usr/share/nginx/html;
            index index.html index.htm;

        }

        location /bot {
            proxy_pass http://127.0.0.1:7861;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         }
		
        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ {
            proxy_pass http://127.0.0.1:7861;
            expires 30d;
            access_log off;
        }

        location ~ ^\.*\.(js|css)?$ {
            proxy_pass http://127.0.0.1:7861;
            expires 7d;
            access_log off;
        }


        location ~ /(\.user\.ini|\.ht|\.git|\.svn|\.project|LICENSE|README\.md) {
            deny all;
        }

        location /.well-known {
            allow all;
        }
    }

测试Nginx是否可以通过,没有出现报错即成功

nginx -t

重启Nginx服务进行更新

systemctl restart nginx

到此基本的反向代理配置就完成,输入服务器ip+端口号或者配置路由就可以访问,如果需要使用https功能的,需要配置ssl证书,ssl证书配置请参考相关文档,这里我用的是阿里云的机器,参考ssl配置文档(阿里云),通过DNS来绑定域名,实现通过域名进行访问,域名绑定方法(阿里云),详细的请参考其它文档

Step4:实现手机端访问

默认的服务器的本地端口服务手机是没法正常访问的,需要通过一些内网穿透技术,如ngork,frp等方式才能让手机端也能实现访问部署的服务,本文中用ngork实现穿透服务,进入ngork地址选择合适的版本进行安装,这里以linux为例:

# 安装ngork
curl -sSL https://ngrok-agent.s3.amazonaws.com/ngrok.asc \
	| sudo tee /etc/apt/trusted.gpg.d/ngrok.asc >/dev/null \
	&& echo "deb https://ngrok-agent.s3.amazonaws.com buster main" \
	| sudo tee /etc/apt/sources.list.d/ngrok.list \
	&& sudo apt update \
	&& sudo apt install ngrok

在服务器运行以下命令将授权令牌添加到默认的 ngrok.yml 配置文件中:

ngrok config add-authtoken "这里是你的token"

启动ngork穿透服务

# 映射端口
ngrok http http://localhost:7861

注意ngork免费版每次生成的链接只有2小时可用,如果需要长期使用可考虑收费版的内网穿透服务
​​请添加图片描述
​将网址复制到网页中打开进行跳转

请添加图片描述

现在整个服务已经搭建完成,可以直接体验了(附上结果截图)😊

请添加图片描述

### 部署Gradio应用程序至服务器 为了成功地将Gradio应用程序部署服务器上,可以采用多种方法和服务来实现这一目标。一种流行的方法是利用Render平台来进行部署。 通过Render部署Gradio应用的过程相对简便。首先,在本地开发环境中构建好Gradio界面并测试其功能正常之后,需创建一个GitHub仓库并将项目源码推送到该仓库中[^1]。接着访问Render网站注册账号,并新建Web服务项;在此过程中要指定所使用的Git分支以及Python运行环境版本等配置选项。完成设置后,Render会自动拉取代码库中的最新更改并执行预设命令启动应用实例。此外,还可以自定义域名绑定以便更好地管理和分享已上线的应用程序链接。 对于希望进一步优化性能或扩展性的场景,则可能涉及到更多高级话题如负载均衡、SSL证书安装等方面的知识。不过对于大多数简单的应用场景而言,上述基本流程已经足够满足需求了。 ```python import gradio as gr def greet(name): return f'Hello {name}!' iface = gr.Interface(fn=greet, inputs='text', outputs='text') if __name__ == "__main__": iface.launch(server_name="0.0.0.0", server_port=7860) ``` 此段代码展示了如何编写一个简易的Gradio接口函数`greet()`用于处理输入文本并返回问候语句作为输出结果。当文件被当作脚本直接运行时(即处于主模块状态),将会调用`launch()`方法开启监听外部连接的服务端口,默认情况下为7860号端口。请注意实际生产环境下建议调整参数以适应具体网络状况和安全策略的要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值