> ## Documentation Index
> Fetch the complete documentation index at: https://ayakaleaf-pro.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# 샌드박스 컴파일 설정

개발 환경에서 샌드박스 컴파일을 설정하려는 경우 개발 환경과 프로덕션 환경 사이에 약간의 차이가 있습니다. 주의해야 할 점은 다음 세 가지입니다.

* 파일 권한 문제
* history-v1과 filestore 간 볼륨 공유
* 하위 디렉터리 문제

### 샌드박스 컴파일 활성화

여기서는 Overleaf CE에서와 마찬가지로 샌드박스 컴파일을 활성화하기만 하면 됩니다. 다만 사용자에만 주의하면 됩니다. 여기서는 root로 설정합니다.

프로덕션 환경에서는 Overleaf 컨테이너와 TeX 컴파일 컨테이너 간의 공유 사용자로 www-data를 사용합니다. 하지만 개발 환경에서는 컨테이너의 기본 사용자가 node이며, 이를 연결할 www-data 사용자가 없습니다. 그래서 임시 방편으로 root를 사용합니다.

<Warning>
  직접 빌드한 이미지는 사용하지 마세요. 여러 가지 오류가 발생할 수 있습니다.
</Warning>

```dotenv wrap theme={null}
#################
#   Sandbox     #
#################
SANDBOXED_COMPILES=true
TEXLIVE_IMAGE_USER=root
ALL_TEX_LIVE_DOCKER_IMAGES=ghcr.io/ayaka-notes/texlive-full:2025.1, ghcr.io/ayaka-notes/texlive-full:2024.1
ALL_TEX_LIVE_DOCKER_IMAGE_NAMES=Texlive 2025, Texlive 2024
TEX_LIVE_DOCKER_IMAGE=ghcr.io/ayaka-notes/texlive-full:2025.1
```

### 파일 권한 수정

LaTeX는 `TEXLIVE_IMAGE_USER` 환경 변수에 지정된 사용자로 형제 컨테이너에서 실행됩니다. 위 예시에서는 이 값이 uid `0`인 `root`로 설정되어 있습니다. root 사용자에게 `compiles`의 하위 폴더에 쓸 권한이 없으므로 위 권한 설정에서는 문제가 발생합니다.

빠른 해결책은 `compiles`에 `root` 그룹 소유권과 읽기/쓰기 권한을 부여하고, 새 하위 폴더도 이 소유권을 상속하도록 `setgid`를 설정하는 것입니다.

```bash title="bash" theme={null}
sudo chown -R 1000:root compiles
sudo chmod -R g+w compiles
sudo chmod g+s compiles
```

자세한 문서는 `services/clsi/README.md`를 참고하세요.

### history-v1과 filestore 간 볼륨 공유

기본적으로 filestore는 Overleaf에서 S3와 다른 서비스 사이의 다리 역할을 합니다. 하지만 Overleaf CE나 Server Pro에서는 기본적으로 모든 파일이 로컬에 저장됩니다. 그래서 Overleaf는 매우 까다로운 방법을 도입했습니다.

```javascript title="server-ce/config/settings.js" wrap theme={null}
switch (process.env.OVERLEAF_FILESTORE_BACKEND) {
  case 's3':
    // s3 case...
  default:
    settings.filestore = {
      backend: 'fs',
      stores: {
        template_files: Path.join(DATA_DIR, 'template_files'),

        // NOTE: The below paths are hard-coded in server-ce/config/production.json, so hard code them here as well.
        // We can use DATA_DIR after switching history-v1 from 'config' to '@overleaf/settings'.
        project_blobs:
          process.env.OVERLEAF_HISTORY_PROJECT_BLOBS_BUCKET ||
          '/var/lib/overleaf/data/history/overleaf-project-blobs',
        global_blobs:
          process.env.OVERLEAF_HISTORY_BLOBS_BUCKET ||
          '/var/lib/overleaf/data/history/overleaf-global-blobs',
      },
    }
}
```

동시에 `data/history`는 history 서비스에서도 사용됩니다. 이렇게 해서 서로 다른 마이크로서비스 간에 동일한 데이터를 공유할 수 있습니다. 개발 환경의 filestore 서비스에 `history-v1-buckets` 볼륨을 추가해야 합니다. 그렇지 않으면 **clsi가 filestore 서비스에서 blob 파일을 가져올 수 없습니다**.

```yml title="develop/docker-compose.yml" wrap theme={null}
  filestore:
    build:
      context: ..
      dockerfile: services/filestore/Dockerfile
    env_file:
      - dev.env
#    environment:
#      - ENABLE_CONVERSIONS=true
    volumes:
      - filestore-public-files:/overleaf/services/filestore/public_files
      - filestore-template-files:/overleaf/services/filestore/template_files
      - filestore-uploads:/overleaf/services/filestore/uploads
      - history-v1-buckets:/buckets
```

또한 `dev.env` 설정에 BUCKET 이름을 추가해야 합니다.

```dotenv title="develop/dev.env" theme={null}
OVERLEAF_EDITOR_PROJECT_BLOBS_BUCKET='/buckets/project_blobs'
OVERLEAF_EDITOR_BLOBS_BUCKET='/buckets/blobs'
```

### 하위 디렉터리 사용

filestore는 기본적으로 useSubdirectories를 true로 사용하지만, 개발 환경에서는 history v1이 <strong>모든 데이터를 평탄화합니다.</strong> 이로 인해 충돌이 발생합니다. 이를 해결하려면 다음을 추가해야 합니다.&#x20;

```dotenv title="develop/dev.env" theme={null}
OVERLEAF_EDITOR_PROJECT_BLOBS_BUCKET='/buckets/project_blobs'
OVERLEAF_EDITOR_BLOBS_BUCKET='/buckets/blobs'
NODE_CONFIG='{"persistor":{"useSubdirectories":true}}'
```

history v1에서 모든 `project_blobs` 파일은 원래 다음과 같이 저장됩니다.

```bash wrap theme={null}
node@43eb5dac5b1b:/buckets/project_blobs$ ls
169_609_71360f687c431b9796_5b_889ef3cf71c83a4c027c4e4dc3d1a106b27809  
94e_655_88cb5cc77ab70c9796_a0_e21c740cf81e868f158e30e88985b5ea1d6c19
169_609_71360f687c431b9796_a0_e21c740cf81e868f158e30e88985b5ea1d6c19
94e_655_88cb5cc77ab70c9796_fd_3c0326302e49486d3ea86c833edf9b88320c41
169_609_71360f687c431b9796_fd_3c0326302e49486d3ea86c833edf9b88320c41 

```

useSubdirectories를 `true`로 설정하여 하위 디렉터리 모드를 사용하도록 변경해야 합니다. 이제 blob의 원래 `_`는 `/`로 대체됩니다.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.