Установка сервиса
Реализация OSA Proxy
Эта страница относится к текущей реализации OSA Proxy. Архивная Java/Spring-реализация доступна в разделе Архивная Java/Spring-реализация.
OSA Proxy использует конфигурационный файл osa-proxy.yml. По умолчанию сервис ищет его в рабочей директории, но путь можно передать первым аргументом запуска или через переменную окружения OSA_PROXY_CONFIG_PATH.
Совместимость с legacy Judge
Перед запуском текущего OSA Proxy с CodeScoring версии ниже 2026.20.0 укажите codescoring.legacy-judge: true в osa-proxy.yml. В версиях до 2026.20.0 используется legacy API Judge, а OSA Proxy по умолчанию работает с текущим API Judge.
Docker
Пример запуска контейнера с внешним конфигурационным файлом:
docker run -d \
--name osa-proxy \
-p 8080:8080 \
-e OSA_PROXY_CONFIG_PATH=/etc/osa-proxy/osa-proxy.yml \
-v /path/to/osa-proxy.yml:/etc/osa-proxy/osa-proxy.yml:ro \
<registry-url>/osa-proxy:<tag>
Проверка доступности:
curl http://localhost:8080/healthz
Docker Compose
services:
osa-proxy:
image: <registry-url>/osa-proxy:<tag>
container_name: osa-proxy
ports:
- "8080:8080"
env_file:
- .env
environment:
OSA_PROXY_CONFIG_PATH: /etc/osa-proxy/osa-proxy.yml
volumes:
- ./osa-proxy.yml:/etc/osa-proxy/osa-proxy.yml:ro
healthcheck:
test: ["CMD", "/app/osa-proxy", "healthcheck"]
interval: 30s
timeout: 3s
retries: 3
start_period: 5s
Если включен Redis-кэш вердиктов, добавьте Redis в Compose-файл и укажите его адрес в cache.redis.address.
.env файл
При запуске через Docker Compose файл .env передается в контейнер только если он указан в env_file. Эти переменные можно использовать:
- напрямую как переменные окружения процесса;
- в
osa-proxy.yml через плейсхолдеры вида ${VAR_NAME:default_value}.
В примере Compose путь к конфигурации задается отдельно через environment.OSA_PROXY_CONFIG_PATH, поэтому не дублируйте его в .env.
Пример .env:
CODESCORING_URL=https://codescoring.example.com
CODESCORING_TOKEN=
WORK_MODE=strict_wait
OSA_PROXY_URL=https://osa-proxy.example.com
OSA_PROXY_URL_FROM_FORWARDED_HEADERS=false
CODESCORING_BLOCK_MESSAGE=
CODESCORING_APPEND_BLOCK_URL_TO_MESSAGE=true
LEGACY_JUDGE=false
LOG_LEVEL=info
CACHE_ENABLED=false
REDIS_ADDRESS=redis:6379
REDIS_USERNAME=
REDIS_PASSWORD=
REDIS_DB=0
REDIS_SENTINEL_ENABLED=false
REDIS_SENTINEL_MASTER_NAME=
REDIS_SENTINEL_USERNAME=
REDIS_SENTINEL_PASSWORD=
Пример использования переменных в osa-proxy.yml:
codescoring:
url: ${CODESCORING_URL:https://codescoring.example.com}
token: ${CODESCORING_TOKEN:}
work-mode: ${WORK_MODE:strict_wait}
osa-proxy-url: ${OSA_PROXY_URL:http://localhost:8080}
osa-proxy-url-from-forwarded-headers: ${OSA_PROXY_URL_FROM_FORWARDED_HEADERS:false}
block-message: ${CODESCORING_BLOCK_MESSAGE:}
append-block-url-to-message: ${CODESCORING_APPEND_BLOCK_URL_TO_MESSAGE:true}
legacy-judge: ${LEGACY_JUDGE:false}
cache:
judge:
enabled: ${CACHE_ENABLED:false}
redis:
address: ${REDIS_ADDRESS:redis:6379}
username: ${REDIS_USERNAME:}
password: ${REDIS_PASSWORD:}
db: ${REDIS_DB:0}
sentinel:
enabled: ${REDIS_SENTINEL_ENABLED:false}
master-name: ${REDIS_SENTINEL_MASTER_NAME:}
addresses:
- sentinel-1.example.com:26379
- sentinel-2.example.com:26379
username: ${REDIS_SENTINEL_USERNAME:}
password: ${REDIS_SENTINEL_PASSWORD:}
logging:
level: ${LOG_LEVEL:info}
cache.redis.sentinel.addresses — обычный YAML-список. Укажите в нем любое необходимое количество Sentinel endpoints. Если адреса должны задаваться через окружение, для каждого элемента списка можно использовать собственный плейсхолдер ${VAR_NAME}.
Для секретов используйте .env, а не literal-значения в osa-proxy.yml.
Прокси для исходящих HTTP-запросов
OSA Proxy использует стандартные HTTP-клиенты Go. Они автоматически учитывают переменные окружения HTTP_PROXY, HTTPS_PROXY и NO_PROXY; также можно задавать lowercase-варианты http_proxy, https_proxy, no_proxy.
Пример .env для корпоративного proxy:
HTTP_PROXY=http://proxy.company.example:3128
HTTPS_PROXY=http://proxy.company.example:3128
NO_PROXY=localhost,127.0.0.1,::1,redis,codescoring.example.com,.svc,.cluster.local
NO_PROXY должен включать адреса, к которым сервис должен ходить напрямую: локальные адреса, Redis, внутренние Kubernetes/Docker DNS-имена, внутренние домены CodeScoring или package registry, если они не должны проходить через корпоративный proxy.
Дополнительные CA-сертификаты
Если OSA Proxy должен подключаться к ресурсам с самоподписанными или корпоративными root CA, примонтируйте дополнительные CA-сертификаты в контейнер и укажите их директорию в SSL_CERT_DIR.
Значение SSL_CERT_DIR должно включать как системные CA внутри контейнера, так и директорию с дополнительными сертификатами:
SSL_CERT_DIR=/etc/ssl/certs:/etc/osa-proxy/certs
Где:
/etc/ssl/certs — системные CA внутри контейнера;
/etc/osa-proxy/certs — директория с дополнительными самоподписанными или корпоративными root CA в PEM/CRT формате.
Пример для Docker Compose:
services:
osa-proxy:
image: <registry-url>/osa-proxy:<tag>
environment:
OSA_PROXY_CONFIG_PATH: /etc/osa-proxy/osa-proxy.yml
SSL_CERT_DIR: /etc/ssl/certs:/etc/osa-proxy/certs
volumes:
- ./osa-proxy.yml:/etc/osa-proxy/osa-proxy.yml:ro
- ./certs:/etc/osa-proxy/certs:ro
Helm
Минимальный пример values.yaml:
image:
repository: <registry-url>/osa-proxy
tag: "<tag>"
service:
type: ClusterIP
port: 8080
probes:
enabled: true
path: /healthz
ingress:
enabled: true
className: nginx
hosts:
- host: osa-proxy.example.com
paths:
- path: /
pathType: Prefix
config:
create: true
key: osa-proxy.yml
mountPath: /etc/osa-proxy/osa-proxy.yml
content: |
codescoring:
url: https://codescoring.example.com
token: "<token>"
work-mode: strict_wait
osa-proxy-url: https://osa-proxy.example.com
block-on-codescoring-errors: true
block-status-code: 403
npm:
enabled: true
repository:
- name: npm
registry: https://registry.npmjs.org
scan-manifest: true
remove-blocked-versions: true
scan-package: true
work-mode: strict_wait
logging:
level: info
После установки проверьте endpoints:
curl https://osa-proxy.example.com/healthz
curl https://osa-proxy.example.com/metrics