|
| 1 | +# Archery安装 |
| 2 | + |
| 3 | +[Archery官网](https://archerydms.com/) |
| 4 | + |
| 5 | +[Archery github](https://github.com/hhyo/Archery) |
| 6 | + |
| 7 | + |
| 8 | + |
| 9 | +## 安装报错 |
| 10 | + |
| 11 | +### `SECRET_KEY` 未设置 |
| 12 | + |
| 13 | +```shell |
| 14 | +[2026-01-13 11:12:20 +0800] [20] [INFO] Worker exiting (pid: 20) |
| 15 | +[2026-01-13 11:12:20 +0800] [21] [ERROR] Exception in worker process |
| 16 | +Traceback (most recent call last): |
| 17 | + File "/opt/venv4archery/lib/python3.11/site-packages/gunicorn/arbiter.py", line 609, in spawn_worker |
| 18 | + worker.init_process() |
| 19 | + File "/opt/venv4archery/lib/python3.11/site-packages/gunicorn/workers/base.py", line 134, in init_process |
| 20 | + self.load_wsgi() |
| 21 | + File "/opt/venv4archery/lib/python3.11/site-packages/gunicorn/workers/base.py", line 146, in load_wsgi |
| 22 | + self.wsgi = self.app.wsgi() |
| 23 | + ^^^^^^^^^^^^^^^ |
| 24 | + File "/opt/venv4archery/lib/python3.11/site-packages/gunicorn/app/base.py", line 67, in wsgi |
| 25 | + self.callable = self.load() |
| 26 | + ^^^^^^^^^^^ |
| 27 | + File "/opt/venv4archery/lib/python3.11/site-packages/gunicorn/app/wsgiapp.py", line 58, in load |
| 28 | + return self.load_wsgiapp() |
| 29 | + ^^^^^^^^^^^^^^^^^^^ |
| 30 | + File "/opt/venv4archery/lib/python3.11/site-packages/gunicorn/app/wsgiapp.py", line 48, in load_wsgiapp |
| 31 | + return util.import_app(self.app_uri) |
| 32 | + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
| 33 | + File "/opt/venv4archery/lib/python3.11/site-packages/gunicorn/util.py", line 371, in import_app |
| 34 | + mod = importlib.import_module(module) |
| 35 | + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
| 36 | + File "/usr/local/lib/python3.11/importlib/__init__.py", line 126, in import_module |
| 37 | + return _bootstrap._gcd_import(name[level:], package, level) |
| 38 | + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
| 39 | + File "<frozen importlib._bootstrap>", line 1204, in _gcd_import |
| 40 | + File "<frozen importlib._bootstrap>", line 1176, in _find_and_load |
| 41 | + File "<frozen importlib._bootstrap>", line 1147, in _find_and_load_unlocked |
| 42 | + File "<frozen importlib._bootstrap>", line 690, in _load_unlocked |
| 43 | + File "<frozen importlib._bootstrap_external>", line 940, in exec_module |
| 44 | + File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed |
| 45 | + File "/opt/archery/archery/wsgi.py", line 16, in <module> |
| 46 | + application = get_wsgi_application() |
| 47 | + ^^^^^^^^^^^^^^^^^^^^^^ |
| 48 | + File "/opt/venv4archery/lib/python3.11/site-packages/django/core/wsgi.py", line 12, in get_wsgi_application |
| 49 | + django.setup(set_prefix=False) |
| 50 | + File "/opt/venv4archery/lib/python3.11/site-packages/django/__init__.py", line 24, in setup |
| 51 | + apps.populate(settings.INSTALLED_APPS) |
| 52 | + File "/opt/venv4archery/lib/python3.11/site-packages/django/apps/registry.py", line 91, in populate |
| 53 | + app_config = AppConfig.create(entry) |
| 54 | + ^^^^^^^^^^^^^^^^^^^^^^^ |
| 55 | + File "/opt/venv4archery/lib/python3.11/site-packages/django/apps/config.py", line 123, in create |
| 56 | + mod = import_module(mod_path) |
| 57 | + ^^^^^^^^^^^^^^^^^^^^^^^ |
| 58 | + File "/usr/local/lib/python3.11/importlib/__init__.py", line 126, in import_module |
| 59 | + return _bootstrap._gcd_import(name[level:], package, level) |
| 60 | + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
| 61 | + File "<frozen importlib._bootstrap>", line 1204, in _gcd_import |
| 62 | + File "<frozen importlib._bootstrap>", line 1176, in _find_and_load |
| 63 | + File "<frozen importlib._bootstrap>", line 1147, in _find_and_load_unlocked |
| 64 | + File "<frozen importlib._bootstrap>", line 690, in _load_unlocked |
| 65 | + File "<frozen importlib._bootstrap_external>", line 940, in exec_module |
| 66 | + File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed |
| 67 | + File "/opt/venv4archery/lib/python3.11/site-packages/django_q/apps.py", line 3, in <module> |
| 68 | + from django_q.conf import Conf |
| 69 | + File "/opt/venv4archery/lib/python3.11/site-packages/django_q/conf.py", line 31, in <module> |
| 70 | + class Conf: |
| 71 | + File "/opt/venv4archery/lib/python3.11/site-packages/django_q/conf.py", line 171, in Conf |
| 72 | + SECRET_KEY = settings.SECRET_KEY |
| 73 | + ^^^^^^^^^^^^^^^^^^^ |
| 74 | + File "/opt/venv4archery/lib/python3.11/site-packages/django/conf/__init__.py", line 101, in __getattr__ |
| 75 | + raise ImproperlyConfigured("The SECRET_KEY setting must not be empty.") |
| 76 | +django.core.exceptions.ImproperlyConfigured: The SECRET_KEY setting must not be empty. |
| 77 | +``` |
| 78 | + |
| 79 | + |
| 80 | + |
| 81 | +#### 解决方法 |
| 82 | + |
| 83 | +编辑 `.env` 新增 |
| 84 | + |
| 85 | +:::caution 注意 |
| 86 | + |
| 87 | +`SECRET_KEY` 的长度必须大于32位,否则 `archery` 容器会报错如下 |
| 88 | + |
| 89 | +```shell |
| 90 | +AssertionError: |
| 91 | +django-mirage-field key length (MIRAGE_SECRET_KEY or SECRET_KEY) must be longer than 32 characters! |
| 92 | +``` |
| 93 | + |
| 94 | +::; |
| 95 | + |
| 96 | +```shell |
| 97 | +SECRET_KEY="4GjsJiFenGBICVd0HDhcCoLRusXmJCNr" |
| 98 | +``` |
| 99 | + |
| 100 | + |
| 101 | + |
| 102 | +### `/opt/archery/.env not found` |
| 103 | + |
| 104 | +执行 `python3 manage.py makemigrations sql` 报错如下 |
| 105 | + |
| 106 | +```shell |
| 107 | +2026-01-13 14:23:09,043 - environ.environ - INFO - /opt/archery/.env not found - if you're not configuring your environment separately, check this. |
| 108 | +``` |
| 109 | +
|
| 110 | +
|
| 111 | +
|
| 112 | +#### 解决方法 |
| 113 | +
|
| 114 | +修改 `docker-compose.yml` 文件,在 `archery` 容器 `volumes` 下挂载 `.env` 文件 |
| 115 | +
|
| 116 | +```yaml |
| 117 | +volumes: |
| 118 | +...... |
| 119 | + - "./.env:/opt/archery/.env" |
| 120 | +``` |
| 121 | +
|
| 122 | +
|
| 123 | +
|
| 124 | +## 安装步骤 |
| 125 | +
|
| 126 | +### 克隆代码 |
| 127 | +
|
| 128 | +import Tabs from '@theme/Tabs'; |
| 129 | +import TabItem from '@theme/TabItem'; |
| 130 | +
|
| 131 | +<Tabs> |
| 132 | + <TabItem value="github" label="github" default> |
| 133 | +
|
| 134 | +```shell |
| 135 | +git clone -b v1.13.0 https://github.com/hhyo/Archery.git |
| 136 | +``` |
| 137 | +
|
| 138 | + </TabItem> |
| 139 | + <TabItem value="gitee" label="gitee"> |
| 140 | +
|
| 141 | +```shell |
| 142 | +git clone -b v1.13.0 https://gitee.com/rtttte/Archery |
| 143 | +``` |
| 144 | +
|
| 145 | + </TabItem> |
| 146 | +</Tabs> |
| 147 | +
|
| 148 | +
|
| 149 | +
|
| 150 | +### 修改文件 |
| 151 | +
|
| 152 | +修改 `docker-compose.yml` 文件,在 `archery` 容器 `volumes` 下挂载 `.env` 文件 |
| 153 | +
|
| 154 | +```yaml |
| 155 | +volumes: |
| 156 | +...... |
| 157 | + - "./.env:/opt/archery/.env" |
| 158 | +``` |
| 159 | +
|
| 160 | +
|
| 161 | +
|
| 162 | +修改 `.env` 文件,新增 `SECRET_KEY` |
| 163 | +
|
| 164 | +```shell |
| 165 | +SECRET_KEY="4GjsJiFenGBICVd0HDhcCoLRusXmJCNr" |
| 166 | +``` |
| 167 | +
|
| 168 | +
|
| 169 | +
|
| 170 | +
|
| 171 | +
|
| 172 | +### 启动容器 |
| 173 | +
|
| 174 | +```shell |
| 175 | +cd Archery/src/docker-compose |
| 176 | +docker compose up -d |
| 177 | +``` |
| 178 | +
|
| 179 | +
|
| 180 | +
|
| 181 | +### 查看启动 |
| 182 | +
|
| 183 | +```shell |
| 184 | +$ docker compose ps |
| 185 | +NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS |
| 186 | +archery hhyo/archery:v1.13.0 "bash /opt/archery/s…" archery 8 minutes ago Up 8 minutes 0.0.0.0:9123->9123/tcp, :::9123->9123/tcp |
| 187 | +goinception hanchuanchuan/goinception "/usr/local/bin/dumb…" goinception 9 minutes ago Up 9 minutes 0.0.0.0:4000->4000/tcp, :::4000->4000/tcp |
| 188 | +mysql mysql:5.7 "docker-entrypoint.s…" mysql 9 minutes ago Up 9 minutes (healthy) 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp |
| 189 | +redis redis:5 "docker-entrypoint.s…" redis 9 minutes ago Up 9 minutes (healthy) 6379/tcp |
| 190 | +``` |
| 191 | +
|
| 192 | +
|
| 193 | +
|
| 194 | +### 表结构初始化 |
| 195 | +
|
| 196 | +```shell |
| 197 | +docker exec -ti archery /bin/bash |
| 198 | +cd /opt/archery |
| 199 | +source /opt/venv4archery/bin/activate |
| 200 | +python3 manage.py makemigrations sql |
| 201 | +python3 manage.py migrate |
| 202 | +``` |
| 203 | +
|
| 204 | +
|
| 205 | +
|
| 206 | +### 数据初始化 |
| 207 | +
|
| 208 | +```shell |
| 209 | +python3 manage.py dbshell<sql/fixtures/auth_group.sql |
| 210 | +python3 manage.py dbshell<src/init_sql/mysql_slow_query_review.sql |
| 211 | +``` |
| 212 | +
|
| 213 | +
|
| 214 | +
|
| 215 | +### 创建管理用户 |
| 216 | +
|
| 217 | +```shell |
| 218 | +$ python3 manage.py createsuperuser |
| 219 | +用户名: admin |
| 220 | +电子邮件地址: xxx@xxx.com |
| 221 | +Password: |
| 222 | +Password (again): |
| 223 | +Superuser created successfully. |
| 224 | +``` |
| 225 | +
|
| 226 | +
|
| 227 | +
|
| 228 | +
|
| 229 | +
|
| 230 | +## django配置 `settings.py` |
| 231 | +
|
| 232 | +编辑 `archery/settings.py` 增加如下安全配置项 |
| 233 | +
|
| 234 | +:::caution 注意 |
| 235 | +
|
| 236 | +如果访问的域名前边是云厂商的lb,则必须注释如下配置,否则访问会变成 `域名:9123` |
| 237 | +
|
| 238 | +```python |
| 239 | +SESSION_COOKIE_SECURE = True |
| 240 | +``` |
| 241 | +
|
| 242 | +::: |
| 243 | +
|
| 244 | +```python |
| 245 | +SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https") |
| 246 | +#SECURE_SSL_REDIRECT = True # 将所有非SSL请求永久重定向到SSL |
| 247 | +SESSION_COOKIE_SECURE = True # 仅通过https传输cookie |
| 248 | +CSRF_COOKIE_SECURE = True # 仅通过https传输cookie |
| 249 | +SECURE_HSTS_INCLUDE_SUBDOMAINS = True # 严格要求使用https协议传输 |
| 250 | +SECURE_HSTS_PRELOAD = True |
| 251 | +SECURE_HSTS_SECONDS = 60 |
| 252 | +SECURE_CONTENT_TYPE_NOSNIFF = True # 防止浏览器猜测资产的内容类型 |
| 253 | +CSRF_TRUSTED_ORIGINS = ['192.168.1.3'] # 这里填写访问 archery的 ip或域名 |
| 254 | +CORS_ORIGIN_WHITELIST = ( |
| 255 | +'192.168.1.3', |
| 256 | +) |
| 257 | +``` |
| 258 | +
|
| 259 | +
|
| 260 | +
|
| 261 | +在不配置 `settings.py` 相关安全配置的情况下,登陆显示如下 |
| 262 | +
|
| 263 | + |
| 264 | +
|
| 265 | +
|
| 266 | +
|
| 267 | +并且 `archery` 容器会有如下报错 |
| 268 | +
|
| 269 | +```shell |
| 270 | +2026-01-13 14:50:06,022 - django.security.csrf - WARNING - Forbidden (Origin checking failed - https://archery.xxx.com does not match any trusted origins.): /authenticate/ |
| 271 | +``` |
| 272 | +
|
| 273 | +
|
| 274 | +
|
| 275 | +## 启动后配置 |
| 276 | +
|
| 277 | +在启动后 Archery 有一些配置(如Inception , 资源组, 权限组等)需要按需配置, 请详细阅读 [配置项说明](https://archerydms.com/configuration/) , 按照自己的需要进行配置 |
| 278 | +
|
| 279 | +
|
| 280 | +
|
| 281 | +## 登陆 |
| 282 | +
|
| 283 | + |
| 284 | +
|
| 285 | +
|
| 286 | +
|
| 287 | +登陆后首页面 |
| 288 | +
|
| 289 | + |
| 290 | +
|
0 commit comments