FROM codercom/code-server:latest USER root RUN apt-get update && apt-get install -y \ tzdata \ && rm -rf /var/lib/apt/lists/* ENV TZ=Europe/Oslo RUN mkdir -p /data # Короткий промпт RUN echo "export PS1='\[\033[01;32m\]farid\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '" >> /home/coder/.bashrc && \ chown coder:coder /home/coder/.bashrc # Скрипт сохранения HOME (весь /home/coder — конфиги, vscode, extensions, opencode и т.д.) RUN cat <<'EOF' > /usr/local/bin/home-save #!/bin/sh set -e tar -czpf /data/home-backup.tar.gz.tmp -C /home/coder . mv /data/home-backup.tar.gz.tmp /data/home-backup.tar.gz EOF # Скрипт восстановления HOME RUN cat <<'EOF' > /usr/local/bin/home-restore #!/bin/sh set -e if [ -f /data/home-backup.tar.gz ]; then tar -xzpf /data/home-backup.tar.gz -C /home/coder fi EOF # Демон: бэкап каждый день в 04:00 по Europe/Oslo RUN cat <<'EOF' > /usr/local/bin/home-save-daemon #!/bin/sh LOG=/data/home-backup.log while true; do now=$(date +%s) next=$(date -d "today 04:00:00" +%s) if [ "$next" -le "$now" ]; then next=$(date -d "tomorrow 04:00:00" +%s) fi sleep "$((next - now))" { echo "[$(date '+%Y-%m-%d %H:%M:%S %Z')] scheduled backup"; home-save; } >> "$LOG" 2>&1 done EOF RUN chmod +x /usr/local/bin/home-save /usr/local/bin/home-restore /usr/local/bin/home-save-daemon USER coder WORKDIR /home/coder EXPOSE 7860 # Сбрасываем entrypoint базового образа — иначе CMD ниже игнорируется ENTRYPOINT [] CMD ["/bin/sh", "-c", "\ mkdir -p /data; \ mkdir -p /home/coder/.vscode/user-data /home/coder/.vscode/extensions; \ home-restore; \ home-save-daemon & \ code-server \ --bind-addr 0.0.0.0:7860 \ --auth password \ --config /home/coder/.vscode/config.yaml \ --user-data-dir /home/coder/.vscode/user-data \ --extensions-dir /home/coder/.vscode/extensions \ /home/coder & \ CODE_PID=$!; \ trap 'echo [$(date \"+%Y-%m-%d %H:%M:%S %Z\")] shutdown signal, saving >> /data/home-backup.log; home-save; kill -TERM $CODE_PID 2>/dev/null; wait $CODE_PID' TERM INT; \ wait $CODE_PID \ "]