mirror of
https://github.com/zhayujie/chatgpt-on-wechat.git
synced 2026-07-20 13:47:15 +08:00
Support online railway deployment
This commit is contained in:
@@ -177,6 +177,14 @@ nohup python3 app.py & tail -f nohup.out # 在后台运行程序并通
|
|||||||
|
|
||||||
参考文档 [Docker部署](https://github.com/limccn/chatgpt-on-wechat/wiki/Docker%E9%83%A8%E7%BD%B2) (Contributed by [limccn](https://github.com/limccn))。
|
参考文档 [Docker部署](https://github.com/limccn/chatgpt-on-wechat/wiki/Docker%E9%83%A8%E7%BD%B2) (Contributed by [limccn](https://github.com/limccn))。
|
||||||
|
|
||||||
|
### 4. Railway部署
|
||||||
|
[Use with Railway](#use-with-railway)(PaaS, Free, Stable, ✅Recommended)
|
||||||
|
> Railway offers $5 (500 hours) of runtime per month
|
||||||
|
1. Click the [Railway](https://railway.app/) button to go to the Railway homepage
|
||||||
|
2. Click the `Start New Project` button.
|
||||||
|
3. Click the `Deploy from Github repo` button.
|
||||||
|
4. Choose your repo (you can fork this repo firstly)
|
||||||
|
5. Set environment variable to override settings in config-template.json, such as: model, open_ai_api_base, open_ai_api_key, use_azure_chatgpt etc.
|
||||||
|
|
||||||
## 常见问题
|
## 常见问题
|
||||||
|
|
||||||
|
|||||||
6
app.py
6
app.py
@@ -5,7 +5,8 @@ from channel import channel_factory
|
|||||||
from common.log import logger
|
from common.log import logger
|
||||||
|
|
||||||
from plugins import *
|
from plugins import *
|
||||||
if __name__ == '__main__':
|
|
||||||
|
def run():
|
||||||
try:
|
try:
|
||||||
# load config
|
# load config
|
||||||
config.load_config()
|
config.load_config()
|
||||||
@@ -21,3 +22,6 @@ if __name__ == '__main__':
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error("App startup failed!")
|
logger.error("App startup failed!")
|
||||||
logger.exception(e)
|
logger.exception(e)
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
run()
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
import time
|
from datetime import datetime, timedelta
|
||||||
|
|
||||||
|
|
||||||
class ExpiredDict(dict):
|
class ExpiredDict(dict):
|
||||||
@@ -8,8 +8,7 @@ class ExpiredDict(dict):
|
|||||||
|
|
||||||
def __getitem__(self, key):
|
def __getitem__(self, key):
|
||||||
value, expiry_time = super().__getitem__(key)
|
value, expiry_time = super().__getitem__(key)
|
||||||
# 如果元素已过期,则从字典中删除该元素并抛出 KeyError 异常
|
if datetime.now() > expiry_time:
|
||||||
if time.monotonic() > expiry_time:
|
|
||||||
del self[key]
|
del self[key]
|
||||||
raise KeyError("expired {}".format(key))
|
raise KeyError("expired {}".format(key))
|
||||||
self.__setitem__(key, value)
|
self.__setitem__(key, value)
|
||||||
@@ -24,20 +23,20 @@ class ExpiredDict(dict):
|
|||||||
return self[key]
|
return self[key]
|
||||||
except KeyError:
|
except KeyError:
|
||||||
return default
|
return default
|
||||||
|
|
||||||
def __contains__(self, key):
|
def __contains__(self, key):
|
||||||
try:
|
try:
|
||||||
self[key]
|
self[key]
|
||||||
return True
|
return True
|
||||||
except KeyError:
|
except KeyError:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def keys(self):
|
def keys(self):
|
||||||
keys=list(super().keys())
|
keys = list(super().keys())
|
||||||
return [key for key in keys if key in self]
|
return [key for key in keys if key in self]
|
||||||
|
|
||||||
def items(self):
|
def items(self):
|
||||||
return [(key, self[key]) for key in self.keys()]
|
return [(key, self[key]) for key in self.keys()]
|
||||||
|
|
||||||
def __iter__(self):
|
def __iter__(self):
|
||||||
return self.keys().__iter__()
|
return self.keys().__iter__()
|
||||||
@@ -10,11 +10,18 @@ def load_config():
|
|||||||
global config
|
global config
|
||||||
config_path = "./config.json"
|
config_path = "./config.json"
|
||||||
if not os.path.exists(config_path):
|
if not os.path.exists(config_path):
|
||||||
raise Exception('配置文件不存在,请根据config-template.json模板创建config.json文件')
|
logger.info('配置文件不存在,将使用config-template.json模板')
|
||||||
|
config_path = "./config-template.json"
|
||||||
|
|
||||||
config_str = read_file(config_path)
|
config_str = read_file(config_path)
|
||||||
# 将json字符串反序列化为dict类型
|
# 将json字符串反序列化为dict类型
|
||||||
config = json.loads(config_str)
|
config = json.loads(config_str)
|
||||||
|
|
||||||
|
# override config with environment variables.
|
||||||
|
# Some online deployment platforms (e.g. Railway) deploy project from github directly. So you shouldn't put your secrets like api key in a config file, instead use environment variables to override the default config.
|
||||||
|
for name, value in os.environ.items():
|
||||||
|
config[name] = value
|
||||||
|
|
||||||
logger.info("[INIT] load config: {}".format(config))
|
logger.info("[INIT] load config: {}".format(config))
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
5
main.py
Normal file
5
main.py
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
# entry point for online railway deployment
|
||||||
|
from app import run
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
run()
|
||||||
Reference in New Issue
Block a user