开发者 → 指南

使用 git push 部署应用

NameOcean App Server 是一台 Linux 服务器,您的项目位于一个 git 仓库中。您推送,它就运行。本指南将带您把一个 Flask 应用从首次推送部署到使用 HTTPS 的自有域名;Django、Node.js 和 Next.js 只有一行不同。

请求如何到达您的应用

请求路径
visitor ──HTTPS:443──▶ NameOcean load balancer ──HTTP:80──▶ nginx ──▶ your app on 127.0.0.1:8000

证书由负载均衡器持有,因此服务器只需提供 80 端口服务。您的应用在 supervisor 下监听 127.0.0.1:8000,nginx 将请求转发给它。

1. 服务器和您的 SSH 密钥

nameocean
$ nameocean servers plans
$ nameocean servers create --plan starter --yes
$ nameocean servers ls
ID   NAME      STATUS   PLAN     DEFAULT DOMAIN          DOMAINS
812  3f9a1c2e  running  starter  3f9a1c2e.nameocean.org  -
$ nameocean servers ssh-keys add 3f9a1c2e

服务器按月计费;不带 --yes 的 servers create 仅显示价格。您也可以在 控制面板 → 主机 中创建。ssh-keys add 会安装 ~/.ssh/id_ed25519.pub,git 推送时将使用它。

2. 项目

app.py
import os

from flask import Flask

app = Flask(__name__)


@app.get("/")
def home():
    return f"Hello from {os.environ.get('SITE_NAME', 'NameOcean')}"
requirements.txt
flask
gunicorn
.nameocean/deploy.sh
#!/bin/bash
# runs on the server after every push, in /root/app, with your env variables
set -e
pip install -r requirements.txt

构建步骤写在 deploy.sh 中:安装依赖包、数据库迁移、npm run build。推送时,其输出会显示在您的终端中。

3. 首次部署

nameocean
$ git add . && git commit -m "First deploy"
$ nameocean deploy 3f9a1c2e

nameocean deploy 会添加一个名为 nameocean 的 git 远程仓库,将当前分支推送到服务器上的 /root/app(此后服务器将部署该分支),同时也推送到您自己的 origin,并重启应用。

4. 运行应用(仅需一次)

告诉 supervisor 如何启动应用,并让 nginx 将请求转发给它。这两个文件都已在服务器上,并附有各技术栈的示例;您只需取消注释即可。

ssh
$ nameocean servers info 3f9a1c2e   # the ssh line
$ ssh -p 2152 root@3f9a1c2e.nameocean.org
# vi /root/conf/supervisor.conf   # uncomment the Flask [program:app] and the shared settings
# supervisorctl reread && supervisorctl update
# vi /root/conf/nginx.conf        # remove the static "location /", uncomment the proxy one
# nginx -t && systemctl reload nginx
# curl -s http://127.0.0.1/
Hello from NameOcean

Flask 的 [program:app]:

/root/conf/supervisor.conf
[program:app]
command=/root/.pyenv/versions/app/bin/gunicorn app:app --workers 2 --bind 127.0.0.1:8000
directory=/root/app
environment=PATH="/root/.pyenv/versions/app/bin:/usr/local/bin:/usr/bin:/bin"
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=/var/log/supervisor/app.log

其他技术栈只需更改 command(文件中也包含这些示例):

Django/root/.pyenv/versions/app/bin/gunicorn myproject.wsgi:application --workers 2 --bind 127.0.0.1:8000
FastAPI/root/.pyenv/versions/app/bin/uvicorn main:app --host 127.0.0.1 --port 8000 --workers 2
Node.js/usr/bin/node server.js 并使用 environment=NODE_ENV="production",PORT="8000",HOST="127.0.0.1"
Next.js/usr/bin/npx next start -H 127.0.0.1 -p 8000 并在 deploy.sh 中添加 npm ci && npm run build
Go/root/app/server 并在 deploy.sh 中添加 go build -o server .

您的应用现已上线:https://3f9a1c2e.nameocean.org。

5. 设置和密钥

nameocean
$ nameocean servers env set 3f9a1c2e SITE_NAME=Kahvebot SECRET_KEY=…

所有应用、deploy.sh 和 SSH 会话都能获取这些变量,应用会重启以读取它们。它们仅保存在服务器上,绝不会存入代码仓库或 NameOcean 的数据库。

6. 您的域名

nameocean
$ nameocean bind kahvebot.com 3f9a1c2e

域名的 DNS 必须托管在 NameOcean。NameOcean 会添加 DNS 记录、签发证书并配置负载均衡器(HTTP 跳转到 HTTPS,裸域名跳转到 www);通常只需几分钟。服务器上无需任何更改。

7. 此后的每次部署

nameocean
$ git commit -am "New page"
$ nameocean deploy
$ nameocean servers logs 3f9a1c2e --app app -f   # if it does not come up

每次部署都会发送一个 server.deployed webhook 事件,其中包含提交信息以及应用是否成功启动。备份、重启及其他 API 功能,请参阅:App Server API。服务器上的 /root/AGENTS.md 中提供了面向 AI 代理的指南。