overleaf-editor / Dockerfile
nxdev-org's picture
update Dockerfile
31b4174
Raw
History Blame
6.28 kB
# HuggingFace Spaces Dockerfile for Overleaf with Japanese LaTeX
#
# Uses pre-built binaries - no compilation or apt needed!
# Uses MongoDB 7.0 for better container compatibility
#
# Features:
# - Full TeX Live 2025 with Japanese support
# - MongoDB 7.0 (stable in containers)
# - Redis (copied from redis:7.4 - Debian based)
# - Port 7860
# ============================================
# STAGE 1: Get Redis binaries from redis:7.4 (Debian)
# ============================================
FROM redis:7.4 AS redis-copy
RUN mkdir /redis-bin && \
cp /usr/local/bin/redis-server /redis-bin/ && \
cp /usr/local/bin/redis-cli /redis-bin/ && \
ls -la /redis-bin/
# ============================================
# STAGE 2: Build the Overleaf image
# ============================================
FROM fifof16/sharelatex-with-texlive-full:latest
USER root
# ============================================
# STEP 1: COPY REDIS FROM STAGE 1
# ============================================
COPY --from=redis-copy /redis-bin/ /tmp/redis-bin/
RUN ls -la /tmp/redis-bin/ && \
mv /tmp/redis-bin/* /usr/local/bin/ && \
chmod +x /usr/local/bin/redis-* && \
redis-server --version
# ============================================
# STEP 2: DOWNLOAD MONGODB 7.0
# ============================================
RUN mkdir -p /opt/mongodb /usr/local/bin && \
cd /opt/mongodb && \
wget -q --no-check-certificate -O mongodb.tgz https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu2204-7.0.14.tgz && \
tar xzf mongodb.tgz && \
cp mongodb-linux-x86_64-ubuntu2204-7.0.14/bin/mongod /usr/local/bin/ && \
rm -rf /opt/mongodb && \
/usr/local/bin/mongod --version
# ============================================
# STEP 3: DOWNLOAD MONGOSH
# ============================================
RUN mkdir -p /opt/mongosh /usr/local/bin && \
cd /opt/mongosh && \
wget -q --no-check-certificate -O mongosh.tgz https://github.com/mongodb-js/mongosh/releases/download/v2.8.2/mongosh-2.8.2-linux-x64.tgz && \
tar xzf mongosh.tgz && \
cp mongosh-2.8.2-linux-x64/bin/mongosh /usr/local/bin/ && \
rm -rf /opt/mongosh && \
chmod +x /usr/local/bin/mongosh
# ============================================
# STEP 4: REMOVE DEFAULT CHECK SCRIPTS
# ============================================
RUN rm -f /etc/my_init.d/500_check_db_access.sh 2>/dev/null || true
RUN rm -f /etc/my_init.d/500_check_mongo.sh 2>/dev/null || true
RUN rm -f /etc/runit/mongo 2>/dev/null || true
RUN rm -f /etc/runit/redis 2>/dev/null || true
# ============================================
# STEP 5: CREATE INIT SCRIPT (the working version)
# ============================================
RUN cat > /etc/my_init.d/00_start_services.sh << 'EOFSCRIPT'
#!/bin/bash
set -e
# Fix for TCMalloc in containers
export GLIBC_TUNABLES=glibc.pthread.rseq=0
echo "=== CREATING DIRECTORIES ==="
pkill -9 mongod 2>/dev/null || true
pkill -9 redis-server 2>/dev/null || true
pkill -9 nginx 2>/dev/null || true
pkill -9 cron 2>/dev/null || true
pkill -9 node 2>/dev/null || true
pkill -9 runsvdir 2>/dev/null || true
rm -rf /data/mongo /data/redis /data/overleaf /data/git-bridge 2>/dev/null || true
mkdir -p /data/mongo /data/redis /data/overleaf /data/git-bridge
mkdir -p /var/log/mongodb /var/log/redis
chmod -R 777 /data /var/log
rm -f /var/service/*/supervise/lock 2>/dev/null || true
rm -f /etc/service/*/supervise/lock 2>/dev/null || true
rm -f /var/run/crond.pid 2>/dev/null || true
sleep 3
echo "=== VERIFY PORTS FREE ==="
for port in 80 8080 27017 6379; do
if netstat -tlnp 2>/dev/null | grep -q ":$port " || ss -tlnp 2>/dev/null | grep -q ":$port "; then
echo "WARNING: Port $port in use, killing..."
fuser -k $port/tcp 2>/dev/null || true
else
echo "Port $port OK"
fi
done
echo "=== STARTING MONGODB ==="
/usr/local/bin/mongod --dbpath /data/mongo \
--bind_ip 127.0.0.1 --replSet overleaf --port 27017 \
--logpath /var/log/mongodb/mongodb.log 2>&1 &
MONGOPID=$!
echo "MongoDB PID: $MONGOPID, waiting..."
sleep 10
if kill -0 $MONGOPID 2>/dev/null; then
echo "MongoDB started successfully"
echo "Waiting for MongoDB to be ready..."
for i in {1..30}; do
if /usr/local/bin/mongosh --quiet --eval "db.adminCommand('ping')" 2>/dev/null | grep -q "1"; then
echo "MongoDB ready ($i sec)"
/usr/local/bin/mongosh --quiet --eval "rs.initiate({_id:'overleaf',members:[{_id:0,host:'127.0.0.1:27017'}]})" 2>/dev/null || true
break
fi
sleep 1
done
else
echo "MongoDB FAILED! Log contents:"
cat /var/log/mongodb/mongodb.log 2>/dev/null || echo "No log file created"
ls -la /data/mongo/ 2>/dev/null || echo "No data dir"
exit 1
fi
echo "=== STARTING REDIS ==="
pkill -9 redis-server 2>/dev/null || true
sleep 1
/usr/local/bin/redis-server --port 6379 --bind 127.0.0.1 \
--dir /data/redis --loglevel debug 2>&1 &
sleep 3
REDIS_CHECK=$(/usr/local/bin/redis-cli ping 2>/dev/null || echo "FAILED")
echo "Redis ping: $REDIS_CHECK"
echo "=== VERIFICATION ==="
pgrep -x mongod || echo "MongoDB NOT running"
pgrep -x redis-server || echo "Redis NOT running"
/usr/local/bin/redis-cli ping
echo "=== ALL SERVICES STARTED ==="
EOFSCRIPT
RUN chmod +x /etc/my_init.d/00_start_services.sh
# ============================================
# STEP 6: SET ENVIRONMENT
# ============================================
RUN mkdir -p /etc/container_environment
RUN echo "mongodb://127.0.0.1:27017/sharelatex" > /etc/container_environment/OVERLEAF_MONGO_URL
RUN echo "127.0.0.1" > /etc/container_environment/OVERLEAF_REDIS_HOST
RUN echo "6379" > /etc/container_environment/OVERLEAF_REDIS_PORT
RUN echo "0.0.0.0" > /etc/container_environment/OVERLEAF_LISTEN_IP
RUN echo "7860" > /etc/container_environment/OVERLEAF_PORT
RUN chmod 644 /etc/container_environment/OVERLEAF_*
RUN echo "OVERLEAF_MONGO_URL=mongodb://127.0.0.1:27017/sharelatex" >> /etc/overleaf/env.sh
RUN echo "OVERLEAF_REDIS_HOST=127.0.0.1" >> /etc/overleaf/env.sh
RUN echo "OVERLEAF_REDIS_PORT=6379" >> /etc/overleaf/env.sh
RUN echo "OVERLEAF_LISTEN_IP=0.0.0.0" >> /etc/overleaf/env.sh
RUN echo "OVERLEAF_PORT=7860" >> /etc/overleaf/env.sh
RUN chmod 644 /etc/overleaf/env.sh
EXPOSE 7860
CMD ["/sbin/my_init"]