A generic guide on how to deploy Briefer on any virtual machine.
This guide will teach you how to deploy Briefer on any VM so that your whole team can access it and collaborate.We’ll start this guide by explaining Briefer’s components and how your Briefer deployment will work. Then, we’ll teach you how to deploy it. We recommend you not to skip the first part.
After deploying Briefer, you’ll access the web application in your browser and it’ll talk to the API. In turn, the API will talk to the database and the Jupyter server, which are not exposed.
The simplest way to deploy Briefer is to run it as a single container.If you do that, you’ll only need to install Docker on your server and run a single command to start Briefer.Then, you’ll have to make sure that this server is accessible to all the people who will use Briefer.Here’s a step-by-step guide to deploy Briefer as a single container:
Get a machine and SSH into it.
Install Docker on the machine.
# On an EC2 instance, for examplesudo yum update -ysudo yum install docker -ysudo systemctl start docker
Pull and run the all-in-one Docker image for Briefer.
If you want to serve Briefer over HTTP (usually because you’re using an IP
directly) you should consider setting --env ALLOW_HTTP="true" in the
above command.
Expose your server to the internet or your local network.
Make sure that you allow traffic on port 3000.
(Optional) If you want to use a domain name rather than an IP, create the necessary DNS records to access port 3000. Otherwise, skip this step.
(Optional, recommended) Set up the certificates for your Briefer deployment so that you can use HTTPS.
The way most people set up certificates is by placing a load balancer or reverse proxy in front of Briefer and then configuring it to use the certificates you created for Briefer’s domain (briefer.yourcompany.example.com).
Using an external Postgres instance to store Briefer’s data (recommended)
By default, Briefer will store its own data in a Postgres instance bundled within its container.We recommend that you replace this local Postgres instance by a managed one, like an AWS RDS or Supabase Postgres instance.To do that, you’ll need to set these environment variables when running your Briefer container.
POSTGRES_HOSTNAME: Your Postgres instance’s address.
POSTGRES_PORT: Your Postgres instance’s port.
POSTGRES_DATABASE: The name of the database to use within Postgres.
POSTGRES_USERNAME: The username Briefer should use to connect to your Postgres instance.
POSTGRES_PASSWORD: The password for the chosen Postgres user.
This way, you will have automated back-ups and — if you need to — you will be able to re-deploy Briefer in another machine and retain your data.
{"docsConfig":{"$schema":"https://mintlify.com/docs.json","theme":"mint","name":"Briefer","colors":{"primary":"#0D9373","light":"#07C983","dark":"#0D9373"},"favicon":"/favicon.svg","logo":{"light":"https://mintcdn.com/briefer/b4K8SyWze93KZnrl/logo/light.svg?fit=max\u0026auto=format\u0026n=b4K8SyWze93KZnrl\u0026q=85\u0026s=5d3cdc30d83c7ca110bf374667c21d77","dark":"https://mintcdn.com/briefer/b4K8SyWze93KZnrl/logo/dark.svg?fit=max\u0026auto=format\u0026n=b4K8SyWze93KZnrl\u0026q=85\u0026s=4323ffd4d0c272f621ea1dafe6fe29a1"},"navbar":{"links":[{"label":"Support","href":"mailto:contact@briefer.cloud"}],"primary":{"type":"button","label":"Open Briefer","href":"https://app.briefer.cloud/auth/signup"}},"footer":{"socials":{"x":"https://x.com/briefercloud","github":"https://github.com/briefercloud/briefer","linkedin":"https://linkedin.com/company/briefercloud"}},"navigation":{"global":{"anchors":[{"anchor":"GitHub","href":"https://github.com/briefercloud/briefer","icon":"github"},{"anchor":"Community","href":"https://join.slack.com/t/briefercommunity/shared_invite/zt-2surl2chh-6eNkQRbj5F0d2juiUKTBuQ","icon":"slack"},{"anchor":"Blog","href":"https://briefer.cloud/blog","icon":"newspaper"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"briefer","hasAudioNarration":false,"actualSubdomain":"briefer","customDomains":["docs.briefer.cloud"],"gitSource":{"type":"github","owner":"briefercloud","repo":"briefer","deployBranch":"main","contentDirectory":"docs","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6a21e65d8d1fcd719df03776","collectionId":"d16322b9-2e94-494f-9c3f-fdbddafeb98b","schemaVersion":"v2"},"entitlements":{},"buildId":"6ae9226ca03c4da4bef283c0:success","clientVersion":"0.0.4054","searchFilterCounts":[{"language":"default","tag":"Documentation","count":35},{"language":"default","tag":"Product docs","count":16},{"language":"default","tag":"Enterprise","count":7},{"language":"default","tag":"Deployment guides","count":4},{"language":"default","tag":"Get started","count":4},{"language":"default","tag":"Settings and management","count":4}]},"assistantConfig":{},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"deployment/vm","slug":"/deployment/vm","pageMetadata":{"title":"Virtual Machine (Generic)","description":"A generic guide on how to deploy Briefer on any virtual machine.","icon":"desktop","href":"/deployment/vm"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"A generic guide on how to deploy Briefer on any virtual machine.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,em:`em`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,OptimizedImage,Tip,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);if(!Tip)_missingMdxReference(`Tip`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`This guide will teach you how to deploy Briefer on any VM so that your whole team can access it and collaborate.`}),`\n`,_jsx(OptimizedImage,{className:`mint-block dark:mint-hidden`,src:`https://mintcdn.com/briefer/b4K8SyWze93KZnrl/images/briefer-usage-overview.png?fit=max\u0026auto=format\u0026n=b4K8SyWze93KZnrl\u0026q=85\u0026s=ccedbaad36bbad1906b68814d647dc00`,\"data-og-width\":`1907`,width:`1907`,\"data-og-height\":`931`,height:`931`,\"data-path\":`images/briefer-usage-overview.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/briefer/b4K8SyWze93KZnrl/images/briefer-usage-overview.png?w=280\u0026fit=max\u0026auto=format\u0026n=b4K8SyWze93KZnrl\u0026q=85\u0026s=69b05344643eadfc3d3707164829be45 280w, https://mintcdn.com/briefer/b4K8SyWze93KZnrl/images/briefer-usage-overview.png?w=560\u0026fit=max\u0026auto=format\u0026n=b4K8SyWze93KZnrl\u0026q=85\u0026s=0870f16d31bfaa2a3d6661978a4b7e46 560w, https://mintcdn.com/briefer/b4K8SyWze93KZnrl/images/briefer-usage-overview.png?w=840\u0026fit=max\u0026auto=format\u0026n=b4K8SyWze93KZnrl\u0026q=85\u0026s=0ed55a62ea3df96cd099132063a3f905 840w, https://mintcdn.com/briefer/b4K8SyWze93KZnrl/images/briefer-usage-overview.png?w=1100\u0026fit=max\u0026auto=format\u0026n=b4K8SyWze93KZnrl\u0026q=85\u0026s=82b94575bd2023755f6e4d42582f6f42 1100w, https://mintcdn.com/briefer/b4K8SyWze93KZnrl/images/briefer-usage-overview.png?w=1650\u0026fit=max\u0026auto=format\u0026n=b4K8SyWze93KZnrl\u0026q=85\u0026s=e6f7896e5b2ecf4ce4c2b1a340c83d95 1650w, https://mintcdn.com/briefer/b4K8SyWze93KZnrl/images/briefer-usage-overview.png?w=2500\u0026fit=max\u0026auto=format\u0026n=b4K8SyWze93KZnrl\u0026q=85\u0026s=8501dd8d6a655c36cc75240f0965d117 2500w`}),`\n`,_jsx(OptimizedImage,{className:`mint-hidden dark:mint-block`,src:`https://mintcdn.com/briefer/b4K8SyWze93KZnrl/images/briefer-usage-overview-dark.png?fit=max\u0026auto=format\u0026n=b4K8SyWze93KZnrl\u0026q=85\u0026s=fc216390726fd41a6ed25abeb48c6649`,\"data-og-width\":`1907`,width:`1907`,\"data-og-height\":`931`,height:`931`,\"data-path\":`images/briefer-usage-overview-dark.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/briefer/b4K8SyWze93KZnrl/images/briefer-usage-overview-dark.png?w=280\u0026fit=max\u0026auto=format\u0026n=b4K8SyWze93KZnrl\u0026q=85\u0026s=b739be82d820fdf24a7252fc91283f41 280w, https://mintcdn.com/briefer/b4K8SyWze93KZnrl/images/briefer-usage-overview-dark.png?w=560\u0026fit=max\u0026auto=format\u0026n=b4K8SyWze93KZnrl\u0026q=85\u0026s=d6bf6d8d8bce081844431d08a4b343a4 560w, https://mintcdn.com/briefer/b4K8SyWze93KZnrl/images/briefer-usage-overview-dark.png?w=840\u0026fit=max\u0026auto=format\u0026n=b4K8SyWze93KZnrl\u0026q=85\u0026s=c608872ed05d81c9d263a4d1365bea52 840w, https://mintcdn.com/briefer/b4K8SyWze93KZnrl/images/briefer-usage-overview-dark.png?w=1100\u0026fit=max\u0026auto=format\u0026n=b4K8SyWze93KZnrl\u0026q=85\u0026s=02aa914606f7cb5c2084e1eafffa595c 1100w, https://mintcdn.com/briefer/b4K8SyWze93KZnrl/images/briefer-usage-overview-dark.png?w=1650\u0026fit=max\u0026auto=format\u0026n=b4K8SyWze93KZnrl\u0026q=85\u0026s=5d593ae6f43be4e5c15d233f903e78e5 1650w, https://mintcdn.com/briefer/b4K8SyWze93KZnrl/images/briefer-usage-overview-dark.png?w=2500\u0026fit=max\u0026auto=format\u0026n=b4K8SyWze93KZnrl\u0026q=85\u0026s=39e9566be169413e87081cd18864b595 2500w`}),`\n`,_jsxs(_components.p,{children:[`We’ll start this guide by explaining Briefer’s components and how your Briefer deployment will work. Then, we’ll teach you how to deploy it. We recommend you `,_jsx(_components.em,{children:`not`}),` to skip the first part.`]}),`\n`,_jsx(Heading,{level:`2`,id:`what-does-a-briefer-deployment-include`,children:`What does a briefer deployment include?`}),`\n`,_jsx(_components.p,{children:`Briefer deployments have the following components:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`A web application that users will access in their browsers.`}),`\n`,_jsx(_components.li,{children:`An API that the web application will talk to.`}),`\n`,_jsx(_components.li,{children:`A database to store the data that users upload.`}),`\n`,_jsx(_components.li,{children:`A Jupyter server that runs the actual code.`}),`\n`,_jsxs(_components.li,{children:[`An `,_jsx(_components.a,{href:`https://nginx.org`,children:`nginx`}),` instance which routes traffic to the web and API services.`]}),`\n`,_jsx(_components.li,{children:`An optional AI service that runs the AI features like code generation and automatic fixes.`}),`\n`]}),`\n`,_jsx(Tip,{children:_jsx(_components.p,{children:`Don’t worry, all of these components are bundled into Briefer’s container so\nyou don’t have to set them up individually unless you want to.`})}),`\n`,_jsx(Heading,{level:`2`,id:`how-will-my-briefer-deployment-work`,children:`How will my Briefer deployment work?`}),`\n`,_jsx(_components.p,{children:`After deploying Briefer, you’ll access the web application in your browser and it’ll talk to the API. In turn, the API will talk to the database and the Jupyter server, which are not exposed.`}),`\n`,_jsx(OptimizedImage,{className:`mint-block dark:mint-hidden`,src:`https://mintcdn.com/briefer/b4K8SyWze93KZnrl/images/deployment-overview.png?fit=max\u0026auto=format\u0026n=b4K8SyWze93KZnrl\u0026q=85\u0026s=e14f8c1338b4933e3b34751608cf9f90`,\"data-og-width\":`1594`,width:`1594`,\"data-og-height\":`1255`,height:`1255`,\"data-path\":`images/deployment-overview.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/briefer/b4K8SyWze93KZnrl/images/deployment-overview.png?w=280\u0026fit=max\u0026auto=format\u0026n=b4K8SyWze93KZnrl\u0026q=85\u0026s=fdad04d06e7ccbc4e0b4caee72a1f5f6 280w, https://mintcdn.com/briefer/b4K8SyWze93KZnrl/images/deployment-overview.png?w=560\u0026fit=max\u0026auto=format\u0026n=b4K8SyWze93KZnrl\u0026q=85\u0026s=a51955c46d74d84b744958d6db6e5065 560w, https://mintcdn.com/briefer/b4K8SyWze93KZnrl/images/deployment-overview.png?w=840\u0026fit=max\u0026auto=format\u0026n=b4K8SyWze93KZnrl\u0026q=85\u0026s=6d758a8b8a97ef699db4b36775f70311 840w, https://mintcdn.com/briefer/b4K8SyWze93KZnrl/images/deployment-overview.png?w=1100\u0026fit=max\u0026auto=format\u0026n=b4K8SyWze93KZnrl\u0026q=85\u0026s=6701f63506504d00eea4d65354cb3f67 1100w, https://mintcdn.com/briefer/b4K8SyWze93KZnrl/images/deployment-overview.png?w=1650\u0026fit=max\u0026auto=format\u0026n=b4K8SyWze93KZnrl\u0026q=85\u0026s=4d8e782e89c82017556fe1aa24cc5f9b 1650w, https://mintcdn.com/briefer/b4K8SyWze93KZnrl/images/deployment-overview.png?w=2500\u0026fit=max\u0026auto=format\u0026n=b4K8SyWze93KZnrl\u0026q=85\u0026s=894d9c2172dc66cdf1bdd16eed4bd7e3 2500w`}),`\n`,_jsx(OptimizedImage,{className:`mint-hidden dark:mint-block`,src:`https://mintcdn.com/briefer/b4K8SyWze93KZnrl/images/deployment-overview-dark.png?fit=max\u0026auto=format\u0026n=b4K8SyWze93KZnrl\u0026q=85\u0026s=9a2baaf7057f08a860172c8c0334660c`,\"data-og-width\":`1594`,width:`1594`,\"data-og-height\":`1255`,height:`1255`,\"data-path\":`images/deployment-overview-dark.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/briefer/b4K8SyWze93KZnrl/images/deployment-overview-dark.png?w=280\u0026fit=max\u0026auto=format\u0026n=b4K8SyWze93KZnrl\u0026q=85\u0026s=6d41fe9ad81550c2abaf5866c47df875 280w, https://mintcdn.com/briefer/b4K8SyWze93KZnrl/images/deployment-overview-dark.png?w=560\u0026fit=max\u0026auto=format\u0026n=b4K8SyWze93KZnrl\u0026q=85\u0026s=1f350a0be01c194f9d6dfa5477b46171 560w, https://mintcdn.com/briefer/b4K8SyWze93KZnrl/images/deployment-overview-dark.png?w=840\u0026fit=max\u0026auto=format\u0026n=b4K8SyWze93KZnrl\u0026q=85\u0026s=6b35a479860d25d7700f2ea26a9193a7 840w, https://mintcdn.com/briefer/b4K8SyWze93KZnrl/images/deployment-overview-dark.png?w=1100\u0026fit=max\u0026auto=format\u0026n=b4K8SyWze93KZnrl\u0026q=85\u0026s=05619b228ff83a1a8e5e361dc69b2822 1100w, https://mintcdn.com/briefer/b4K8SyWze93KZnrl/images/deployment-overview-dark.png?w=1650\u0026fit=max\u0026auto=format\u0026n=b4K8SyWze93KZnrl\u0026q=85\u0026s=e14d89b697183bb5f3c656b294c88e84 1650w, https://mintcdn.com/briefer/b4K8SyWze93KZnrl/images/deployment-overview-dark.png?w=2500\u0026fit=max\u0026auto=format\u0026n=b4K8SyWze93KZnrl\u0026q=85\u0026s=b74fdc6c678453ddaf38b6dd3ec0f8bd 2500w`}),`\n`,_jsx(Heading,{level:`2`,id:`deploying-briefer`,children:`Deploying Briefer`}),`\n`,_jsx(_components.p,{children:`The simplest way to deploy Briefer is to run it as a single container.`}),`\n`,_jsx(_components.p,{children:`If you do that, you’ll only need to install Docker on your server and run a single command to start Briefer.`}),`\n`,_jsx(_components.p,{children:`Then, you’ll have to make sure that this server is accessible to all the people who will use Briefer.`}),`\n`,_jsx(_components.p,{children:`Here’s a step-by-step guide to deploy Briefer as a single container:`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`\n`,_jsx(_components.p,{children:`Get a machine and SSH into it.`}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsx(_components.p,{children:`Install Docker on the machine.`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`4`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`4`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# On an EC2 instance, for example`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`sudo`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` yum`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` update`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -y`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`sudo`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` yum`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` install`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` docker`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -y`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`sudo`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` systemctl`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` start`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` docker`})]}),`\n`]})})}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsx(_components.p,{children:`Pull and run the all-in-one Docker image for Briefer.`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`6`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`6`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:` docker`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` run`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -d`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -p`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 3000:3000`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -v`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` briefer_psql_data:/var/lib/postgresql/data`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -v`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` briefer_jupyter_data:/home/jupyteruser`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -v`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` briefer_briefer_data:/home/briefer`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` briefercloud/briefer`})}),`\n`]})})}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`If you want to serve Briefer over HTTP (usually because you’re using an IP\ndirectly) you should consider setting `,_jsx(_components.code,{children:`--env ALLOW_HTTP=\"true\"`}),` in the\nabove command.`]})}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`Expose your server to the internet or your local network.\nMake sure that you allow traffic on port `,_jsx(_components.code,{children:`3000`}),`.`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`(Optional) If you want to use a domain name rather than an IP, create the necessary DNS records to access port `,_jsx(_components.code,{children:`3000`}),`. Otherwise, skip this step.`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`(Optional, recommended) Set up the certificates for your Briefer deployment so that you can use HTTPS.\nThe way most people set up certificates is by placing a load balancer or reverse proxy in front of Briefer and then configuring it to use the certificates you created for Briefer’s domain (`,_jsx(_components.code,{children:`briefer.yourcompany.example.com`}),`).`]}),`\n`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`using-an-external-postgres-instance-to-store-briefer’s-data-recommended`,children:`Using an external Postgres instance to store Briefer’s data (recommended)`}),`\n`,_jsx(_components.p,{children:`By default, Briefer will store its own data in a Postgres instance bundled within its container.`}),`\n`,_jsx(_components.p,{children:`We recommend that you replace this local Postgres instance by a managed one, like an AWS RDS or Supabase Postgres instance.`}),`\n`,_jsx(_components.p,{children:`To do that, you’ll need to set these environment variables when running your Briefer container.`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`POSTGRES_HOSTNAME`}),`: Your Postgres instance’s address.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`POSTGRES_PORT`}),`: Your Postgres instance’s port.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`POSTGRES_DATABASE`}),`: The name of the database to use within Postgres.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`POSTGRES_USERNAME`}),`: The username Briefer should use to connect to your Postgres instance.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`POSTGRES_PASSWORD`}),`: The password for the chosen Postgres user.`]}),`\n`]}),`\n`,_jsx(_components.p,{children:`This way, you will have automated back-ups and — if you need to — you will be able to re-deploy Briefer in another machine and retain your data.`})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Virtual Machine (Generic)","description":"A generic guide on how to deploy Briefer on any virtual machine.","icon":"desktop","href":"/deployment/vm"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"What does a briefer deployment include?","slug":"what-does-a-briefer-deployment-include","depth":2,"children":[]},{"title":"How will my Briefer deployment work?","slug":"how-will-my-briefer-deployment-work","depth":2,"children":[]},{"title":"Deploying Briefer","slug":"deploying-briefer","depth":2,"children":[]},{"title":"Using an external Postgres instance to store Briefer’s data (recommended)","slug":"using-an-external-postgres-instance-to-store-briefer’s-data-recommended","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"dynamicCss":".mint-block {\n display: block\n}\n.mint-hidden {\n display: none\n}\n.dark\\:mint-block:is(.dark *) {\n display: block\n}\n.dark\\:mint-hidden:is(.dark *) {\n display: none\n}","subdomain":"briefer","siteName":"Briefer","title":"Virtual Machine (Generic) - Briefer","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-01-07T04:03:03.402Z","originalFileLocation":"deployment/vm.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"A generic guide on how to deploy Briefer on any virtual machine.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Briefer\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/briefer/yiAgPrXQBsC1r8BA/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/briefer/yiAgPrXQBsC1r8BA/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/briefer/yiAgPrXQBsC1r8BA/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/briefer/yiAgPrXQBsC1r8BA/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/briefer/yiAgPrXQBsC1r8BA/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/briefer/yiAgPrXQBsC1r8BA/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/briefer/yiAgPrXQBsC1r8BA/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/briefer/yiAgPrXQBsC1r8BA/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/briefer/yiAgPrXQBsC1r8BA/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Virtual Machine (Generic) - Briefer\">\u003cmeta data-mint-head property=\"og:description\" content=\"A generic guide on how to deploy Briefer on any virtual machine.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Briefer\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.briefer.cloud/deployment/vm\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://briefer.mintlify.app/_mintlify/api/og/v2?division=Deployment+guides\u0026amp;title=Virtual+Machine+%28Generic%29\u0026amp;description=A+generic+guide+on+how+to+deploy+Briefer+on+any+virtual+machine.\u0026amp;theme=e8b7cf0ae4240180ad121556\u0026amp;signature=614a97011824c023022ed4f282213d54bc2109da6c811c4f3bb772b446ce2348\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Virtual Machine (Generic) - Briefer\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"A generic guide on how to deploy Briefer on any virtual machine.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://briefer.mintlify.app/_mintlify/api/og/v2?division=Deployment+guides\u0026amp;title=Virtual+Machine+%28Generic%29\u0026amp;description=A+generic+guide+on+how+to+deploy+Briefer+on+any+virtual+machine.\u0026amp;theme=e8b7cf0ae4240180ad121556\u0026amp;signature=614a97011824c023022ed4f282213d54bc2109da6c811c4f3bb772b446ce2348\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/briefer/yiAgPrXQBsC1r8BA/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Briefer\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#0D9373\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.briefer.cloud/deployment/vm\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/deployment/vm.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.briefer.cloud/#organization\",\"name\":\"Briefer\",\"url\":\"https://docs.briefer.cloud\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/briefer/b4K8SyWze93KZnrl/logo/light.svg?fit=max\u0026auto=format\u0026n=b4K8SyWze93KZnrl\u0026q=85\u0026s=5d3cdc30d83c7ca110bf374667c21d77\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.briefer.cloud#website\",\"name\":\"Briefer\",\"url\":\"https://docs.briefer.cloud\",\"publisher\":{\"@id\":\"https://docs.briefer.cloud/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.briefer.cloud/deployment/vm#webpage\",\"url\":\"https://docs.briefer.cloud/deployment/vm\",\"name\":\"Virtual Machine (Generic)\",\"description\":\"A generic guide on how to deploy Briefer on any virtual machine.\",\"dateModified\":\"2026-01-07T04:03:03.402Z\",\"isPartOf\":{\"@id\":\"https://docs.briefer.cloud#website\"},\"breadcrumb\":{\"@id\":\"https://docs.briefer.cloud/deployment/vm#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.briefer.cloud/deployment/vm#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Briefer\",\"item\":\"https://docs.briefer.cloud\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Virtual Machine (Generic)\",\"item\":\"https://docs.briefer.cloud/deployment/vm\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.briefer.cloud/deployment/vm#article\",\"headline\":\"Virtual Machine (Generic)\",\"name\":\"Virtual Machine (Generic)\",\"description\":\"A generic guide on how to deploy Briefer on any virtual machine.\",\"url\":\"https://docs.briefer.cloud/deployment/vm\",\"mainEntityOfPage\":{\"@id\":\"https://docs.briefer.cloud/deployment/vm#webpage\"},\"dateModified\":\"2026-01-07T04:03:03.402Z\",\"publisher\":{\"@id\":\"https://docs.briefer.cloud/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.briefer.cloud#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Briefer\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Briefer","nav":{"global":{"anchors":[{"anchor":"GitHub","href":"https://github.com/briefercloud/briefer","icon":"github"},{"anchor":"Community","href":"https://join.slack.com/t/briefercommunity/shared_invite/zt-2surl2chh-6eNkQRbj5F0d2juiUKTBuQ","icon":"slack"},{"anchor":"Blog","href":"https://briefer.cloud/blog","icon":"newspaper"}]},"anchors":[{"anchor":"Documentation","icon":"book-open","groups":[{"group":"Get started","pages":[{"title":"Introduction","href":"/introduction"},{"title":"Local quickstart","href":"/get-started/local"},{"title":"Cloud quickstart","href":"/get-started/cloud"},{"title":"Deploy Briefer","description":"Deploy Briefer for your whole team to use.","href":"/get-started/deploy"}]},{"group":"Deployment guides","pages":[{"title":"Virtual Machine (Generic)","icon":"desktop","href":"/deployment/vm"},{"title":"GCE Virtual Machine (GCP)","description":"A GCP-specific guide for deploying Briefer.","icon":"google","href":"/deployment/gcp"},{"title":"Kubernetes","icon":"circle-nodes","href":"/deployment/kubernetes"},{"title":"Troubleshooting","icon":"magnifying-glass","href":"/deployment/troubleshooting"}]},{"group":"Product docs","pages":[{"title":"First steps","icon":"shoe-prints","href":"/product/first-steps"},{"title":"Interface overview","icon":"map","href":"/product/interface-overview"},{"title":"Data sources","icon":"database","href":"/product/data-sources"},{"title":"Files","icon":"folder-open","href":"/product/files"},{"title":"Schema explorer","icon":"book","href":"/product/schema-explorer"},{"title":"Schedules","icon":"calendar","href":"/product/schedules"},{"title":"Inputs","icon":"pen-to-square","href":"/product/inputs"},{"title":"Snapshots","icon":"camera","href":"/product/snapshots"},{"title":"Reusable components","icon":"cubes-stacked","href":"/product/reusable-components"},{"title":"Sharing and exporting","icon":"share-nodes","href":"/product/sharing"},{"title":"Environments","icon":"microchip","href":"/product/environments"},{"title":"Environment variables","icon":"key","href":"/product/environment-variables"},{"title":"AI assistant","icon":"wand-magic-sparkles","href":"/product/ai-assistant"},{"title":"Slack integration","icon":"slack","href":"/product/slack-integration"},{"title":"Keyboard shortcuts","icon":"keyboard","href":"/product/keyboard-shortcuts"},{"title":"Private Documents","icon":"person-chalkboard","href":"/product/private-documents"}]},{"group":"Settings and management","pages":[{"title":"Installing packages","icon":"hard-drive","href":"/settings/installing-packages"},{"title":"User management","icon":"user-plus","href":"/settings/user-management"},{"title":"Workspace settings","icon":"gear","href":"/settings/workspace-settings"},{"title":"Page settings","icon":"scroll","href":"/settings/page-settings"}]},{"group":"Enterprise","pages":[{"title":"Permissions - Self-hosted","icon":"passport","href":"/enterprise/deployment-permissions"},{"title":"Configuring SSO on a self-hosted instance","icon":"lock","href":"/enterprise/sso-self-hosted"},{"title":"Integrating user identities with your data source","icon":"id-card","href":"/enterprise/datasource-identities"},{"title":"Granular permissions","icon":"users-viewfinder","href":"/enterprise/granular-permissions"},{"title":"Private AI setup","icon":"hat-wizard","href":"/enterprise/private-ai"},{"title":"Customize appearance","icon":"paintbrush","href":"/enterprise/customize-appearance"},{"title":"Configuring caches","icon":"hard-drive","href":"/enterprise/configuring-caches"}]}]}]},"basePath":"","title":"Virtual Machine (Generic) - Briefer","buildId":"dpl_345ReqzYaAjzS9QpeJemsKdb7KDj","deploymentId":"dpl_345ReqzYaAjzS9QpeJemsKdb7KDj","dynamics":["a74be98ba7"],"chunks":["zoom-image-lightbox-B4-wUcHm.js","lightbox-handle-r17bVUz3.js"]}