Merge pull request #16923 from overleaf/jpa-server-pro-fs-rebranding

[server-pro] remove ShareLaTeX branding from filesystem

GitOrigin-RevId: c1d2c63bdc888d81e03bb1721e44b6ed6f64524b
This commit is contained in:
Jakob Ackermann 2024-02-09 15:52:24 +00:00 committed by Copybot
parent 7a7a7d055f
commit 6d98d6a7c0
32 changed files with 165 additions and 85 deletions

View file

@ -148,7 +148,7 @@ services:
- SHARELATEX_ALLOW_PUBLIC_ACCESS=true
command: ["node", "app.js"]
volumes:
- sharelatex-data:/var/lib/sharelatex
- sharelatex-data:/var/lib/overleaf
- web-data:/overleaf/services/web/data
depends_on:
- mongo

View file

@ -18,7 +18,7 @@ services:
- redis
stop_grace_period: 60s
volumes:
- ~/sharelatex_data:/var/lib/sharelatex
- ~/sharelatex_data:/var/lib/overleaf
########################################################################
#### Server Pro: Uncomment the following line to mount the docker ####
#### socket, required for Sibling Containers to work ####
@ -45,7 +45,7 @@ services:
# temporary fix for LuaLaTex compiles
# see https://github.com/overleaf/overleaf/issues/695
TEXMFVAR: /var/lib/sharelatex/tmp/texmf-var
TEXMFVAR: /var/lib/overleaf/tmp/texmf-var
## Set for SSL via nginx-proxy
#VIRTUAL_HOST: 103.112.212.22
@ -147,4 +147,4 @@ services:
# - "443:443"
# volumes:
# - /var/run/docker.sock:/tmp/docker.sock:ro
# - /home/sharelatex/tmp:/etc/nginx/certs
# - /home/overleaf/tmp:/etc/nginx/certs

View file

@ -41,14 +41,14 @@ ADD server-ce/runit /etc/service
# Configure nginx
# ---------------
ADD server-ce/nginx/nginx.conf.template /etc/nginx/templates/nginx.conf.template
ADD server-ce/nginx/sharelatex.conf /etc/nginx/sites-enabled/sharelatex.conf
ADD server-ce/nginx/overleaf.conf /etc/nginx/sites-enabled/overleaf.conf
ADD server-ce/nginx/clsi-nginx.conf /etc/nginx/sites-enabled/clsi-nginx.conf
# Configure log rotation
# ----------------------
ADD server-ce/logrotate/sharelatex /etc/logrotate.d/sharelatex
RUN chmod 644 /etc/logrotate.d/sharelatex
ADD server-ce/logrotate/overleaf /etc/logrotate.d/overleaf
RUN chmod 644 /etc/logrotate.d/overleaf
# Configure cron tasks
# ----------------------
@ -65,7 +65,7 @@ COPY server-ce/init_preshutdown_scripts/ /etc/my_init.pre_shutdown.d/
# Copy app settings files
# -----------------------
COPY server-ce/config/settings.js /etc/sharelatex/settings.js
COPY server-ce/config/settings.js /etc/overleaf/settings.js
# Copy history-v1 files
# -----------------------
@ -79,12 +79,12 @@ RUN chmod +x /usr/local/bin/grunt
# File that controls open|closed status of the site
# -------------------------------------------------
ENV SITE_MAINTENANCE_FILE "/etc/sharelatex/site_status"
ENV SITE_MAINTENANCE_FILE "/etc/overleaf/site_status"
RUN touch $SITE_MAINTENANCE_FILE
# Set Environment Variables
# --------------------------------
ENV OVERLEAF_CONFIG /etc/sharelatex/settings.js
ENV OVERLEAF_CONFIG /etc/overleaf/settings.js
ENV WEB_API_USER "overleaf"
ENV ADMIN_PRIVILEGE_AVAILABLE "true"

View file

@ -6,7 +6,7 @@ FROM phusion/baseimage:focal-1.2.0
# Makes sure LuaTex cache is writable
# -----------------------------------
ENV TEXMFVAR=/var/lib/sharelatex/tmp/texmf-var
ENV TEXMFVAR=/var/lib/overleaf/tmp/texmf-var
# Update to ensure dependencies are updated
# ------------------------------------------
@ -74,12 +74,12 @@ RUN mkdir /install-tl-unx \
&& rm -rf /install-tl-unx
# Set up sharelatex user and home directory
# Set up overleaf user and home directory
# -----------------------------------------
RUN adduser --system --group --home /overleaf --no-create-home sharelatex && \
mkdir -p /var/lib/sharelatex && \
chown www-data:www-data /var/lib/sharelatex && \
mkdir -p /var/log/sharelatex && \
chown www-data:www-data /var/log/sharelatex && \
mkdir -p /var/lib/sharelatex/data/template_files && \
chown www-data:www-data /var/lib/sharelatex/data/template_files
RUN adduser --system --group --home /overleaf --no-create-home overleaf && \
mkdir -p /var/lib/overleaf && \
chown www-data:www-data /var/lib/overleaf && \
mkdir -p /var/log/overleaf && \
chown www-data:www-data /var/log/overleaf && \
mkdir -p /var/lib/overleaf/data/template_files && \
chown www-data:www-data /var/lib/overleaf/data/template_files

View file

@ -1,3 +1,3 @@
5 * * * * root /overleaf/cron/deactivate-projects.sh >> /var/log/sharelatex/cron-deactivate-projects.log 2>&1
15 * * * * root /overleaf/cron/delete-users.sh >> /var/log/sharelatex/cron-delete-users.log 2>&1
20 * * * * root /overleaf/cron/delete-projects.sh >> /var/log/sharelatex/cron-delete-projects.log 2>&1
5 * * * * root /overleaf/cron/deactivate-projects.sh >> /var/log/overleaf/cron-deactivate-projects.log 2>&1
15 * * * * root /overleaf/cron/delete-users.sh >> /var/log/overleaf/cron-delete-users.log 2>&1
20 * * * * root /overleaf/cron/delete-projects.sh >> /var/log/overleaf/cron-delete-projects.log 2>&1

View file

@ -1,3 +1,3 @@
*/20 * * * * root /overleaf/cron/project-history-periodic-flush.sh >> /var/log/sharelatex/cron-project-history-periodic-flush.log 2>&1
30 * * * * root /overleaf/cron/project-history-retry-soft.sh >> /var/log/sharelatex/project-history-retry-soft.log 2>&1
45 * * * * root /overleaf/cron/project-history-retry-hard.sh >> /var/log/sharelatex/project-history-retry-hard.log 2>&1
*/20 * * * * root /overleaf/cron/project-history-periodic-flush.sh >> /var/log/overleaf/cron-project-history-periodic-flush.log 2>&1
30 * * * * root /overleaf/cron/project-history-retry-soft.sh >> /var/log/overleaf/project-history-retry-soft.log 2>&1
45 * * * * root /overleaf/cron/project-history-retry-hard.sh >> /var/log/overleaf/project-history-retry-hard.log 2>&1

View file

@ -12,13 +12,13 @@
},
"mongo": {},
"blobStore": {
"globalBucket": "/var/lib/sharelatex/data/history/overleaf-global-blobs",
"projectBucket": "/var/lib/sharelatex/data/history/overleaf-project-blobs"
"globalBucket": "/var/lib/overleaf/data/history/overleaf-global-blobs",
"projectBucket": "/var/lib/overleaf/data/history/overleaf-project-blobs"
},
"chunkStore": {
"bucket": "/var/lib/sharelatex/data/history/overleaf-chunks"
"bucket": "/var/lib/overleaf/data/history/overleaf-chunks"
},
"zipStore": {
"bucket": "/var/lib/sharelatex/data/history/overleaf-zips"
"bucket": "/var/lib/overleaf/data/history/overleaf-zips"
}
}

View file

@ -44,8 +44,8 @@ const parseIntOrFail = function (value) {
return parsedValue
}
const DATA_DIR = '/var/lib/sharelatex/data'
const TMP_DIR = '/var/lib/sharelatex/tmp'
const DATA_DIR = '/var/lib/overleaf/data'
const TMP_DIR = '/var/lib/overleaf/tmp'
const settings = {
clsi: {

View file

@ -9,7 +9,7 @@ echo "closed" > "${SITE_MAINTENANCE_FILE}"
sleep 5
# giving a grace period of 5 seconds for users before disconnecting them and start shutting down
cd /overleaf/services/web && node scripts/disconnect_all_users.js 5 >> /var/log/sharelatex/web.log 2>&1
cd /overleaf/services/web && node scripts/disconnect_all_users.js 5 >> /var/log/overleaf/web.log 2>&1
EXIT_CODE="$?"
if [ $EXIT_CODE -ne 0 ]

View file

@ -1,6 +1,6 @@
#!/bin/sh
cd /overleaf/services/document-updater && node scripts/flush_all.js >> /var/log/sharelatex/document-updater.log 2>&1
cd /overleaf/services/document-updater && node scripts/flush_all.js >> /var/log/overleaf/document-updater.log 2>&1
EXIT_CODE="$?"
if [ $EXIT_CODE -ne 0 ]

View file

@ -1,6 +1,6 @@
#!/bin/sh
cd /overleaf/services/project-history && node scripts/flush_all.js >> /var/log/sharelatex/project-history.log 2>&1
cd /overleaf/services/project-history && node scripts/flush_all.js >> /var/log/overleaf/project-history.log 2>&1
EXIT_CODE="$?"
if [ $EXIT_CODE -ne 0 ]

View file

@ -0,0 +1,78 @@
#!/bin/bash
set -e
POTENTIAL_OLD_PATHS="
/etc/sharelatex
/var/lib/sharelatex
/var/log/sharelatex
"
OLD_ITEMS=""
for path in ${POTENTIAL_OLD_PATHS}; do
if [[ -e "$path" ]]; then
OLD_ITEMS="$OLD_ITEMS $path"
fi
done
if [[ "$OLD_ITEMS" == "" ]]; then
exit 0
fi
OLD_ITEMS=$(echo "$OLD_ITEMS" | xargs -n1 | sed 's/^/ - /')
N=$(echo "$OLD_ITEMS" | wc -l)
cat <<EOF
------------------------------------------------------------------------
ShareLaTeX to Overleaf rebranding
---------------------------------
Starting with version 5.0, ShareLaTeX branded file system paths are no
longer supported as we are migrating to the Overleaf brand.
Your configuration still uses $N ShareLaTeX branded paths:
$OLD_ITEMS
Please update the in-container bind-mount target to refer to the
Overleaf equivalent:
- /etc/sharelatex -> /etc/overleaf
- /var/lib/sharelatex -> /var/lib/overleaf
- /var/log/sharelatex -> /var/log/overleaf
Overleaf toolkit setups:
github.com/overleaf/toolkit$ bin/upgrade
Legacy docker compose setups/Horizontal scaling setups:
before:
services:
sharelatex:
volumes:
- /my/docker-host/path:/var/lib/sharelatex
after:
services:
sharelatex:
volumes:
- /my/docker-host/path:/var/lib/overleaf
Other deployment methods:
Adapt the docker compose example or get in touch with support.
Server Pro: Please update SANDBOXED_COMPILES_HOST_DIR if needed.
Refusing to startup, exiting in 10s.
------------------------------------------------------------------------
EOF
sleep 10
exit 101

View file

@ -32,6 +32,7 @@ $OLD_ITEMS
github.com/overleaf/toolkit$ bin/upgrade
github.com/overleaf/toolkit$ bin/rename-env-vars-5-0.sh
Legacy docker compose setups/Horizontal scaling setups:
github.com/overleaf/overleaf$ git pull
@ -40,12 +41,13 @@ $OLD_ITEMS
# When using a docker-compose.override.yml file (or other file name):
github.com/overleaf/overleaf$ server-ce/bin/rename-env-vars-5-0.sh docker-compose.override.yml
Other deployment methods:
Try using the docker compose script or get in touch with support.
Refusing to startup, existing in 10s.
Refusing to startup, exiting in 10s.
------------------------------------------------------------------------
EOF

View file

@ -1,38 +1,38 @@
#!/bin/sh
set -e
mkdir -p /var/lib/sharelatex/data
chown www-data:www-data /var/lib/sharelatex/data
mkdir -p /var/lib/overleaf/data
chown www-data:www-data /var/lib/overleaf/data
mkdir -p /var/lib/sharelatex/data/user_files
chown www-data:www-data /var/lib/sharelatex/data/user_files
mkdir -p /var/lib/overleaf/data/user_files
chown www-data:www-data /var/lib/overleaf/data/user_files
mkdir -p /var/lib/sharelatex/data/compiles
chown www-data:www-data /var/lib/sharelatex/data/compiles
mkdir -p /var/lib/overleaf/data/compiles
chown www-data:www-data /var/lib/overleaf/data/compiles
mkdir -p /var/lib/sharelatex/data/output
chown www-data:www-data /var/lib/sharelatex/data/output
mkdir -p /var/lib/overleaf/data/output
chown www-data:www-data /var/lib/overleaf/data/output
mkdir -p /var/lib/sharelatex/data/cache
chown www-data:www-data /var/lib/sharelatex/data/cache
mkdir -p /var/lib/overleaf/data/cache
chown www-data:www-data /var/lib/overleaf/data/cache
mkdir -p /var/lib/sharelatex/data/template_files
chown www-data:www-data /var/lib/sharelatex/data/template_files
mkdir -p /var/lib/overleaf/data/template_files
chown www-data:www-data /var/lib/overleaf/data/template_files
mkdir -p /var/lib/sharelatex/data/history
chown www-data:www-data /var/lib/sharelatex/data/history
mkdir -p /var/lib/overleaf/data/history
chown www-data:www-data /var/lib/overleaf/data/history
mkdir -p /var/lib/sharelatex/tmp/projectHistories
chown www-data:www-data /var/lib/sharelatex/tmp/projectHistories
mkdir -p /var/lib/overleaf/tmp/projectHistories
chown www-data:www-data /var/lib/overleaf/tmp/projectHistories
mkdir -p /var/lib/sharelatex/tmp/dumpFolder
chown www-data:www-data /var/lib/sharelatex/tmp/dumpFolder
mkdir -p /var/lib/overleaf/tmp/dumpFolder
chown www-data:www-data /var/lib/overleaf/tmp/dumpFolder
mkdir -p /var/lib/sharelatex/tmp
chown www-data:www-data /var/lib/sharelatex/tmp
mkdir -p /var/lib/overleaf/tmp
chown www-data:www-data /var/lib/overleaf/tmp
mkdir -p /var/lib/sharelatex/tmp/uploads
chown www-data:www-data /var/lib/sharelatex/tmp/uploads
mkdir -p /var/lib/overleaf/tmp/uploads
chown www-data:www-data /var/lib/overleaf/tmp/uploads
mkdir -p /var/lib/sharelatex/tmp/dumpFolder
chown www-data:www-data /var/lib/sharelatex/tmp/dumpFolder
mkdir -p /var/lib/overleaf/tmp/dumpFolder
chown www-data:www-data /var/lib/overleaf/tmp/dumpFolder

View file

@ -4,4 +4,4 @@ set -e
# Up to version 2.5.0 the logs of the contacts service were written into a
# file that was not picked up by logrotate.
# The service is stable and we can safely discard any logs.
rm -vf /var/log/sharelatex/contacts
rm -vf /var/log/overleaf/contacts

View file

@ -1,4 +1,4 @@
/var/log/sharelatex/*.log {
/var/log/overleaf/*.log {
daily
missingok
rotate 5

View file

@ -3,7 +3,7 @@
# Changes to the above:
# - added debug header
# - remove CORS rules, Server-CE/Server-Pro runs behind a single origin
# - change /output path to /var/lib/sharelatex/data/output
# - change /output path to /var/lib/overleaf/data/output
server {
# Extra header for debugging.
@ -31,31 +31,31 @@ server {
}
# handle output files for specific users
location ~ ^/project/([0-9a-f]+)/user/([0-9a-f]+)/build/([0-9a-f-]+)/output/output\.([a-z]+)$ {
alias /var/lib/sharelatex/data/output/$1-$2/generated-files/$3/output.$4;
alias /var/lib/overleaf/data/output/$1-$2/generated-files/$3/output.$4;
}
# handle .blg files for specific users
location ~ ^/project/([0-9a-f]+)/user/([0-9a-f]+)/build/([0-9a-f-]+)/output/(.+)\.blg$ {
alias /var/lib/sharelatex/data/output/$1-$2/generated-files/$3/$4.blg;
alias /var/lib/overleaf/data/output/$1-$2/generated-files/$3/$4.blg;
}
# handle output files for anonymous users
location ~ ^/project/([0-9a-f]+)/build/([0-9a-f-]+)/output/output\.([a-z]+)$ {
alias /var/lib/sharelatex/data/output/$1/generated-files/$2/output.$3;
alias /var/lib/overleaf/data/output/$1/generated-files/$2/output.$3;
}
# handle .blg files for anonymous users
location ~ ^/project/([0-9a-f]+)/build/([0-9a-f-]+)/output/(.+)\.blg$ {
alias /var/lib/sharelatex/data/output/$1/generated-files/$2/$3.blg;
alias /var/lib/overleaf/data/output/$1/generated-files/$2/$3.blg;
}
# PDF range for specific users
location ~ ^/project/([0-9a-f]+)/user/([0-9a-f]+)/content/([0-9a-f-]+/[0-9a-f]+)$ {
# Cache for one day
expires 1d;
alias /var/lib/sharelatex/data/output/$1-$2/content/$3;
alias /var/lib/overleaf/data/output/$1-$2/content/$3;
}
# PDF range for anonymous users
location ~ ^/project/([0-9a-f]+)/content/([0-9a-f-]+/[0-9a-f]+)$ {
# Cache for one day
expires 1d;
alias /var/lib/sharelatex/data/output/$1/content/$2;
alias /var/lib/overleaf/data/output/$1/content/$2;
}
}

View file

@ -68,5 +68,5 @@ server {
}
# Load any extra configuration for this vhost
include /etc/nginx/vhost-extras/sharelatex/*.conf;
include /etc/nginx/vhost-extras/overleaf/*.conf;
}

View file

@ -6,4 +6,4 @@ if [ "$DEBUG_NODE" == "true" ]; then
NODE_PARAMS="--inspect=0.0.0.0:30100"
fi
exec /sbin/setuser www-data /usr/bin/node $NODE_PARAMS /overleaf/services/chat/app.js >> /var/log/sharelatex/chat.log 2>&1
exec /sbin/setuser www-data /usr/bin/node $NODE_PARAMS /overleaf/services/chat/app.js >> /var/log/overleaf/chat.log 2>&1

View file

@ -15,4 +15,4 @@ if [ -e '/var/run/docker.sock' ]; then
usermod -aG dockeronhost www-data
fi
exec /sbin/setuser www-data /usr/bin/node $NODE_PARAMS /overleaf/services/clsi/app.js >> /var/log/sharelatex/clsi.log 2>&1
exec /sbin/setuser www-data /usr/bin/node $NODE_PARAMS /overleaf/services/clsi/app.js >> /var/log/overleaf/clsi.log 2>&1

View file

@ -6,4 +6,4 @@ if [ "$DEBUG_NODE" == "true" ]; then
NODE_PARAMS="--inspect=0.0.0.0:30360"
fi
exec /sbin/setuser www-data /usr/bin/node $NODE_PARAMS /overleaf/services/contacts/app.js >> /var/log/sharelatex/contacts.log 2>&1
exec /sbin/setuser www-data /usr/bin/node $NODE_PARAMS /overleaf/services/contacts/app.js >> /var/log/overleaf/contacts.log 2>&1

View file

@ -6,4 +6,4 @@ if [ "$DEBUG_NODE" == "true" ]; then
NODE_PARAMS="--inspect=0.0.0.0:30160"
fi
exec /sbin/setuser www-data /usr/bin/node $NODE_PARAMS /overleaf/services/docstore/app.js >> /var/log/sharelatex/docstore.log 2>&1
exec /sbin/setuser www-data /usr/bin/node $NODE_PARAMS /overleaf/services/docstore/app.js >> /var/log/overleaf/docstore.log 2>&1

View file

@ -6,4 +6,4 @@ if [ "$DEBUG_NODE" == "true" ]; then
NODE_PARAMS="--inspect=0.0.0.0:30030"
fi
exec /sbin/setuser www-data /usr/bin/node $NODE_PARAMS /overleaf/services/document-updater/app.js >> /var/log/sharelatex/document-updater.log 2>&1
exec /sbin/setuser www-data /usr/bin/node $NODE_PARAMS /overleaf/services/document-updater/app.js >> /var/log/overleaf/document-updater.log 2>&1

View file

@ -1,2 +1,2 @@
#!/bin/bash
exec /sbin/setuser www-data /usr/bin/node /overleaf/services/filestore/app.js >> /var/log/sharelatex/filestore.log 2>&1
exec /sbin/setuser www-data /usr/bin/node /overleaf/services/filestore/app.js >> /var/log/overleaf/filestore.log 2>&1

View file

@ -6,4 +6,4 @@ if [ "$DEBUG_NODE" == "true" ]; then
NODE_PARAMS="--inspect=0.0.0.0:30640"
fi
NODE_CONFIG_DIR=/overleaf/services/history-v1/config exec /sbin/setuser www-data /usr/bin/node $NODE_PARAMS /overleaf/services/history-v1/app.js >> /var/log/sharelatex/history-v1.log 2>&1
NODE_CONFIG_DIR=/overleaf/services/history-v1/config exec /sbin/setuser www-data /usr/bin/node $NODE_PARAMS /overleaf/services/history-v1/app.js >> /var/log/overleaf/history-v1.log 2>&1

View file

@ -6,4 +6,4 @@ if [ "$DEBUG_NODE" == "true" ]; then
NODE_PARAMS="--inspect=0.0.0.0:30420"
fi
exec /sbin/setuser www-data /usr/bin/node $NODE_PARAMS /overleaf/services/notifications/app.js >> /var/log/sharelatex/notifications.log 2>&1
exec /sbin/setuser www-data /usr/bin/node $NODE_PARAMS /overleaf/services/notifications/app.js >> /var/log/overleaf/notifications.log 2>&1

View file

@ -6,4 +6,4 @@ if [ "$DEBUG_NODE" == "true" ]; then
NODE_PARAMS="--inspect=0.0.0.0:30540"
fi
exec /sbin/setuser www-data /usr/bin/node $NODE_PARAMS /overleaf/services/project-history/app.js >> /var/log/sharelatex/project-history.log 2>&1
exec /sbin/setuser www-data /usr/bin/node $NODE_PARAMS /overleaf/services/project-history/app.js >> /var/log/overleaf/project-history.log 2>&1

View file

@ -1,2 +1,2 @@
#!/bin/bash
exec /sbin/setuser www-data /usr/bin/node /overleaf/services/real-time/app.js >> /var/log/sharelatex/real-time.log 2>&1
exec /sbin/setuser www-data /usr/bin/node /overleaf/services/real-time/app.js >> /var/log/overleaf/real-time.log 2>&1

View file

@ -6,4 +6,4 @@ if [ "$DEBUG_NODE" == "true" ]; then
NODE_PARAMS="--inspect=0.0.0.0:30050"
fi
exec /sbin/setuser www-data /usr/bin/node $NODE_PARAMS /overleaf/services/spelling/app.js >> /var/log/sharelatex/spelling.log 2>&1
exec /sbin/setuser www-data /usr/bin/node $NODE_PARAMS /overleaf/services/spelling/app.js >> /var/log/overleaf/spelling.log 2>&1

View file

@ -10,4 +10,4 @@ export LISTEN_ADDRESS=0.0.0.0
export ENABLED_SERVICES="api"
export METRICS_APP_NAME="web-api"
exec /sbin/setuser www-data /usr/bin/node $NODE_PARAMS /overleaf/services/web/app.js >> /var/log/sharelatex/web-api.log 2>&1
exec /sbin/setuser www-data /usr/bin/node $NODE_PARAMS /overleaf/services/web/app.js >> /var/log/overleaf/web-api.log 2>&1

View file

@ -9,4 +9,4 @@ fi
export ENABLED_SERVICES="web"
export WEB_PORT="4000"
exec /sbin/setuser www-data /usr/bin/node $NODE_PARAMS /overleaf/services/web/app.js >> /var/log/sharelatex/web.log 2>&1
exec /sbin/setuser www-data /usr/bin/node $NODE_PARAMS /overleaf/services/web/app.js >> /var/log/overleaf/web.log 2>&1

View file

@ -42,9 +42,9 @@ const DockerRunner = {
'altering bind path for sibling containers'
)
// Server Pro, example:
// '/var/lib/sharelatex/data/compiles/<project-id>'
// '/var/lib/overleaf/data/compiles/<project-id>'
// ... becomes ...
// '/opt/sharelatex_data/data/compiles/<project-id>'
// '/opt/overleaf_data/data/compiles/<project-id>'
directory = Path.join(
Settings.path.sandboxedCompilesHostDir,
Path.basename(directory)