1"use strict";(self.webpackChunkvircadia_public_website=self.webpackChunkvircadia_public_website||[]).push([[830],{2423:(_,E,R)=>{R.r(E),R.d(E,{assets:()=>s,contentTitle:()=>i,default:()=>C,frontMatter:()=>t,metadata:()=>e,toc:()=>V});const e=JSON.parse('{"id":"server/service/README","title":"Services","description":"All Vircadia\'s services run in a secure Docker container environment.","source":"@site/docs/vircadia-world/server/service/README.mdx","sourceDirName":"server/service","slug":"/server/service/","permalink":"/vircadia-world/server/service/","draft":false,"unlisted":false,"editUrl":"https://github.com/Vircadia/vircadia-world/edit/master/server/service/README.mdx","tags":[],"version":"current","frontMatter":{},"sidebar":"tutorialSidebar","previous":{"title":"Server","permalink":"/vircadia-world/server/"},"next":{"title":"World API Manager","permalink":"/vircadia-world/server/service/api/"}}');var S=R(4848),n=R(8453),r=R(8069);const A='name: ${VRCA_SERVER_CONTAINER_NAME}\n\nnetworks:\n vircadia_internal_network:\n driver: bridge\n internal: true # Make this network internal to prevent direct internet access\n\n # Create a separate network for services that need external access\n vircadia_public_network:\n driver: bridge\n\nvolumes:\n postgres_data:\n name: "${VRCA_SERVER_CONTAINER_NAME}_postgres_data"\n\nservices:\n # Postgres service\n vircadia_world_postgres:\n image: postgres:17.5-alpine3.21\n container_name: ${VRCA_SERVER_SERVICE_POSTGRES_CONTAINER_NAME}\n user: "70:70" # Alpine postgres user (UID:GID)\n restart: always\n environment:\n POSTGRES_DB: ${VRCA_SERVER_SERVICE_POSTGRES_DATABASE}\n POSTGRES_USER: ${VRCA_SERVER_SERVICE_POSTGRES_SUPER_USER_USERNAME} # This user gets superuser privileges by default\n POSTGRES_PASSWORD: ${VRCA_SERVER_SERVICE_POSTGRES_SUPER_USER_PASSWORD}\n command: [\n "postgres", \n "-c", "wal_level=logical",\n "-c", "max_wal_size=4GB", # Increase from default 1GB to 4GB\n "-c", "checkpoint_timeout=5min", # Default is 5min, but good to explicitly set\n "-c", "checkpoint_completion_target=0.9" # Spread checkpoint I/O over more time\n ]\n ports:\n - "${VRCA_SERVER_SERVICE_POSTGRES_HOST_CONTAINER_BIND_EXTERNAL}:${VRCA_SERVER_SERVICE_POSTGRES_PORT_CONTAINER_BIND_EXTERNAL}:5432"\n read_only: true\n tmpfs:\n - /tmp\n - /var/run/postgresql:uid=70,gid=70,exec\n volumes:\n - postgres_data:/var/lib/postgresql/data\n healthcheck:\n test: [\n "CMD-SHELL", \n "pg_isready -U ${VRCA_SERVER_SERVICE_POSTGRES_SUPER_USER_USERNAME} -d ${VRCA_SERVER_SERVICE_POSTGRES_DATABASE} && psql -U ${VRCA_SERVER_SERVICE_POSTGRES_SUPER_USER_USERNAME} -d ${VRCA_SERVER_SERVICE_POSTGRES_DATABASE} -c \\"SELECT COUNT(*) FROM config.seeds\\" | grep -q \'[1-9]\'"\n ]\n interval: 5s\n timeout: 5s\n retries: 5\n networks:\n - vircadia_internal_network\n - vircadia_public_network\n\n # PGWEB service\n vircadia_world_pgweb:\n image: sosedoff/pgweb:0.16.2\n container_name: ${VRCA_SERVER_SERVICE_PGWEB_CONTAINER_NAME}\n user: "1000:1000" # Run as non-root user (typical first user UID/GID)\n restart: always\n ports:\n - "${VRCA_SERVER_SERVICE_PGWEB_HOST_CONTAINER_BIND_EXTERNAL}:${VRCA_SERVER_SERVICE_PGWEB_PORT_CONTAINER_BIND_EXTERNAL}:8081"\n environment:\n - PGWEB_DATABASE_URL=postgres://${VRCA_SERVER_SERVICE_POSTGRES_SUPER_USER_USERNAME}:${VRCA_SERVER_SERVICE_POSTGRES_SUPER_USER_PASSWORD}@${VRCA_SERVER_SERVICE_POSTGRES_CONTAINER_NAME}:${VRCA_SERVER_SERVICE_POSTGRES_PORT_CONTAINER_BIND_EXTERNAL}/${VRCA_SERVER_SERVICE_POSTGRES_DATABASE}?sslmode=disable\n depends_on:\n vircadia_world_postgres:\n condition: service_healthy\n restart: true\n healthcheck:\n test: ["CMD-SHELL", "curl -f http://localhost:8081"]\n interval: 5s\n timeout: 5s\n retries: 3\n start_period: 5s\n read_only: true\n tmpfs:\n - /tmp\n - /var/run\n - /var/cache\n - /var/log\n - /home/pgweb/.pgweb/bookmarks\n - /home/pgweb/.pgweb/sessions\n - /home/pgweb/.pgweb/queries\n networks:\n - virc
1adia_internal_network\n - vircadia_public_network\n\n # API service\n vircadia_world_api_manager:\n image: oven/bun:1.2.17-alpine\n container_name: ${VRCA_SERVER_SERVICE_WORLD_API_MANAGER_CONTAINER_NAME}\n user: "1000:1000" # Run as non-root user\n restart: always\n read_only: true\n ports:\n - "${VRCA_SERVER_SERVICE_WORLD_API_MANAGER_HOST_CONTAINER_BIND_EXTERNAL}:${VRCA_SERVER_SERVICE_WORLD_API_MANAGER_PORT_CONTAINER_BIND_EXTERNAL}:${VRCA_SERVER_SERVICE_WORLD_API_MANAGER_PORT_CONTAINER_BIND_INTERNAL}"\n volumes:\n - ./api/volume/app:/app\n working_dir: /app\n command: ["bun", "run", "dist/world.api.manager.js"]\n environment:\n VRCA_SERVER_DEBUG: ${VRCA_SERVER_DEBUG}\n VRCA_SERVER_SUPPRESS: ${VRCA_SERVER_SUPPRESS}\n\n VRCA_SERVER_SERVICE_POSTGRES_SUPER_USER_USERNAME: ${VRCA_SERVER_SERVICE_POSTGRES_SUPER_USER_USERNAME}\n VRCA_SERVER_SERVICE_POSTGRES_AGENT_PROXY_USER_USERNAME: ${VRCA_SERVER_SERVICE_POSTGRES_AGENT_PROXY_USER_USERNAME}\n VRCA_SERVER_SERVICE_POSTGRES_HOST_CONTAINER_BIND_EXTERNAL: ${VRCA_SERVER_SERVICE_POSTGRES_HOST_CONTAINER_BIND_EXTERNAL}\n VRCA_SERVER_SERVICE_POSTGRES_PORT_CONTAINER_BIND_EXTERNAL: ${VRCA_SERVER_SERVICE_POSTGRES_PORT_CONTAINER_BIND_EXTERNAL}\n VRCA_SERVER_SERVICE_POSTGRES_DATABASE: ${VRCA_SERVER_SERVICE_POSTGRES_DATABASE}\n VRCA_SERVER_SERVICE_POSTGRES_SUPER_USER_PASSWORD: ${VRCA_SERVER_SERVICE_POSTGRES_SUPER_USER_PASSWORD}\n VRCA_SERVER_SERVICE_POSTGRES_AGENT_PROXY_USER_PASSWORD: ${VRCA_SERVER_SERVICE_POSTGRES_AGENT_PROXY_USER_PASSWORD}\n\n VRCA_SERVER_SERVICE_WORLD_API_MANAGER_HOST_CONTAINER_BIND_INTERNAL: ${VRCA_SERVER_SERVICE_WORLD_API_MANAGER_HOST_CONTAINER_BIND_INTERNAL}\n VRCA_SERVER_SERVICE_WORLD_API_MANAGER_PORT_CONTAINER_BIND_INTERNAL: ${VRCA_SERVER_SERVICE_WORLD_API_MANAGER_PORT_CONTAINER_BIND_INTERNAL}\n VRCA_SERVER_SERVICE_WORLD_API_MANAGER_HOST_PUBLIC_AVAILABLE_AT: ${VRCA_SERVER_SERVICE_WORLD_API_MANAGER_HOST_PUBLIC_AVAILABLE_AT}\n VRCA_SERVER_SERVICE_WORLD_API_MANAGER_PORT_PUBLIC_AVAILABLE_AT: ${VRCA_SERVER_SERVICE_WORLD_API_MANAGER_PORT_PUBLIC_AVAILABLE_AT}\n depends_on:\n vircadia_world_postgres:\n condition: service_healthy\n restart: true\n healthcheck:\n test: ["CMD-SHELL", "wget --spider http://127.0.0.1:${VRCA_SERVER_SERVICE_WORLD_API_MANAGER_PORT_CONTAINER_BIND_INTERNAL}/stats"]\n interval: 10s\n timeout: 10s\n retries: 3\n start_period: 5s\n networks:\n - vircadia_internal_network\n - vircadia_public_network\n\n # State service\n vircadia_world_state_manager:\n image: oven/bun:1.2.17-alpine\n container_name: ${VRCA_SERVER_SERVICE_WORLD_STATE_MANAGER_CONTAINER_NAME}\n user: "1000:1000" # Run as non-root user\n restart: always\n read_only: true\n ports:\n - "${VRCA_SERVER_SERVICE_WORLD_STATE_MANAGER_HOST_CONTAINER_BIND_EXTERNAL}:${VRCA_SERVER_SERVICE_WORLD_STATE_MANAGER_PORT_CONTAINER_BIND_EXTERNAL}:${VRCA_SERVER_SERVICE_WORLD_STATE_MANAGER_PORT_CONTAINER_BIND_INTERNAL}"\n volumes:\n - ./state/volume/app:/app\n working_dir: /app\n command: ["bun", "run", "dist/world.state.manager.js"]\n environment:\n VRCA_SERVER_DEBUG: ${VRCA_SERVER_DEBUG}\n VRCA_SERVER_SUPPRESS: ${VRCA_SERVER_SUPPRESS}\n\n VRCA_SERVER_SERVICE_POSTGRES_SUPER_USER_USERNAME: ${VRCA_SERVER_SERVICE_POSTGRES_SUPER_USER_USERNAME}\n VRCA_SERVER_SERVICE_POSTGRES_AGENT_PROXY_USER_USERNAME: ${VRCA_SERVER_SERVICE_POSTGRES_AGENT_PROXY_USER_USERNAME}\n VRCA_SERVER_SERVICE_POSTGRES_HOST_CONTAINER_BIND_EXTERNAL: ${VRCA_SERVER_SERVICE_POSTGRES_HOST_CONTAINER_BIND_EXTERNAL}\n VRCA_SERVER_SERVICE_POSTGRES_PORT_CONTAINER_BIND_EXTERNAL: ${VRCA_SERVER_SERVICE_POSTGRES_PORT_CONTAINER_BIND_EXTERNAL}\n VRCA_SERVER_SERVICE_POSTGRES_DATABASE: ${VRCA_SERVER_SERVICE_POSTGRES_DATABASE}\n VRCA_SERVER_SERVICE_POSTGRES_SUPER_USER_PASSWORD: ${VRCA_SERVER_SERVICE_POSTGRES_SUPER_USER_PASSWORD}\n VRCA_SERVER_SERVICE_POSTGRES_AGENT_PROXY_USER_PASSWORD: ${VRCA_SERVER_SERVICE_POSTGRES_AGENT_PROXY_USER_PASSWORD}\n\n VRCA_SERVER_SERVICE_WORLD_STATE_MANAGER_HOST_CONTAINER_BIND_INTERNAL: ${VRCA_SERVER_SERVICE_WORLD_STATE_MANAGER_HOST_CONTAINER_BIND_INTERNAL}\n VRCA_SERVER_SERVICE_WORLD_STATE_MANAGER_PORT_CONTAINER_BIND_INTERNAL: ${VRCA_SERVER_SERVICE_WORLD_STATE_MANAGER_PORT_CONTAINER_BIND_INTERNAL}\n depends_on:\n vircadia_world_postgres:\n condition: service_healthy\n restart: true\n healthcheck:\n test: ["CMD-SHELL", "wget --spider http://127.0.0.1:${VRCA_SERVER_SERVICE_WORLD_STATE_MANAGER_PORT_CONTAINER_BIND_INTERNAL}/stats"]\n interval: 10s\n timeout: 10s\n retries: 3\n start_period: 5s\n networks:\n - virc
1adia_internal_network\n - vircadia_public_network\n',t={},i="Services",s={},V=[{value:"Docker Compose File",id:"docker-compose-file",level:2}];function a(_){const E={code:"code",h1:"h1",h2:"h2",header:"header",p:"p",...(0,n.R)(),..._.components};return(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(E.header,{children:(0,S.jsx)(E.h1,{id:"services",children:"Services"})}),"\n",(0,S.jsx)(E.p,{children:"All Vircadia's services run in a secure Docker container environment."}),"\n",(0,S.jsxs)(E.p,{children:["For maximum production security, Vircadia uses only the default distributed image by each respective vendor, built from Alpine Linux. Each container is set to ",(0,S.jsx)(E.code,{children:"read_only"})," to prevent any modifications to the underlying image."]}),"\n",(0,S.jsx)(E.h2,{id:"docker-compose-file",children:"Docker Compose File"}),"\n",(0,S.jsx)(r.A,{language:"yaml",children:(0,S.jsxs)(E.p,{children:["$",A]})})]})}function C(_={}){const{wrapper:E}={...(0,n.R)(),..._.components};return E?(0,S.jsx)(E,{..._,children:(0,S.jsx)(a,{..._})}):a(_)}}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.