Перайсці да змесціва

Усталяванне Quire з Docker Compose

Усталюйце Quire на ўласнай інфраструктуры з дапамогай Docker Compose.

Праглядзець як Markdown

Гэта поўны прадукт на адным хосце: 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 init

docker/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://.

Стэк запускаецца ў фіксаваным парадку, кожны этап чакае завяршэння папярэдняга:

  1. postgres пераходзіць у стан гатоўнасці. Пры першым запуску яго скрыпт ініцыялізацыі (docker/postgres/init/90-passwords.sh) задае паролі чатырох роляў.
  2. migrate запускае ўсе міграцыі і ініцыялізуе чаргу задач у кантрольнай базе даных і ў кожнай асобнай базе арганізацыі, правярае, што ўсе яны супадаюць, а затым завяршаецца (гл. docs/ops/upgrade.md). Міграцыі запускаюцца пры кожным старце і ідэмпатэнтныя, таму абнаўленне — гэта новы вобраз і перазапуск.
  3. init (apps/web/src/first-run.ts) рэгіструе базу даных прыкладання ў QUIRE_DATABASE_ID і, калі зададзена QUIRE_SETUP_ADMIN_EMAIL, стварае першую арганізацыю і яе адміністратара. Адрас для ўваходу і згенераваны пароль выводзяцца адзін раз у docker compose logs init.
  4. Запускаюцца web, content, worker, scheduler, collab і centrifugo.
  5. 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 спампоўвае подпісы, гэта займае некалькі хвілін.
Навігацыя

Увядзіце запыт…

↑↓ навігацыя↵ выбрацьEsc закрыць