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-apimkdir -p /opt/new-api/volumes/new-api/datamkdir -p /opt/new-api/volumes/new-api/logsmkdir -p /opt/new-api/volumes/postgresmkdir -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 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.conf3. 测试配置 sudo nginx -t4. 重载 Nginx sudo systemctl reload nginx
接着测试并重启。
1 2 3 4 sudo nginx -tsudo systemctl reload nginx
2.docker启动 docker的安装配置这里就不赘述了,直接启动服务。
1 2 3 4 5 6 7 8 cd /opt/new-apisudo docker compose -f docker-compose.server.yml up -dsudo docker compose -f docker-compose.server.yml pssudo 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-apisudo 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所需证书,而且能自动续期。