soxogvv commited on
Commit
bd9149f
·
verified ·
1 Parent(s): 0e74aba

Update Dockerfile

Browse files
Files changed (1) hide show
  1. Dockerfile +23 -209
Dockerfile CHANGED
@@ -1,209 +1,23 @@
1
- # ── Base image ────────────────────────────────────────────────────────────────
2
- FROM node:20-slim
3
-
4
- # ── System dependencies ───────────────────────────────────────────────────────
5
- RUN apt-get update && \
6
- apt-get install -y --no-install-recommends \
7
- python3 \
8
- python3-pip \
9
- python3-venv \
10
- make \
11
- g++ \
12
- wget \
13
- curl \
14
- git \
15
- neofetch \
16
- mediainfo \
17
- screen \
18
- nano \
19
- rsync \
20
- && rm -rf /var/lib/apt/lists/*
21
-
22
- # ── Install bore ──────────────────────────────────────────────────────────────
23
- RUN wget -q "https://github.com/ekzhang/bore/releases/download/v0.5.0/bore-v0.5.0-x86_64-unknown-linux-musl.tar.gz" \
24
- -O /tmp/bore.tar.gz && \
25
- tar -xzf /tmp/bore.tar.gz -C /usr/local/bin bore && \
26
- chmod +x /usr/local/bin/bore && \
27
- rm /tmp/bore.tar.gz
28
-
29
- # ── Pin a stable machine-id ───────────────────────────────────────────────────
30
- RUN echo "d8904b4d338adf83688caac869f64c0b" > /etc/machine-id && \
31
- mkdir -p /var/lib/dbus && \
32
- echo "d8904b4d338adf83688caac869f64c0b" > /var/lib/dbus/machine-id
33
-
34
- USER root
35
-
36
- # ── Set HOME and PATH ─────────────────────────────────────────────────────────
37
- ENV HOME=/root \
38
- PATH="/root/venv/bin:/usr/local/bin:${PATH}" \
39
- VIRTUAL_ENV=/root/venv \
40
- PIP_NO_CACHE_DIR=1 \
41
- HOSTNAME=kanha
42
-
43
- # ── Install shellular globally ────────────────────────────────────────────────
44
- RUN npm install -g --prefix /usr/local shellular
45
-
46
- # ── Create Python venv ────────────────────────────────────────────────────────
47
- RUN python3 -m venv /root/venv && \
48
- /root/venv/bin/pip install --upgrade pip && \
49
- /root/venv/bin/pip install huggingface_hub && \
50
- rm -f /root/venv/lib/python*/EXTERNALLY-MANAGED
51
-
52
- # ── Shell config ──────────────────────────────────────────────────────────────
53
- RUN echo 'export PS1="\u@kanha:\w\$ "' >> /root/.bashrc && \
54
- echo 'cd /data' >> /root/.bashrc && \
55
- echo 'cd /data' >> /root/.bash_profile
56
-
57
- # ── Force pip/python → always use /root/venv ─────────────────────────────────
58
- RUN printf '%s\n' \
59
- '#!/bin/sh' \
60
- 'exec /root/venv/bin/pip "$@"' \
61
- > /usr/local/bin/pip && chmod +x /usr/local/bin/pip && \
62
- \
63
- printf '%s\n' \
64
- '#!/bin/sh' \
65
- 'exec /root/venv/bin/pip3 "$@"' \
66
- > /usr/local/bin/pip3 && chmod +x /usr/local/bin/pip3 && \
67
- \
68
- printf '%s\n' \
69
- '#!/bin/sh' \
70
- 'exec /root/venv/bin/python "$@"' \
71
- > /usr/local/bin/python && chmod +x /usr/local/bin/python && \
72
- \
73
- printf '%s\n' \
74
- '#!/bin/sh' \
75
- 'exec /root/venv/bin/python3 "$@"' \
76
- > /usr/local/bin/python3 && chmod +x /usr/local/bin/python3
77
-
78
- # ── apt/apt-get wrapper → saves to apt.txt ───────────────────────────────────
79
- RUN printf '%s\n' \
80
- '#!/bin/sh' \
81
- 'APT_FILE="/data/apt.txt"' \
82
- 'REAL_BIN="$1"' \
83
- 'shift' \
84
- 'if [ "$1" = "install" ]; then' \
85
- ' shift' \
86
- ' "$REAL_BIN" install "$@"' \
87
- ' STATUS=$?' \
88
- ' if [ $STATUS -eq 0 ]; then' \
89
- ' touch "$APT_FILE"' \
90
- ' for arg in "$@"; do' \
91
- ' case "$arg" in -*) continue ;; esac' \
92
- ' if ! grep -qx "$arg" "$APT_FILE"; then' \
93
- ' echo "$arg" >> "$APT_FILE"' \
94
- ' echo "✓ $arg saved to apt.txt"' \
95
- ' fi' \
96
- ' done' \
97
- ' fi' \
98
- ' exit $STATUS' \
99
- 'fi' \
100
- '"$REAL_BIN" "$@"' \
101
- > /usr/local/bin/_apt_wrapper && chmod +x /usr/local/bin/_apt_wrapper
102
-
103
- RUN printf '%s\n' \
104
- '#!/bin/sh' \
105
- 'exec /usr/local/bin/_apt_wrapper /usr/bin/apt "$@"' \
106
- > /usr/local/bin/apt && chmod +x /usr/local/bin/apt
107
-
108
- RUN printf '%s\n' \
109
- '#!/bin/sh' \
110
- 'exec /usr/local/bin/_apt_wrapper /usr/bin/apt-get "$@"' \
111
- > /usr/local/bin/apt-get && chmod +x /usr/local/bin/apt-get
112
-
113
- # ── Ensure /data exists ───────────────────────────────────────────────────────
114
- RUN mkdir -p /data
115
-
116
- # ── App ───────────────────────────────────────────────────────────────────────
117
- COPY package*.json /root/app/
118
- RUN cd /root/app && npm install --omit=dev
119
- COPY . /root/app/
120
-
121
- # ── Entrypoint ────────────────────────────────────────────────────────────────
122
- RUN printf '%s\n' \
123
- '#!/bin/sh' \
124
- 'set -e' \
125
- '' \
126
- 'mkdir -p /data/persist' \
127
- '' \
128
- '# ── HELPER: auto-detect and fix /data/persist dir ────────────────────' \
129
- 'fix_backup() {' \
130
- ' DEST="$1"' \
131
- ' if [ -L "$DEST" ]; then' \
132
- ' # Old broken symlink from previous method — remove it' \
133
- ' echo "▶ Old symlink detected at $DEST, removing..."' \
134
- ' rm -f "$DEST"' \
135
- ' elif [ -d "$DEST" ]; then' \
136
- ' # Real folder but may have bad permissions — try to fix' \
137
- ' chmod -R u+rwX "$DEST" 2>/dev/null || {' \
138
- ' # Cannot fix permissions — rebuild it' \
139
- ' echo "▶ Bad permissions at $DEST, rebuilding..."' \
140
- ' rm -rf "$DEST"' \
141
- ' }' \
142
- ' fi' \
143
- '}' \
144
- '' \
145
- '# ── Step 1: AUTO-FIX any bad backup state ────────────────────────────' \
146
- 'fix_backup /data/persist/venv' \
147
- 'fix_backup /data/persist/cache' \
148
- '' \
149
- '# ── Step 2: RESTORE — /data/persist → /root/ ────────────────────────' \
150
- '# /root/ is always the real live directory' \
151
- '# Restore from backup only what is missing in /root/' \
152
- 'if [ -d "/data/persist/venv" ]; then' \
153
- ' echo "▶ Restoring venv from backup..."' \
154
- ' rsync -a --ignore-existing /data/persist/venv/ /root/venv/' \
155
- 'else' \
156
- ' echo "▶ No venv backup found, using image default"' \
157
- 'fi' \
158
- 'if [ -d "/data/persist/cache" ]; then' \
159
- ' echo "▶ Restoring cache from backup..."' \
160
- ' rsync -a --ignore-existing /data/persist/cache/ /root/.cache/' \
161
- 'fi' \
162
- '' \
163
- '# ── Step 3: Fix pip ──────────────────────────────────────────────────' \
164
- 'rm -f /root/venv/lib/python*/EXTERNALLY-MANAGED' \
165
- '' \
166
- '# ── Step 4: BACKUP — /root/ → /data/persist/ ────────────────────────' \
167
- '# Sync current /root/ state into backup (only changed files)' \
168
- 'echo "▶ Syncing /root/venv to backup..."' \
169
- 'rsync -a --delete /root/venv/ /data/persist/venv/' \
170
- 'rsync -a --delete /root/.cache/ /data/persist/cache/' \
171
- '' \
172
- '# ── Step 5: Background sync every 60s ───────────────────────────────' \
173
- '# Catches pip installs or any changes while server is running' \
174
- '(' \
175
- ' while true; do' \
176
- ' sleep 60' \
177
- ' rsync -a --delete /root/venv/ /data/persist/venv/ 2>/dev/null' \
178
- ' rsync -a --delete /root/.cache/ /data/persist/cache/ 2>/dev/null' \
179
- ' done' \
180
- ') &' \
181
- '' \
182
- '# ── Step 6: apt.txt reinstall ────────────────────────────────────────' \
183
- 'APT_FILE="/data/apt.txt"' \
184
- 'if [ ! -f "$APT_FILE" ]; then touch "$APT_FILE"; fi' \
185
- 'if [ -s "$APT_FILE" ]; then' \
186
- ' echo "▶ Installing packages from apt.txt..."' \
187
- ' /usr/bin/apt-get update -qq' \
188
- ' while IFS= read -r pkg || [ -n "$pkg" ]; do' \
189
- ' pkg=$(echo "$pkg" | tr -d "[:space:]")' \
190
- ' [ -z "$pkg" ] && continue' \
191
- ' [ "${pkg#\#}" != "$pkg" ] && continue' \
192
- ' /usr/bin/apt-get install -y --no-install-recommends "$pkg" \' \
193
- ' && echo "✓ $pkg" \' \
194
- ' || echo "WARNING: Failed to install $pkg"' \
195
- ' done < "$APT_FILE"' \
196
- ' rm -rf /var/lib/apt/lists/*' \
197
- 'fi' \
198
- '' \
199
- 'exec "$@"' \
200
- > /usr/local/bin/docker-entrypoint.sh && \
201
- chmod +x /usr/local/bin/docker-entrypoint.sh
202
-
203
- # ── Runtime ───────────────────────────────────────────────────────────────────
204
- WORKDIR /data
205
- EXPOSE 7860
206
- ENV PORT=7860
207
-
208
- ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"]
209
- CMD ["node", "/root/app/app.js"]
 
1
+ START
2
+
3
+ ├── Step 1: RESTORE
4
+ │ /data/persist/venv ── /root/venv
5
+ │ (skip if no backup yet)
6
+
7
+ ├── Step 2: Fix pip
8
+ │ remove EXTERNALLY-MANAGED from /root/venv
9
+
10
+ ├── Step 3: WIPE & REBUILD backup
11
+ │ delete /data/persist/venv (old bad perms gone forever)
12
+ │ cp /root/venv → /data/persist/venv (fresh, correct perms)
13
+
14
+ ├── Step 4: Background sync every 60s
15
+ │ /root/venv → /data/persist/venv
16
+ │ (catches pip installs between restarts)
17
+
18
+ └── Step 5: apt.txt
19
+ reinstall all saved packages
20
+
21
+ /root/ = always live and main ✅
22
+ /data/ = always just a backup ✅
23
+ permissions error = impossible