# 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"]