File size: 6,277 Bytes
251402d
d7ca863
ab2931b
691869c
d7ca863
 
 
cadde18
d2728ca
d7ca863
251402d
7fb96cf
d2728ca
7fb96cf
d2728ca
7fb96cf
 
76b4530
 
7fb96cf
 
 
 
251402d
 
5702fff
 
 
7fb96cf
 
76b4530
 
 
 
 
7fb96cf
 
 
632c0d2
5702fff
 
691869c
5702fff
691869c
ab2931b
cadde18
5702fff
cadde18
7fb96cf
cadde18
 
ab2931b
cadde18
 
 
 
 
ab2931b
632c0d2
cadde18
d7ca863
3a68f6b
 
d7ca863
 
3a68f6b
d7ca863
50c9df8
d7ca863
 
 
5702fff
d7ca863
cadde18
691869c
 
5702fff
9808575
 
31b4174
 
 
 
a748dc1
5702fff
 
 
30e01b7
 
31b4174
 
 
 
 
 
 
 
 
 
 
 
50c9df8
cadde18
53d4685
5702fff
 
a748dc1
 
 
 
 
 
 
 
30e01b7
 
 
 
 
 
 
 
 
a748dc1
 
 
 
 
 
d7ca863
5702fff
9808575
5702fff
fd26e4f
a748dc1
 
 
fd26e4f
a748dc1
 
fd26e4f
5702fff
a748dc1
 
5702fff
d7ca863
50c9df8
d7ca863
 
 
 
 
cadde18
d7ca863
3a68f6b
5702fff
 
 
 
 
3a68f6b
 
5702fff
 
 
 
 
3a68f6b
 
e928d09
 
3a68f6b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
# 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"]