chandrakant-s4 commited on
Commit
db63ade
·
verified ·
1 Parent(s): 178da90

Create Dockerfile

Browse files
Files changed (1) hide show
  1. Dockerfile +131 -0
Dockerfile ADDED
@@ -0,0 +1,131 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Use Node.js 22 as base image (required for n8n v1.x)
2
+ FROM node:22-bullseye
3
+
4
+ # Set working directory
5
+ WORKDIR /app
6
+
7
+ # Update system packages and install essential dependencies
8
+ RUN apt-get update && apt-get install -y \
9
+ python3 \
10
+ python3-pip \
11
+ curl \
12
+ git \
13
+ sqlite3 \
14
+ && rm -rf /var/lib/apt/lists/*
15
+
16
+ # Update npm to latest version
17
+ RUN npm install -g npm@latest
18
+
19
+ # Install n8n globally with specific version for stability
20
+ RUN npm install -g n8n@latest
21
+
22
+ # Create n8n data directory that will be persisted
23
+ RUN mkdir -p /data/.n8n
24
+
25
+ # Set proper permissions for the data directory
26
+ RUN chown -R node:node /data
27
+
28
+ # Create backup and restore scripts
29
+ RUN echo '#!/bin/bash\n\
30
+ # Backup script\n\
31
+ BACKUP_URL="https://api.github.com/gists"\n\
32
+ GITHUB_TOKEN="${GITHUB_TOKEN}"\n\
33
+ BACKUP_FILE="/tmp/n8n_backup.json"\n\
34
+ \n\
35
+ if [ -f "/data/.n8n/database.sqlite" ]; then\n\
36
+ echo "Creating backup..."\n\
37
+ # Export workflows and credentials\n\
38
+ n8n export:workflow --backup --output=/tmp/workflows.json 2>/dev/null || echo "No workflows to backup"\n\
39
+ n8n export:credentials --backup --output=/tmp/credentials.json 2>/dev/null || echo "No credentials to backup"\n\
40
+ \n\
41
+ # Create combined backup\n\
42
+ echo "{" > $BACKUP_FILE\n\
43
+ echo "\"workflows\": " >> $BACKUP_FILE\n\
44
+ cat /tmp/workflows.json 2>/dev/null || echo "[]" >> $BACKUP_FILE\n\
45
+ echo "," >> $BACKUP_FILE\n\
46
+ echo "\"credentials\": " >> $BACKUP_FILE\n\
47
+ cat /tmp/credentials.json 2>/dev/null || echo "[]" >> $BACKUP_FILE\n\
48
+ echo "}" >> $BACKUP_FILE\n\
49
+ \n\
50
+ # Upload to GitHub Gist if token is provided\n\
51
+ if [ ! -z "$GITHUB_TOKEN" ]; then\n\
52
+ curl -X POST \\\n\
53
+ -H "Authorization: token $GITHUB_TOKEN" \\\n\
54
+ -H "Content-Type: application/json" \\\n\
55
+ -d "{\\"description\\": \\"n8n backup $(date)\\", \\"public\\": false, \\"files\\": {\\"n8n_backup.json\\": {\\"content\\": \\"$(cat $BACKUP_FILE | sed '\''s/"/\\\\"/g'\'' | tr '\''\n'\'' '\'' '\'')\\"}}}" \\\n\
56
+ $BACKUP_URL\n\
57
+ echo "Backup uploaded to GitHub Gist"\n\
58
+ fi\n\
59
+ fi' > /backup.sh && chmod +x /backup.sh
60
+
61
+ RUN echo '#!/bin/bash\n\
62
+ # Restore script\n\
63
+ GITHUB_TOKEN="${GITHUB_TOKEN}"\n\
64
+ GIST_ID="${GIST_ID}"\n\
65
+ \n\
66
+ if [ ! -z "$GITHUB_TOKEN" ] && [ ! -z "$GIST_ID" ]; then\n\
67
+ echo "Restoring from GitHub Gist..."\n\
68
+ # Download backup from GitHub Gist\n\
69
+ curl -H "Authorization: token $GITHUB_TOKEN" \\\n\
70
+ "https://api.github.com/gists/$GIST_ID" | \\\n\
71
+ python3 -c "import sys, json; data=json.load(sys.stdin); print(data['\''files'\'']['\''n8n_backup.json'\'']['\''content'\''])" > /tmp/n8n_backup.json\n\
72
+ \n\
73
+ if [ -f "/tmp/n8n_backup.json" ] && [ -s "/tmp/n8n_backup.json" ]; then\n\
74
+ # Extract workflows and credentials\n\
75
+ python3 -c "import json; data=json.load(open('\''/tmp/n8n_backup.json'\'')); json.dump(data.get('\''workflows'\'', []), open('\''/tmp/workflows.json'\'', '\''w'\''))" 2>/dev/null\n\
76
+ python3 -c "import json; data=json.load(open('\''/tmp/n8n_backup.json'\'')); json.dump(data.get('\''credentials'\'', []), open('\''/tmp/credentials.json'\'', '\''w'\''))" 2>/dev/null\n\
77
+ \n\
78
+ # Wait for n8n to be ready then import\n\
79
+ sleep 10\n\
80
+ if [ -f "/tmp/workflows.json" ] && [ -s "/tmp/workflows.json" ]; then\n\
81
+ n8n import:workflow --input=/tmp/workflows.json 2>/dev/null || echo "Failed to import workflows"\n\
82
+ fi\n\
83
+ if [ -f "/tmp/credentials.json" ] && [ -s "/tmp/credentials.json" ]; then\n\
84
+ n8n import:credentials --input=/tmp/credentials.json 2>/dev/null || echo "Failed to import credentials"\n\
85
+ fi\n\
86
+ echo "Restore completed"\n\
87
+ fi\n\
88
+ fi' > /restore.sh && chmod +x /restore.sh
89
+
90
+ # Create startup script
91
+ RUN echo '#!/bin/bash\n\
92
+ # Initialize n8n data directory\n\
93
+ if [ ! -f "/data/.n8n/config" ]; then\n\
94
+ echo "Initializing n8n for first time..."\n\
95
+ # Run restore in background after n8n starts\n\
96
+ (/restore.sh) &\n\
97
+ fi\n\
98
+ \n\
99
+ # Start periodic backup (every 6 hours)\n\
100
+ (while true; do sleep 21600; /backup.sh; done) &\n\
101
+ \n\
102
+ # Start periodic API call to keep space alive\n\
103
+ (while true; do curl -s https://chandrakant-s4-n8n-duplicate.hf.space/ >/dev/null 2>&1; sleep 43200; done) &\n\
104
+ \n\
105
+ # Start n8n\n\
106
+ exec n8n' > /start.sh && chmod +x /start.sh
107
+
108
+ # Switch to node user for security
109
+ USER node
110
+
111
+ # Expose the required port for Hugging Face Spaces
112
+ EXPOSE 7860
113
+
114
+ # Set environment variables for n8n on Hugging Face Spaces
115
+ ENV PORT=7860 \
116
+ N8N_HOST=0.0.0.0 \
117
+ N8N_PORT=7860 \
118
+ N8N_LISTEN_ADDRESS=0.0.0.0 \
119
+ N8N_PROTOCOL=https \
120
+ N8N_EDITOR_BASE_URL=https://chandrakant-s4-auto-dm.hf.space \
121
+ WEBHOOK_URL=https://chandrakant-s4-auto-dm.hf.space \
122
+ N8N_DISABLE_UI=false \
123
+ N8N_BASIC_AUTH_ACTIVE=false \
124
+ N8N_METRICS=false \
125
+ N8N_DIAGNOSTICS_ENABLED=false \
126
+ NODE_ENV=production \
127
+ N8N_RUNNERS_ENABLED=true \
128
+ N8N_USER_FOLDER=/data/.n8n
129
+
130
+ # Start the application
131
+ CMD ["/start.sh"]