177 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Markdown
		
	
	
			
		
		
	
	
			177 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Markdown
		
	
	
# Multi-file configuration
 | 
						||
 | 
						||
The Xray program supports the use of multiple configuration files.
 | 
						||
 | 
						||
The main purpose of using multiple configuration files is to distribute different module configurations, making it easier to manage and maintain.
 | 
						||
 | 
						||
This feature is mainly designed to enrich the Xray ecosystem. For example, for GUI-based clients, only fixed functions such as node selection are usually implemented, and complex configurations are difficult to implement graphically. By leaving a custom `confdir` configuration directory for complex functions, server deployment scripts can simply add files to `confdir` to implement multiple protocol configurations.
 | 
						||
 | 
						||
## Multi-file startup
 | 
						||
 | 
						||
::: tip
 | 
						||
The startup information will indicate each configuration file being read in sequence. Please pay attention to whether the startup information matches the order you have set.
 | 
						||
:::
 | 
						||
 | 
						||
```shell
 | 
						||
$ xray run -confdir /etc/xray/confs
 | 
						||
```
 | 
						||
 | 
						||
You can also use `Xray.location.confdir` or `Xray_LOCATION_CONFDIR` to specify the `confdir`.
 | 
						||
 | 
						||
The `-confdir` parameter takes precedence over the environment variable. If a valid directory is specified by the parameter, the path in the environment variable will not be read.
 | 
						||
 | 
						||
## Rule Explanation
 | 
						||
 | 
						||
### Normal Objects(`{}`)
 | 
						||
 | 
						||
**In the top-level object of `JSON`, the latter overrides or supplements the former.**
 | 
						||
 | 
						||
For example:
 | 
						||
 | 
						||
- base.json
 | 
						||
 | 
						||
```json
 | 
						||
{
 | 
						||
  "log": {},
 | 
						||
  "api": {},
 | 
						||
  "dns": {},
 | 
						||
  "stats": {},
 | 
						||
  "policy": {},
 | 
						||
  "transport": {},
 | 
						||
  "routing": {},
 | 
						||
  "inbounds": []
 | 
						||
}
 | 
						||
```
 | 
						||
 | 
						||
- outbounds.json
 | 
						||
 | 
						||
```json
 | 
						||
{
 | 
						||
  "outbounds": []
 | 
						||
}
 | 
						||
```
 | 
						||
 | 
						||
When starting Xray with multiple configurations, use the following command:
 | 
						||
 | 
						||
```bash
 | 
						||
$ xray run -confdir /etc/xray/confs
 | 
						||
```
 | 
						||
 | 
						||
These two configuration files are equivalent to a single combined configuration. If you need to modify the outbound nodes, simply modify the content of `outbounds.json`.
 | 
						||
 | 
						||
If you need to change the log level for debugging purposes, there is no need to modify `base.json`. You can add an additional configuration file:
 | 
						||
 | 
						||
- debuglog.json
 | 
						||
 | 
						||
```json
 | 
						||
{
 | 
						||
  "log": {
 | 
						||
    "loglevel": "debug"
 | 
						||
  }
 | 
						||
}
 | 
						||
```
 | 
						||
 | 
						||
Start the program in sequence after `base.json` to output logs at the debug level.
 | 
						||
 | 
						||
### Arrays(`[]`)
 | 
						||
 | 
						||
In the JSON configuration, `inbounds` and `outbounds` are array structures with special rules:
 | 
						||
 | 
						||
- When there are two or more elements in the array, the latter overrides the former for `inbounds`/`outbounds`.
 | 
						||
- When there is only one element in the array, it searches for an existing element with the same `tag` to override. If it cannot be found:
 | 
						||
  - For `inbounds`, add it to the end (the order of elements in `inbounds` is irrelevant).
 | 
						||
  - For `outbounds`, add it to the beginning (the default first-choice outbound). However, if the filename contains "tail" (case-insensitive), add it to the end.
 | 
						||
 | 
						||
With multiple configurations, it is easy to add inbound for different protocols to the original configuration without modifying the original configuration.
 | 
						||
 | 
						||
The following example is not a valid configuration but is provided to demonstrate the above rules.
 | 
						||
 | 
						||
- 000.json
 | 
						||
 | 
						||
```json
 | 
						||
{
 | 
						||
  "inbounds": [
 | 
						||
    {
 | 
						||
      "protocol": "socks",
 | 
						||
      "tag": "socks",
 | 
						||
      "port": 1234
 | 
						||
    }
 | 
						||
  ]
 | 
						||
}
 | 
						||
```
 | 
						||
 | 
						||
- 001.json
 | 
						||
 | 
						||
```json
 | 
						||
{
 | 
						||
  "inbounds": [
 | 
						||
    {
 | 
						||
      "protocol": "http",
 | 
						||
      "tag": "http"
 | 
						||
    }
 | 
						||
  ]
 | 
						||
}
 | 
						||
```
 | 
						||
 | 
						||
- 002.json
 | 
						||
 | 
						||
```json
 | 
						||
{
 | 
						||
  "inbounds": [
 | 
						||
    {
 | 
						||
      "protocol": "socks",
 | 
						||
      "tag": "socks",
 | 
						||
      "port": 4321
 | 
						||
    }
 | 
						||
  ]
 | 
						||
}
 | 
						||
```
 | 
						||
 | 
						||
The three configurations will be combined into:
 | 
						||
 | 
						||
```json
 | 
						||
{
 | 
						||
  "inbounds": [
 | 
						||
    {
 | 
						||
      "protocol": "socks",
 | 
						||
      "tag": "socks",
 | 
						||
      "port": 4321 // < 002顺序在000后,因此覆盖tag为socks的inbound端口为4321
 | 
						||
    },
 | 
						||
    {
 | 
						||
      "protocol": "http",
 | 
						||
      "tag": "http"
 | 
						||
    }
 | 
						||
  ]
 | 
						||
}
 | 
						||
```
 | 
						||
 | 
						||
## Recommended Multi-file List
 | 
						||
 | 
						||
Execute:
 | 
						||
 | 
						||
```bash
 | 
						||
for BASE in 00_log 01_api 02_dns 03_routing 04_policy 05_inbounds 06_outbounds 07_transport 08_stats 09_reverse; do echo '{}' > "/etc/Xray/$BASE.json"; done
 | 
						||
```
 | 
						||
 | 
						||
or
 | 
						||
 | 
						||
```bash
 | 
						||
for BASE in 00_log 01_api 02_dns 03_routing 04_policy 05_inbounds 06_outbounds 07_transport 08_stats 09_reverse; do echo '{}' > "/usr/local/etc/Xray/$BASE.json"; done
 | 
						||
```
 | 
						||
 | 
						||
```bash
 | 
						||
.
 | 
						||
├── 00_log.json
 | 
						||
├── 01_api.json
 | 
						||
├── 02_dns.json
 | 
						||
├── 03_routing.json
 | 
						||
├── 04_policy.json
 | 
						||
├── 05_inbounds.json
 | 
						||
├── 06_outbounds.json
 | 
						||
├── 07_transport.json
 | 
						||
├── 08_stats.json
 | 
						||
└── 09_reverse.json
 | 
						||
 | 
						||
0 directories, 10 files
 | 
						||
```
 |