How to Deploy social-auto-upload Using Docker: Complete Guide
Deploy social-auto-upload using Docker by building its multi-stage image that bundles the Vue.js frontend and Flask backend, then running it with volume mounts for persistent data on port 5409.
social-auto-upload is an open-source automation tool for uploading videos to social platforms using Playwright browser automation. The official Docker configuration packages the Vue.js frontend and Python Flask backend into a single container, eliminating the need to manage Node.js and Python environments separately. This guide explains the exact steps to build and run the container based on the repository's multi-stage Dockerfile.
Understanding the Multi-Stage Build Process
The Dockerfile in the repository root uses a two-stage build strategy to optimize image size and separate build dependencies from runtime requirements.
Stage 1: Building the Vue.js Frontend
The first stage starts from node:22.21.1 and compiles the frontend assets located in sau_frontend/. According to the source code at Dockerfile lines 1-20, this stage:
- Switches the npm registry to a China mirror for faster dependency downloads
- Installs Node.js dependencies and runs
npm run build - Generates static files (
index.htmland theassets/directory) for the Vue.js application
These compiled assets are preserved for the final stage using Docker's multi-stage copy mechanism.
Stage 2: Python Runtime and Playwright
The second stage uses python:3.10.19 as the base image. As implemented in Dockerfile lines 22-50, it installs:
- System libraries required for Playwright browser automation
- Python dependencies from
requirements.txtusing a Tsinghua PyPI mirror - Headless Chromium browser binaries for Playwright
The final image copies the entire repository into /app, imports the compiled frontend assets from Stage 1, creates the default configuration file, and exposes port 5409.
Building the Docker Image
Clone the repository and build the image from the project root:
git clone https://github.com/dreammis/social-auto-upload.git
cd social-auto-upload
docker build -t social-auto-upload:latest .
The build process takes several minutes as it compiles the Vue frontend and downloads Chromium for Playwright.
Running the Container
Basic Deployment
Run the container with port forwarding and persistent volumes:
# Create local directories for data persistence
mkdir -p data/videoFile data/cookiesFile data/db
docker run -d \
--name sau \
-p 5409:5409 \
-v "$(pwd)/data/videoFile":/app/videoFile \
-v "$(pwd)/data/cookiesFile":/app/cookiesFile \
-v "$(pwd)/data/db":/app/db \
social-auto-upload:latest
This command:
- Maps port 5409 on your host to the Flask server inside the container (as defined in
sau_backend.pylines 16-18) - Mounts three local directories to preserve uploaded videos, browser cookies, and the SQLite database across container restarts
- Runs in detached mode (
-d)
Custom Configuration Deployment
To override default settings such as LOCAL_CHROME_PATH, mount a custom configuration file:
docker run -d \
--name sau \
-p 5409:5409 \
-v "$(pwd)/data/videoFile":/app/videoFile \
-v "$(pwd)/data/cookiesFile":/app/cookiesFile \
-v "$(pwd)/data/db":/app/db \
-v "$(pwd)/my_conf.py":/app/conf.py \
social-auto-upload:latest
The container uses conf.example.py as a template during the build process (lines 52-64 of the Dockerfile), but a mounted conf.py takes precedence at runtime.
Understanding the Backend Entry Point
The container executes python sau_backend.py on startup. This Flask application:
- Serves the static Vue.js UI compiled during the build stage
- Handles file uploads to the
videoFiledirectory - Manages browser authentication cookies in
cookiesFile - Triggers video posting workflows via Playwright automation
The server listens on 0.0.0.0:5409, matching the port exposed in the Dockerfile.
Data Persistence Strategy
The application requires three persistent directories that must be mounted as volumes:
videoFile/: Stores uploaded video content before processingcookiesFile/: Persists browser session cookies for social media authenticationdb/: Contains the SQLite database initialized bydb/createTable.py
Without these volume mounts, uploaded files and login sessions disappear when the container stops.
Summary
- social-auto-upload uses a multi-stage Dockerfile combining Node.js (frontend) and Python (backend) into one image
- The container exposes port 5409 and runs
sau_backend.pyas the entry point - Always mount volumes for
/app/videoFile,/app/cookiesFile, and/app/dbto prevent data loss - Override configuration by mounting a custom
conf.pyfile to/app/conf.py - The image includes headless Chromium via Playwright for browser automation
Frequently Asked Questions
How do I change the default port mapping?
The Flask server inside the container always listens on port 5409 according to sau_backend.py. To run it on a different host port, modify the -p flag when running the container: use -p 8080:5409 to map host port 8080 to container port 5409.
Can I use an external Chrome installation instead of the bundled Chromium?
Yes. Set the LOCAL_CHROME_PATH variable in a custom conf.py file and mount it into the container at /app/conf.py. This overrides the default configuration from conf.example.py and points Playwright to your specified Chrome executable path.
Why does the build process use Chinese npm and PyPI mirrors?
The Dockerfile hardcodes registry mirrors (npm China mirror, Tsinghua PyPI) to improve build reliability and speed within mainland China networks. If you are building outside China and experience connectivity issues, you can modify the Dockerfile to remove or change these registry settings before building the image.
How do I check if the container is running properly?
Verify the container status with docker ps and inspect logs using docker logs sau. The Flask server should indicate it is running on 0.0.0.0:5409. Access the web interface by navigating to http://localhost:5409 in your browser, or use curl http://localhost:5409 to verify the endpoint responds.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →