{"id":182,"date":"2025-01-25T15:27:45","date_gmt":"2025-01-25T07:27:45","guid":{"rendered":"https:\/\/www.aitwg.com\/?p=182"},"modified":"2025-03-23T15:29:04","modified_gmt":"2025-03-23T07:29:04","slug":"vps-%e9%9b%b2%e7%ab%af%e9%83%a8%e7%bd%b2-ui2code","status":"publish","type":"post","link":"https:\/\/www.aitwg.com\/?p=182","title":{"rendered":"VPS \u96f2\u7aef\u90e8\u7f72 ui2code"},"content":{"rendered":"\n<p>\u4ee5\u4e0b\u662f\u5982\u4f55\u5728 Nginx \u7db2\u9801\u4f3a\u670d\u5668\u4e0a\u90e8\u7f72 OpenAI ui2code \u7684\u6307\u5357\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEi0UoHjwj791HXovhhNe5AWnde-VUO5KPujdEatSQRTfIgEXeo1GrV4d04ZVZWBoyN8WJd1ZQNg24banPrzPqvan5y-gL8qmXwB0G6mwiCxSpwafWfHM8XUBFAfeqLtrFChyphenhyphenlq2j64orlGJMsONxfdiPXiXlwZlaYe11DcjJKbLkWZoVhyphenhypheny4JG6apkINw\/s1448\/ezgif.com-animated-gif-maker.gif\"><img decoding=\"async\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEi0UoHjwj791HXovhhNe5AWnde-VUO5KPujdEatSQRTfIgEXeo1GrV4d04ZVZWBoyN8WJd1ZQNg24banPrzPqvan5y-gL8qmXwB0G6mwiCxSpwafWfHM8XUBFAfeqLtrFChyphenhyphenlq2j64orlGJMsONxfdiPXiXlwZlaYe11DcjJKbLkWZoVhyphenhypheny4JG6apkINw\/w400-h324\/ezgif.com-animated-gif-maker.gif\" alt=\"\"\/><\/a><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<!--more-->\n\n\n\n<h3 class=\"wp-block-heading\"><strong>1. \u6e96\u5099\u74b0\u5883<\/strong><\/h3>\n\n\n\n<p><strong>\u66f4\u65b0\u7cfb\u7d71\u5957\u4ef6<\/strong>\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$sudo apt update &amp;&amp; sudo apt upgrade -y<\/code><\/pre>\n\n\n\n<p><strong>\u5b89\u88dd Python \u548c Pip<\/strong>\uff1a \u5982\u679c\u5c1a\u672a\u5b89\u88dd Python \u548c Pip\uff0c\u57f7\u884c\u4ee5\u4e0b\u6307\u4ee4\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$sudo apt install python3 python3-pip -y<\/code><\/pre>\n\n\n\n<p><strong>\u5b89\u88dd Virtualenv\uff08\u53ef\u9078\u4f46\u5efa\u8b70\uff09<\/strong>\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$pip3 install virtualenv<\/code><\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>2. \u8a2d\u5b9a Streamlit \u61c9\u7528<\/strong><\/h3>\n\n\n\n<p><strong>\u53d6\u5f97\u4f60\u7684 Streamlit \u61c9\u7528\u7a0b\u5f0f\u78bc<\/strong>\uff1a \u5982\u679c\u7a0b\u5f0f\u78bc\u5b58\u653e\u65bc Git \u5009\u5eab\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$git clone https:\/\/github.com\/aitwg\/openai-ui2code.git\n$cd openai-ui2code<\/code><\/pre>\n\n\n\n<p><strong>\u5efa\u7acb\u865b\u64ec\u74b0\u5883<\/strong>\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$virtualenv venv\n$source venv\/bin\/activate<\/code><\/pre>\n\n\n\n<p><strong>\u5b89\u88dd\u4f9d\u8cf4\u5957\u4ef6<\/strong>\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$pip install -r requirements.txt<\/code><\/pre>\n\n\n\n<p><strong>\u672c\u5730\u6e2c\u8a66\u61c9\u7528<\/strong>\uff1a \u78ba\u4fdd\u61c9\u7528\u7a0b\u5f0f\u53ef\u4ee5\u6b63\u5e38\u904b\u884c\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$streamlit run app.py<\/code><\/pre>\n\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li><\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>3. \u914d\u7f6e Streamlit \u70ba\u751f\u7522\u74b0\u5883<\/strong><\/h3>\n\n\n\n<p><strong>\u4fee\u6539 Streamlit \u7684\u8a2d\u5b9a\u6a94<\/strong>\uff1a \u5efa\u7acb\u6216\u7de8\u8f2f ~\/.streamlit\/config.toml\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$mkdir -p ~\/.streamlit\/\n$nano ~\/.streamlit\/config.toml<\/code><\/pre>\n\n\n\n<p>\u5728\u6a94\u6848\u4e2d\u65b0\u589e\u4ee5\u4e0b\u5167\u5bb9\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;server]\nheadless = true\nenableCORS = false\nport = 8501<\/code><\/pre>\n\n\n\n<p><strong>\u8a2d\u5b9a Systemd \u670d\u52d9\uff08\u53ef\u9078\uff0c\u4f46\u63a8\u85a6\uff09<\/strong>\uff1a \u5efa\u7acb\u4e00\u500b Systemd \u670d\u52d9\u6a94\u6848\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$sudo nano \/etc\/systemd\/system\/streamlit.service<\/code><\/pre>\n\n\n\n<p>\u65b0\u589e\u4ee5\u4e0b\u5167\u5bb9\uff1a<\/p>\n\n\n\n<p><br>[Unit]<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Description=Streamlit App\nAfter=network.target\n&#91;Service]\nUser=\u4f60\u7684\u7528\u6236\u540d\nWorkingDirectory=\/path\/to\/your\/app\nExecStart=\/path\/to\/your\/venv\/bin\/streamlit run app.py\nRestart=always\n&#91;Install]\nWantedBy=multi-user.target<\/code><\/pre>\n\n\n\n<p>\u5c07 \/path\/to\/your\/app \u548c \/path\/to\/your\/venv \u66ff\u63db\u70ba\u61c9\u7528\u7684\u5be6\u969b\u8def\u5f91\u3002<br>\u555f\u7528\u4e26\u555f\u52d5\u670d\u52d9\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$sudo systemctl enable streamlit.service\n$sudo systemctl start streamlit.service<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>4. \u5b89\u88dd\u4e26\u914d\u7f6e Nginx<\/strong><\/h3>\n\n\n\n<p><strong>\u65b0\u589e Nginx \u914d\u7f6e\u6a94<\/strong>\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$sudo nano \/etc\/nginx\/sites-available\/streamlit<\/code><\/pre>\n\n\n\n<p>\u5728\u6a94\u6848\u4e2d\u65b0\u589e\u4ee5\u4e0b\u5167\u5bb9\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>server {\nlisten 80;\n\n&nbsp;&nbsp;&nbsp;&nbsp;server_name yourdomain.com;\n\n&nbsp;&nbsp;&nbsp;&nbsp;location \/ {\n\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;proxy_pass http:\/\/localhost:8501;\n\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;proxy_set_header Host $host;\n\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;proxy_set_header X-Real-IP $remote_addr;\n\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;proxy_set_header X-Forwarded-Proto $scheme;\n\n&nbsp;&nbsp;&nbsp;&nbsp;}\n\n}<\/code><\/pre>\n\n\n\n<p><strong>\u555f\u7528\u7ad9\u9ede\u4e26\u91cd\u65b0\u555f\u52d5 Nginx<\/strong>\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$sudo ln -s \/etc\/nginx\/sites-available\/streamlit \/etc\/nginx\/sites-enabled\/\n$sudo nginx -t\n$sudo systemctl restart nginx\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>5. \uff08\u53ef\u9078\uff09\u70ba\u61c9\u7528\u8a2d\u5b9a HTTPS<\/strong><\/h3>\n","protected":false},"excerpt":{"rendered":"<p>\u4ee5\u4e0b\u662f\u5982\u4f55\u5728 Nginx \u7db2\u9801\u4f3a\u670d\u5668\u4e0a\u90e8\u7f72 OpenAI ui2code \u7684\u6307\u5357\uff1a<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":0,"neve_meta_title_alignment":"","neve_meta_author_avatar":"","neve_post_elements_order":"","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":"","footnotes":""},"categories":[5,6],"tags":[],"class_list":["post-182","post","type-post","status-publish","format-standard","hentry","category-5","category-6"],"_links":{"self":[{"href":"https:\/\/www.aitwg.com\/index.php?rest_route=\/wp\/v2\/posts\/182","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.aitwg.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.aitwg.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.aitwg.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.aitwg.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=182"}],"version-history":[{"count":1,"href":"https:\/\/www.aitwg.com\/index.php?rest_route=\/wp\/v2\/posts\/182\/revisions"}],"predecessor-version":[{"id":183,"href":"https:\/\/www.aitwg.com\/index.php?rest_route=\/wp\/v2\/posts\/182\/revisions\/183"}],"wp:attachment":[{"href":"https:\/\/www.aitwg.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=182"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.aitwg.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=182"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.aitwg.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=182"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}