NewAPI搭建教程

NewAPI

官方地址

主仓库:https://github.com/Calcium-Ion/new-api

官方文档:https://docs.newapi.pro

修改docker-compose.xml文件和nginx配置文件

docker-compose.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
services:
new-api:
image: calciumion/new-api:latest
container_name: new-api-app
restart: unless-stopped
command: --log-dir /app/logs
ports:
# Only expose the app to the local machine. Public traffic should go through Nginx.
- "127.0.0.1:${APP_PORT}:3000"
volumes:
- /opt/new-api/volumes/new-api/data:/data
- /opt/new-api/volumes/new-api/logs:/app/logs
environment:
TZ: ${TZ}
PORT: "3000"
SQL_DSN: postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}?sslmode=disable
REDIS_CONN_STRING: redis://:${REDIS_PASSWORD}@redis:6379/0
SESSION_SECRET: ${SESSION_SECRET}
CRYPTO_SECRET: ${CRYPTO_SECRET}
ERROR_LOG_ENABLED: "true"
BATCH_UPDATE_ENABLED: "true"
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
networks:
- new-api-network
healthcheck:
test: ["CMD-SHELL", "wget -q -O - http://localhost:3000/api/status | grep -o '\"success\":\\s*true' || exit 1"]
interval: 30s
timeout: 10s
retries: 3

redis:
image: redis:7-alpine
container_name: new-api-redis
restart: unless-stopped
command: ["redis-server", "--appendonly", "yes", "--requirepass", "${REDIS_PASSWORD}"]
volumes:
- /opt/new-api/volumes/redis:/data
networks:
- new-api-network
healthcheck:
test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD}", "ping"]
interval: 30s
timeout: 10s
retries: 3

postgres:
image: postgres:16-alpine
container_name: new-api-postgres
restart: unless-stopped
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
TZ: ${TZ}
volumes:
- /opt/new-api/volumes/postgres:/var/lib/postgresql/data
networks:
- new-api-network
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
interval: 30s
timeout: 10s
retries: 5

networks:
new-api-network:
driver: bridge

需要修改的地方:

1.数据库密码和连接串。现在默认是明文测试值 123456,要同时改 new-api/docker-compose.yml:29 和 new-api/docker-compose.yml:63 里的 Postgres 配置,不然就是默认弱口令。

2.SESSION_SECRET。仓库注释里已经提示了,见 new-api/docker-compose.yml:35;代码里也明确禁止用默认值 random_string,见new-api/common/init.go:47。单机也建议你设成随机长字符串。

3.CRYPTO_SECRET。如果你保留 Redis,建议显式设置;多机/共享 Redis 时更应设置,见 new-api/common/init.go:58 和 new-api/README.zh_CN.md 里的环境变量说明。

4.端口暴露方式。默认是 3000:3000,见 new-api/docker-compose.yml:23。服务器上更建议改成只监听本机,例如 127.0.0.1:3000:3000,然后前面挂 Nginx 或 Caddy 做域名和 HTTPS。

把所需要的环境配置在.env文件里便于管理。

1
2
3
4
5
6
7
8
APP_PORT=3000
TZ=Asia/Shanghai
POSTGRES_USER=newapi
POSTGRES_DB=newapi
POSTGRES_PASSWORD=
REDIS_PASSWORD=
SESSION_SECRET=
CRYPTO_SECRET=

在自己的服务器上创建对应的挂载目录

1
2
3
4
5
mkdir -p /opt/new-api
mkdir -p /opt/new-api/volumes/new-api/data
mkdir -p /opt/new-api/volumes/new-api/logs
mkdir -p /opt/new-api/volumes/postgres
mkdir -p /opt/new-api/volumes/redis

接下来我们将docker-compose.xml文件上传到服务器,由于我们不是管理员只有sudo权限,所以我们上传到家目录再进行转移

1
2
sudo mv ~/docker-compose.server.yml /opt/new-api/
sudo mv ~/.env /opt/new-api/

nginx.config

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# Suggested target path on the server:
# /etc/nginx/sites-available/new-api.conf
#
# Common enable flow on Ubuntu/Debian:
# ln -s /etc/nginx/sites-available/new-api.conf /etc/nginx/sites-enabled/new-api.conf
# nginx -t
# systemctl reload nginx
#
# Replace these before deploying:
# 1. server_name -> your real domain
# 2. Enable the HTTPS server block after certificates are ready

server {
listen 80;
listen [::]:80;
server_name glqweqe.site www.glqweqe.site;

client_max_body_size 100m;

location /.well-known/acme-challenge/ {
root /var/www/certbot;
}

location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_buffering off;
}
}

# Enable this block after you have an SSL certificate for the domain.
# server {
# listen 443 ssl http2;
# listen [::]:443 ssl http2;
# server_name glqweqe.site www.glqweqe.site;
#
# ssl_certificate /etc/letsencrypt/live/glqweqe.site/fullchain.pem;
# ssl_certificate_key /etc/letsencrypt/live/glqweqe.site/privkey.pem;
# ssl_session_timeout 1d;
# ssl_session_cache shared:SSL:10m;
# ssl_session_tickets off;
#
# client_max_body_size 100m;
#
# location / {
# proxy_pass http://127.0.0.1:3000;
# proxy_http_version 1.1;
# proxy_set_header Host $host;
# proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# proxy_set_header X-Forwarded-Proto https;
# proxy_set_header Upgrade $http_upgrade;
# proxy_set_header Connection "upgrade";
# proxy_read_timeout 3600s;
# proxy_send_timeout 3600s;
# proxy_buffering off;
# }
# }



接下来我们上传配置文件到指定的位置,同样我们先上传到家目录,然后转移到指定位置。

1
sudo mv ~/new-api.conf /etc/nginx/sites-available/new-api.conf

看自己服务器的/etc/nginx包下是否已经有相关的内容,有说明已经存在相关服务了。

但是如果存在默认模板的话我们需要先删除然后替换成自己的配置,最后再建立启用链接。

1
2
3
4
5
ubuntu@VM-0-3-ubuntu:/etc/nginx$ ls /etc/nginx/sites-enabled
default #显示defalut说明存在默认配置需要删除

#删除默认配置
sudo rm /etc/nginx/sites-enabled/default
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1. 把配置文件放到

/etc/nginx/sites-available/new-api.conf

2. 建立启用链接,sites-available里面是你所有的配置,sites-enabled是你决定启用的配置

sudo ln -s /etc/nginx/sites-available/new-api.conf /etc/nginx/sites-enabled/new-api.conf

3. 测试配置

sudo nginx -t

4. 重载 Nginx

sudo systemctl reload nginx

接着测试并重启。

1
2
3
4
#测试“配置文件能不能被 Nginx 正常解析和加载”
sudo nginx -t
#重启nginx服务
sudo systemctl reload nginx

2.docker启动

docker的安装配置这里就不赘述了,直接启动服务。

1
2
3
4
5
6
7
8
cd /opt/new-api
sudo docker compose -f docker-compose.server.yml up -d

# 然后检查容器状态:
sudo docker compose -f docker-compose.server.yml ps

# 如果你想顺手看日志:
sudo docker compose -f docker-compose.server.yml logs --tail=100

接下来我们可以进行测试了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1. 先在服务器本机测试应用

curl http://127.0.0.1:3000

2. 再测试 Nginx 反代,如果不行可能是nginx没启动,需要启动同时设置开机自启

curl http://127.0.0.1

3. 最后在你自己的电脑浏览器里访问

http://glqweqe.site

如果打不开,再补查这几个:

sudo docker compose -f /opt/new-api/docker-compose.server.yml logs --tail=100 new-api
sudo systemctl status nginx --no-pager

3.配置https访问

首先我们需申请相关证书,备案期无法申请,备案成功后再申请。一般来说,申请成功后不需要改nginx相关配置,它会自己去修改,但是如果我们想做优化,则需要手动去改。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
然后在服务器上执行这组命令。Certbot 官方对 Nginx on Linux 推荐用 snap 安装并可直接用 --nginx 申请证书。
来源:

- https://certbot.eff.org/instructions?os=snap&tab=standard&ws=nginx
- https://letsencrypt.org/

- 更新 apt 软件包索引
- 让系统知道当前软件源里有哪些最新包
sudo apt update
- 安装 snapd
- 因为官方推荐用 snap 安装 certbot
sudo apt install -y snapd
- 安装 snap 的核心运行组件 core
- 相当于给后续 snap 包打基础
sudo snap install core
- 把 core 更新到最新
- 避免 snap 环境过旧导致后续安装异常
sudo snap refresh core
- 如果系统之前通过 apt 装过旧版 certbot,先移除
- 避免和 snap 版冲突
sudo apt remove -y certbot
- 通过 snap 安装官方推荐的 certbot
- --classic 表示给它经典权限模式,这是 certbot 常见安装方式
sudo snap install --classic certbot
- 创建一个命令链接
- 这样你以后直接输入 certbot 就能运行,不用每次写 /snap/bin/certbot
sudo ln -sf /snap/bin/certbot /usr/bin/certbot

安装完直接申请并让它自动改 Nginx:

sudo certbot --nginx -d glqweqe.site -d www.glqweqe.site

申请成功后再验证自动续期:

sudo certbot renew --dry-run

成功后证书一般就在这里:

/etc/letsencrypt/live/glqweqe.site/fullchain.pem
/etc/letsencrypt/live/glqweqe.site/privkey.pem

如果 www.glqweqe.site 没有解析,就只申请主域名:

sudo certbot --nginx -d glqweqe.site

也可以用caddy做反代,可以自动申请https所需证书,而且能自动续期。