Гэта поўны прадукт на адным хосце: LMS, фонавыя задачы, сэрвісы рэальнага часу і сумеснага рэдагавання, а таксама ўсе дадатковыя сэрвісы, уключаныя праз профілі. Архітэктура апісана ў раздзеле 2 docs/architecture/23-ops.md.
Іншыя варыянты: Vercel і Cloudflare Workers запускаюць толькі вэб-узровень. Інструкцыі па абнаўленні ёсць у upgrade.md, а па рэзервовым капіраванні і практыкаванні аднаўлення — у backup-restore.md.
Што спатрэбіцца
- Docker Engine 27 або навейшы з убудовай Compose 2.30 або навейшай.
- 4 ядры CPU і 8 GB памяці для стандартнага стэка; 8 ядраў і 16 GB з
--profile full(ClamAV займае каля 1.5 GB толькі пад подпісы). - DNS-імя для вэб-узроўню і другое імя для недаверанага змесціва. Гэта павінны быць розныя хосты: пакеты SCORM і загружаны HTML запускаюцца з origin змесціва, таму не могуць прачытаць cookie LMS.
- Для лакальнай праверкі
lvh.meі*.localhostвырашаюцца ў 127.0.0.1; гэта выкарыстоўваеdocker/.env.example. Сэрвісproxyсамога стэка абслугоўвае абодва праз https з лакальным цэнтрам сертыфікацыі, таму нічога дадатковага ўсталёўваць не трэба (гл. «TLS»). - Вызваліце на хосце парты 80 і 443 (
QUIRE_PROXY_HTTP_PORTіQUIRE_PROXY_HTTPS_PORTдазваляюць змяніць іх).
Першы запуск
QUIRE_APP_ORIGIN=https://learn.example.org \
QUIRE_CONTENT_ORIGIN=https://content.example-content.org \
QUIRE_SETUP_ADMIN_EMAIL=you@example.org \
docker/scripts/init-env.sh
docker compose -f docker/compose.yaml up -d --build
docker compose -f docker/compose.yaml logs initdocker/scripts/init-env.sh стварае docker/.env на аснове docker/.env.example і генеруе ўсе сакрэты (паролі базы даных, ключы подпісу і галоўны ключ, пару ключоў запуску змесціва), а таксама ключ подпісу кантрольных кропак аўдыту ў docker/secrets/audit-signing-key.pem; Compose падключае яго да worker як secret. Патрэбныя толькі sh, awk і openssl; скрыпт адмаўляецца перазапісваць існы docker/.env. Скапіруйце абодва файлы з хоста: без QUIRE_MASTER_KEY адноўленая база даных не зможа расшыфраваць захаваныя ўліковыя даныя. Каб запоўніць файл уручную, выканайце cp docker/.env.example docker/.env; у файле ёсць інструкцыі па стварэнні кожнага сакрэту.
Абодва origin павінны выкарыстоўваць https: сэрвіс змесціва забараняе звычайны http у вытворчасці, і яны не павінны дзяліць рэгіструемы дамен. Сэрвіс proxy завяршае TLS для абодвух (гл. «TLS»); init-env.sh адхіляе origin з http://.
Стэк запускаецца ў фіксаваным парадку, кожны этап чакае завяршэння папярэдняга:
postgresпераходзіць у стан гатоўнасці. Пры першым запуску яго скрыпт ініцыялізацыі (docker/postgres/init/90-passwords.sh) задае паролі чатырох роляў.migrateзапускае ўсе міграцыі і ініцыялізуе чаргу задач у кантрольнай базе даных і ў кожнай асобнай базе арганізацыі, правярае, што ўсе яны супадаюць, а затым завяршаецца (гл. docs/ops/upgrade.md). Міграцыі запускаюцца пры кожным старце і ідэмпатэнтныя, таму абнаўленне — гэта новы вобраз і перазапуск.init(apps/web/src/first-run.ts) рэгіструе базу даных прыкладання ўQUIRE_DATABASE_IDі, калі зададзенаQUIRE_SETUP_ADMIN_EMAIL, стварае першую арганізацыю і яе адміністратара. Адрас для ўваходу і згенераваны пароль выводзяцца адзін раз уdocker compose logs init.- Запускаюцца
web,content,worker,scheduler,collabіcentrifugo. proxyзапускаецца, каліwebіcontentпераходзяць у стан гатоўнасці.
Адкрыйце https://demo. разам з даменам вашага прыкладання (у журнале init паказаны дакладны адрас для ўваходу) і ўвайдзіце. Пры лакальнай усталёўцы спачатку даверцеся цэнтру сертыфікацыі proxy (гл. «TLS»). Змяніце згенераваны пароль у /account/security.
Працэс, запушчаны без абавязковага сакрэту, адмаўляецца стартаваць і называе адсутны параметр у журнале. Сістэма не запускаецца ў часткова настроеным стане.
Сэрвісы і профілі
| Сэрвіс | Профіль | Функцыя |
|---|---|---|
| postgres | заўсёды | База даных (PostgreSQL 18 з pgvector, зборка з docker/postgres.Dockerfile), WAL архівуецца з першага запуску |
| migrate, init | заўсёды | Аднаразовы запуск: міграцыі, затым першы запуск |
| web | заўсёды | LMS, на QUIRE_HTTP_PORT (8080) |
| content | заўсёды | Origin недаверанага змесціва, на QUIRE_CONTENT_PORT (8081) |
| worker | заўсёды | Фонавыя задачы: пошта, справаздачы, апрацоўка файлаў, webhooks |
| scheduler | заўсёды | Паўтаральныя задачы: рэгіструе 64 расклады выканання і перадае іх worker; адначасова працуе толькі адзін лідар |
| collab | заўсёды | Websocket сумеснага рэдагавання, на QUIRE_COLLAB_HTTP_PORT (1234) |
| centrifugo | заўсёды | Рассылка падзей рэальнага часу, на QUIRE_REALTIME_PORT (8000) |
| proxy | заўсёды | Caddy, TLS-шлюз на партах 80 і 443 (гл. «TLS») |
| valkey | cache |
Кэш і абмежаванне частаты запытаў |
| clamav | scan |
Праверка загружаных файлаў на шкоднасныя праграмы |
| gotenberg | preview |
Папярэдні прагляд Office у PDF, рэндэрынг сертыфікатаў |
| imgproxy | images |
Змена памеру і пераўтварэнне выяў |
| transcoder | video |
Вобраз worker з ffmpeg толькі пад LGPL для стварэння відэаварыянтаў |
| seaweedfs | storage |
Аб’ектнае сховішча, сумяшчальнае з S3, на гэтым хосце |
| otelcol | observability |
Калектар OpenTelemetry |
| mailpit | devmail |
Прымае ўсю выходную пошту для тэставання Quire |
| backup | backup |
Аднаразовая базавая копія; гл. backup-restore.md |
| backup-scheduler, backup-offsite | backup |
Базавая копія кожныя QUIRE_BACKUP_INTERVAL_HOURS і зашыфраваныя копіі па-за хостам з штотыднёвай праверкай |
| h5p | h5p |
Вобраз інструмента H5P LTI 1.3, які вы задаяце ў QUIRE_H5P_IMAGE, на QUIRE_H5P_PORT (8090); гл. «Падключэнне правайдара H5P» |
--profile full запускае ўсе дадатковыя сэрвісы, акрамя backup і h5p. Запусціце асобны сэрвіс так: docker compose -f docker/compose.yaml --profile scan up -d. Quire працуе і без дадатковага сэрвісу, паведамляючы пра адсутную функцыю: без сканера загрузкі захоўваюцца без праверкі і пра гэта паведамляецца адміністратару; без Gotenberg файлы можна спампаваць, але няма папярэдняга прагляду; без транскадзіроўшчыка відэа прайграецца ў зыходным фармаце.
Усе староннія вобразы і іх ліцэнзійныя ўмовы пералічаны ў docker/third-party-containers.yaml.
Падключэнне правайдара H5P
Quire не ўбудоўвае і не пастаўляе асяроддзе выканання H5P або дадатковы сэрвіс (ADR 0019). Калі вы карыстаецеся H5P, падпішыцеся на ўласны размешчаны сэрвіс або асобна ад Quire запусціце ўласны асобны сэрвіс H5P. Зарэгіструйце правайдара як знешні інструмент LTI 1.3 і дадавайце яго змесціва ў курсы як інструментальныя заданні. Quire абменьваецца адзнакамі і прагрэсам заданняў праз LTI Assignment and Grade Services (AGS). Калі правайдар таксама адпраўляе заявы xAPI, асобна наладзьце гэта для сховішча заяў xAPI у Quire; абмен адзнакамі і прагрэсам праз AGS не перадае заявы xAPI. У справаздачах імпарту Moodle для заданняў H5P паказваецца, што патрэбна падключэнне інструмента LTI. За асяроддзе выканання H5P, стварэнне матэрыялаў, банк змесціва і гісторыю спроб адказвае правайдар.
Каб запусціць уласны асобны сэрвіс на гэтым хосце, задайце QUIRE_H5P_IMAGE і запусціце профіль h5p. Compose адкрывае яго на QUIRE_H5P_PORT (8090) і захоўвае даныя ў томе h5p-data; вобраз і абавязкі, звязаныя з ім, застаюцца вашай адказнасцю.
Налады
Кожны працэс чытае docker/.env. У шаблоне docker/.env.example пералічаны ўсе налады і іх значэнні па змаўчанні. Групы:
Адрасы
| Налада | Значэнне |
|---|---|
QUIRE_APP_ORIGIN |
Публічны адрас LMS, напрыклад https://learn.example.com |
QUIRE_CONTENT_ORIGIN |
Origin змесціва, на іншым хосце |
QUIRE_PLATFORM_DOMAINS |
Дамены для арганізацый, праз коску |
QUIRE_MARKETING_ORIGIN |
Optional. The marketing site, default https://quirelms.com. The only origin the waitlist form (POST /api/waitlist, POST /waitlist) accepts and redirects to. Comma separated; a www. variant is allowed only if listed |
QUIRE_DEPLOY_TARGET |
Тут — compose. Пра vercel і cloudflare чытайце ў іншых інструкцыях |
QUIRE_TRUSTED_PROXY_CIDRS |
Проксі, якім давяраюцца значэнні X-Forwarded-For |
Сакрэты
| Налада | Значэнне |
|---|---|
QUIRE_SECRET_KEY |
Падпісвае сеансы і токены. 64 шаснаццатковыя сімвалы |
QUIRE_MASTER_KEY |
Абгортвае захаваныя ўліковыя даныя, напрыклад сакрэты SSO і webhook. 32 байты ў base64. Вэб-узровень і worker павінны выкарыстоўваць аднолькавае значэнне. Ратацыя: key-rotation.md |
QUIRE_MASTER_KEY_VERSION |
Пазнака версіі галоўнага ключа; калі не зададзена, v1. Павялічвайце яе пры ратацыі |
QUIRE_MASTER_KEY_RETIRED |
Папярэднія галоўныя ключы, патрэбныя для чытання зашыфраваных імі даных, напрыклад v1=<base64>. Выдаліце пасля завяршэння ратацыі без нявырашаных праблем |
QUIRE_COLLAB_SIGNING_KEY |
Агульны для web і collab ключ подпісу токенаў рэдагавання |
QUIRE_BACKUP_SIGNING_KEY |
Падпісвае рэзервовыя копіі курсаў (неабавязкова) |
Захоўвайце копію QUIRE_MASTER_KEY асобна ад гэтага хоста. Адноўленая без яго база даных не зможа расшыфраваць захаваныя ўліковыя даныя.
База даных
| Налада | Значэнне |
|---|---|
POSTGRES_PASSWORD |
Суперкарыстальнік, якога выкарыстоўваюць кантэйнер і сістэма рэзервовага капіравання |
QUIRE_DB_APP_PASSWORD, QUIRE_DB_MIGRATOR_PASSWORD, QUIRE_DB_REPORT_PASSWORD, QUIRE_DB_AUDIT_PASSWORD |
Паролі роляў, задаюцца пры першым запуску |
DATABASE_URL |
Роля прыкладання. Для кожнага яе запыту дзейнічае бяспека на ўзроўні радкоў |
DATABASE_MIGRATOR_URL, QUIRE_MIGRATION_URL |
Роля міграцый для migrate і init |
QUIRE_SUPERUSER_URL |
Выкарыстоўваецца толькі пры першым запуску |
QUIRE_REPORT_DATABASE_URL |
Роля справаздач толькі для чытання, для справаздач і іх канструктара |
QUIRE_AUDIT_DATABASE_URL |
Роля аўдыту для кансолі аўдыту і экспарту ў SIEM |
QUIRE_DATABASE_ID |
Любы UUID, нязменны на працягу ўсяго тэрміну ўсталёўкі |
Паролі роляў прымяняюцца толькі пры першым стварэнні тома базы даных. Каб змяніць пароль пазней, выкарыстоўвайце ALTER ROLE і абнавіце адпаведны URL.
QUIRE_REPORT_DATABASE_URL выкарыстоўваецца для фізічнай базы даных, зададзенай у DATABASE_URL. Для любой іншай зарэгістраванай фізічнай базы задавайце яе ўласны URL злучэння quire_report у асяроддзі web і worker, а затым у полі Reporting environment variable гэтай базы ўкажыце назву зменнай у фармаце env:NAME. Спасылка павінна весці да той жа базы, што і злучэнне прыкладання, пажадана да яе рэплікі толькі для чытання. Кожная частка справаздач выкарыстоўвае злучэнне сваёй базы для справаздач: канструктар і захаваныя справаздачы, запланаваныя рассылкі, экспарт, аналітыка, журнал аўдыту, рэсурсы REST аўдыту і пошук аўдыту памочнікам. Ніводная з іх не выкарыстоўвае URL справаздач іншай базы. Калі злучэнне для справаздач не зададзена, звычайныя справаздачы працуюць праз уласнае злучэнне прыкладання гэтай базы, а аналітыка і чытанне аўдыту адмаўляюцца працаваць і паведамляюць пра гэта, бо роля прыкладання не можа чытаць журнал аўдыту.
Драйверы
| Налада | У гэтым выпуску | Заўвагі |
|---|---|---|
QUIRE_STORAGE_DRIVER |
local (па змаўчанні), s3 або azure |
local захоўвае файлы ў томе files. s3 падтрымлівае AWS S3, сумяшчальнасць з R2 і GCS, а таксама іншыя S3-сумяшчальныя сховішчы з магчымасцю працягваць шматчастковую загрузку |
QUIRE_REALTIME_DRIVER |
inprocess (па змаўчанні), sse, centrifugo або durable_objects |
inprocess падыходзіць для аднаго вэб-кантэйнера; пры некалькіх выкарыстоўвайце centrifugo або sse |
QUIRE_CACHE_DRIVER |
memory (па змаўчанні), postgres або valkey |
memory асобны для кожнага працэсу; выкарыстоўвайце valkey або postgres, каб ліміты частаты працавалі паміж кантэйнерамі |
QUIRE_VIDEO_DRIVER |
ffmpeg (па змаўчанні) або progressive_mp4 |
Ці размешчаны правайдар: Cloudflare Stream, Mux або Bunny з іх ключамі |
QUIRE_IMAGE_DRIVER |
noop (па змаўчанні), imgproxy або cloudflare |
noop аддае выявы ў зыходным памеры. Для imgproxy патрэбны профіль images і налады ніжэй; cloudflare выкарыстоўвае Cloudflare Images |
QUIRE_MEETING_PROVIDER |
bbb, zoom, teams, meet, jitsi або in_process |
Стандартны правайдар платформы для анлайн-сесій. Калі налада не зададзена, анлайн-сесіі паведамляюць, што не настроены, пакуль арганізацыя не падключыць уласны ўліковы запіс у Integrations, Live session provider. Уласны ўліковы запіс арганізацыі заўсёды мае прыярытэт. Налады кожнага правайдара (BBB_URL і BBB_SECRET, зменныя ZOOM_*, TEAMS_*, GOOGLE_MEET_* і JITSI_*) чытаюцца толькі для зададзенага тут правайдара |
QUIRE_MEETING_REGIONS |
Спіс праз коску: eu, uk, us |
Рэгіёны апрацоўкі сустрэч стандартным правайдарам платформы. Калі не зададзена, рэгіён не правяраецца для арганізацыі з замацаваным рэгіёнам, як і раней. Старонка ўласнага ўліковага запісу арганізацыі паказвае яго рэгіёны |
Калі ў гэтым выпуску няма зададзенага значэння драйвера, вэб-узровень адмаўляецца запускацца і называе нала́ду, замест таго каб моўчкі падмяніць яе значэннем па змаўчанні.
Выявы
Старонкі запытваюць выявы ў чатырох фіксаваных памерах праз /api/files/{id}/image/{size}. Гэты маршрут правярае тыя ж правы доступу, што і для самога файла, а потым перанакіроўвае запыт у сэрвіс выяў. Кожная арганізацыя можа запытваць да QUIRE_IMAGE_SPECS_PER_HOUR (першапачаткова 2000) новых пар выява-памер за гадзіну; памеры, створаныя ў тую ж гадзіну, не залічваюцца. Калі вэб-кантэйнераў некалькі, выкарыстоўвайце valkey або postgres для QUIRE_CACHE_DRIVER, каб абмежаванне дзейнічала на ўсіх.
| Налада | Драйвер | Заўвагі |
|---|---|---|
IMGPROXY_URL |
imgproxy |
Адрас imgproxy, даступны браўзерам, напрыклад https://images.example.org. Профіль images адкрывае яго на QUIRE_IMAGES_PORT (8082) |
IMGPROXY_KEY, IMGPROXY_SALT |
imgproxy |
Шаснаццатковыя радкі, тыя самыя значэнні, з якімі запускаецца imgproxy. Кожнае згенеруйце праз openssl rand -hex 32. Quire падпісвае імі кожны адрас выявы, таму imgproxy не апрацоўвае выявы, якіх не запытваў Quire |
QUIRE_IMAGE_SOURCE_ORIGIN |
imgproxy з лакальным сховішчам |
Адрас, адкуль imgproxy атрымлівае зыходныя выявы. Compose задае http://web:3000. Пры выкарыстанні s3 або azure imgproxy атрымлівае выявы з bucket, і гэтая налада не ўжываецца |
CLOUDFLARE_ACCOUNT_ID, CLOUDFLARE_IMAGES_TOKEN, CLOUDFLARE_IMAGES_ACCOUNT_HASH |
cloudflare |
API-токен з правам рэдагавання Images і хэш уліковага запісу з Images, Developer resources. Уключыце flexible variants для ўліковага запісу |
CLOUDFLARE_IMAGES_SIGNING_KEY |
cloudflare |
Неабавязкова. Калі зададзены, выявы прыватныя, а кожны адрас падпісваецца і мае тэрмін дзеяння. Калі не зададзены, выявы публічныя і маюць адрасы, атрыманыя з QUIRE_SECRET_KEY, якія немагчыма адгадаць |
Cloudflare Images захоўвае ўласную копію кожнай зыходнай выявы. Пры выдаленні файла worker выдаляе гэтую копію перад зыходным файлам.
Чарга
Фонавыя задачы выкарыстоўваюць pg-boss у той жа базе Postgres, таму асобны сэрвіс чаргі не патрэбны і нічога наладжваць не трэба. Задачы дадаюцца ў чаргу ў той самай транзакцыі, што і змена, якая іх выклікала, таму збой не можа прывесці да страты або паўторнай адпраўкі задачы. Тут QUIRE_QUEUE_DRIVER мае стандартнае значэнне pgboss; vercel і cloudflare пераносяць толькі лёгкія дастаўкі апавяшчэнняў і webhook у чаргу самой платформы. У інструкцыях Vercel і Cloudflare апісана, як іх вэб-узроўні дадаюць задачы ў гэтыя чэргі.
Электронная пошта
Задайце адно з наступнага:
QUIRE_EMAIL_PROVIDER_CONFIG: аб’ект JSON з HTTP-правайдарам і ўліковымі данымі, напрыклад{"provider":"postmark","token":"..."}. Падтрымліваюцца Postmark, Amazon SES, Mailgun, SendGrid і Resend.QUIRE_SMTP_URL:smtp://user:password@host:587. Толькі для гэтай мэты; serverless-платформы блакуюць SMTP.
Адпраўнік задаецца ў QUIRE_MAIL_FROM. Каб паспрабаваць Quire, запусціце профіль devmail, задайце QUIRE_SMTP_URL=smtp://mailpit:1025 і чытайце пошту на http://localhost:8025.
Неабавязковыя сэрвісы
| Налада | Профіль |
|---|---|
CLAMAV_URL=tcp://clamav:3310 |
scan |
GOTENBERG_URL=http://gotenberg:3000 |
preview |
IMGPROXY_KEY, IMGPROXY_SALT |
images |
VALKEY_URL=redis://valkey:6379 |
cache |
QUIRE_OPENSEARCH_URL або QUIRE_MEILISEARCH_URL |
Знешні пошук; у адваротным выпадку выкарыстоўваецца поўнатэкставы пошук Postgres |
QUIRE_BREACH_CHECK_PROVIDER=off, QUIRE_BREACH_CHECK_URL |
Праверка пароля на наяўнасць у базах уцечак. Па змаўчанні ўключана праз api.pwnedpasswords.com (перадаецца толькі пяцісімвальны прэфікс хэша); значэнне off выключае праверку, а URL вядзе да размешчанага вамі range API |
Назіранне
OTEL_EXPORTER_OTLP_ENDPOINT задае калектар, куды кожны працэс адпраўляе traces і метрыкі; з профілем observability гэта http://otelcol:4318. Наладзьце экспарцёр сваёй сістэмы ў docker/otel-collector.yaml. Калі параметр зададзены, вэб-узровень, worker, scheduler, content і collab адпраўляюць спаны праз OTLP/HTTP (запыты web, транзакцыі базы арганізацый, задачы worker і выходныя выклікі), а кожную хвіліну — метрыкі на той жа адрас (OTEL_METRICS_EXPORTER=none выключае іх). OTEL_TRACES_SAMPLER_ARG задае долю traces, якія захоўваюцца. Журналы выводзяцца ў стандартны вывад з узроўнем LOG_LEVEL, а Compose ратуе іх. Traces не змяшчаюць персанальных даных.
Рэгіянальны выходны трафік (рэзідэнцтва даных у ЕС)
QUIRE_REGION=eu азначае, што стэк абслугоўвае арганізацыі Еўрапейскага саюза. Worker абмяжоўвае выходныя запыты для арганізацыі, замацаванай за ЕС, спісам дазволеных вузлоў (раздзел 8.1 у 21-compliance.md). У спіс уваходзяць вузлы, абвешчаныя настроенымі сэрвісамі для гэтага рэгіёна (канчатковы адрас сховішча, правайдар пошты, размешчаны правайдар відэа, уласныя мэты сховішча арганізацыі, правайдары AI і ўліковы запіс пошты), вузлы сэрвісаў з актыўным адступленнем ад патрабаванняў, а таксама вузлы са спіса QUIRE_EGRESS_ALLOW_HOSTS. Запыт да любога іншага публічнага вузла адхіляецца да адпраўкі, адмова запісваецца ў журнал аўдыту арганізацыі як privacy/egress_refused і паказваецца ў раздзеле Compliance, Data residency.
| Налада | Значэнні | Эфект |
|---|---|---|
QUIRE_EGRESS_ALLOW_HOSTS |
Спіс імёнаў хостаў праз коску або *.example.org для ўсіх субдаменаў |
Дадатковыя вузлы, да якіх можа звяртацца арганізацыя ЕС. Тут павінны быць webhook, xAPI, SIEM, стужкі блогаў і вузлы Amazon SES, бо іх выбірае сама арганізацыя і ніводны сэрвіс не аб’яўляе іх. Loopback, прыватныя адрасы і аднакампанентныя імёны накшталт web або clamav належаць вашай сетцы і ніколі не правяраюцца |
Арганізацыі ў Вялікабрытаніі і ЗША не абмежаваныя спісам вузлоў; для іх захоўваюцца праверкі рэгіёна сэрвісаў. Задайце спіс у worker; старонка адміністратара чытае яго на вэб-узроўні, каб паказаць спіс дазволеных вузлоў, таму ўкажыце яго ў docker/.env, які чытаюць усе сэрвісы.
Праверка прыкладання выдае зразумелую памылку і запіс аўдыту, але не гарантуе абмежавання: у кодзе можа быць памылка. Гарантыю забяспечвае сетка. Compose не наладжвае яе за вас. Для рэгіянальнага стэка падключыце worker і web да сеткі internal: true, адзіны шлях з якой вонкі вядзе праз egress-проксі (напрыклад Squid або кантэйнер tinyproxy), наладжаную на тых жа вузлах, што і QUIRE_EGRESS_ALLOW_HOSTS, плюс вузлы настроеных сэрвісаў; задайце для гэтых сэрвісаў HTTPS_PROXY. Старонка рэзідэнцтва паказвае дакладныя вузлы, дазволеныя прыкладаннем, каб іх можна было параўнаць са спісам проксі.
Стан сэрвісаў
| Маршрут | Значэнне |
|---|---|
/healthz |
Праца працэсу: ён адказвае. Гэта выкарыстоўваюць праверкі стану Compose |
/readyz |
Гатоўнасць: залежнасці даступныя, кожны дадатковы сэрвіс адзначаны як настроены або не настроены. Накіруйце сюды балансавальнік нагрузкі |
docker compose -f docker/compose.yaml ps паказвае стан кожнага сэрвісу.
TLS
Сэрвіс proxy (Caddy, Apache-2.0, docker/caddy/Caddyfile) уваходзіць у стандартны стэк. Ён слухае парты 80 і 443 і накіроўвае запыты:
| Хост або шлях | Куды накіроўваецца |
|---|---|
QUIRE_PROXY_CONTENT_HOST |
content |
QUIRE_PROXY_APP_HOST, кожны субдамен арганізацыі і карыстальніцкі дамен |
web |
/_collab/ на гэтых хостах |
collab (websocket, QUIRE_COLLAB_URL) |
/_realtime/connection/ на гэтых хостах |
Websocket кліента centrifugo; яго серверны API ніколі не адкрываецца |
/_images/ на гэтых хостах |
imgproxy з профілем images (IMGPROXY_URL) |
init-env.sh выводзіць QUIRE_PROXY_APP_HOST, QUIRE_PROXY_CONTENT_HOST, QUIRE_PROXY_HTTPS_PORT, QUIRE_COLLAB_URL і IMGPROXY_URL з двух origin, каб іх значэнні не разыходзіліся. Калі змяняеце origin уручную, адрэдагуйце ўсе гэтыя параметры разам.
Сертыфікаты залежаць ад QUIRE_PROXY_TLS:
-
internal(па змаўчанні): уласны цэнтр сертыфікацыі Caddy дляlocalhost,*.localhostіlvh.me. Даверцеся яго каранёваму сертыфікату адзін раз, а затым выканайце:docker compose -f docker/compose.yaml cp \ proxy:/data/caddy/pki/authorities/local/root.crt ./quire-local-ca.crtДадайце
quire-local-ca.crtу сховішча давераных сертыфікатаў сістэмы або браўзера. Дляcurlвыкарыстоўвайце--cacert. -
Адрас электроннай пошты: аўтаматычныя сертыфікаты ACME (спачатку Let’s Encrypt, затым ZeroSSL) для сапраўдных хостаў. DNS абодвух origin і кожнага хоста арганізацыі павінен указваць сюды, а парты 80 і 443 павінны быць даступныя з інтэрнэту.
Сертыфікаты для хостаў арганізацый выдаюцца пры першым наведванні і толькі пасля таго, як web пацвердзіць, што імя належыць гэтай усталёўцы (запыт /tls-allowed у сетцы Compose). Wildcard-сертыфікат або ўбудова правайдара DNS не патрэбныя; незнаёмы чалавек, які накіруе дамен на гэты хост, не зможа прымусіць сістэму запытаць сертыфікат. Сертыфікаты і лакальны цэнтр сертыфікацыі захоўваюцца ў томе caddy-data; калі вы карыстаецеся internal, уключыце яго ў рэзервовую копію.
Web давярае X-Forwarded-For, атрыманаму толькі ад proxy: у proxy фіксаваны адрас (QUIRE_PROXY_ADDRESS, па змаўчанні 172.29.64.10) у фіксаванай падсетцы (QUIRE_COMPOSE_SUBNET), а QUIRE_TRUSTED_PROXY_CIDRS задае гэты адрас. Калі падсетка супадае з сеткай хоста, змяніце абедзве налады і выканайце docker compose down перад up.
За ўласным reverse proxy
Каб замест гэтага выкарыстоўваць ужо наладжаны балансавальнік або проксі, выключыце proxy (docker compose up -d --scale proxy=0) і завяршайце TLS перад web (8080), content (8081), collab (1234, websocket) і centrifugo (8000, websocket). Задайце публічныя адрасы ў QUIRE_APP_ORIGIN, QUIRE_CONTENT_ORIGIN і QUIRE_COLLAB_URL (wss://), а дыяпазон адрасоў вашага проксі — у QUIRE_TRUSTED_PROXY_CIDRS.
Выпраўленне праблем
initзавяршаецца з памылкай “QUIRE_DATABASE_ID is not a UUID”: задайце значэнне празuuidgen.webперазапускаецца з паведамленнем “did not start on compose”: у журнале пералічаны налады, якія немагчыма выкарыстоўваць, і прапанаваныя значэнні.- Змена пароля ролі ў
.envпасля першага запуску нічога не змяняе: скрыпт ініцыялізацыі запускаецца адзін раз. ВыкарыстоўвайцеALTER ROLE. - Загрузкі завяршаюцца памылкай сканавання пры зададзеным
CLAMAV_URL: пры першым запуску ClamAV спампоўвае подпісы, гэта займае некалькі хвілін.