@@ -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. | |||||
## 常见问题 | ## 常见问题 | ||||
@@ -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 time.monotonic() > expiry_time: | |||||
if datetime.now() > 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)) | ||||
@@ -0,0 +1,5 @@ | |||||
# entry point for online railway deployment | |||||
from app import run | |||||
if __name__ == '__main__': | |||||
run() |