Copyparty is a lightweight Python-based file server that can run on almost any platform. Running it in a Docker container provides isolation, easy management, and portability. This guide covers Docker CLI, Docker Compose, and Portainer deployment options.

1. Prepare Configuration and Folders

Before running Copyparty, create the necessary directories and configuration files on your host.

Steps:

  1. Create a folder for configuration:
mkdir -p ~/copyparty-config
  1. Create or move your configuration file (config.conf) into that folder:
nano ~/copyparty-config/config.conf

Paste your Copyparty config:

[global]
  p: 8086, 3939
  e2dsa
  e2ts
  z, qr
  shr: /shr
  hist: /cfg/hists/
 
[accounts]
  exampleadmin: replacethispassword@124!
  viewer: welcome
  privateperson: coolpassword
 
[/]
  .
  accs:
    r: viewer
    rwmda: exampleadmin
    
[/priv]
  ./priv
  accs:
    rw: privateperson
    rwmda: exampleadmin
    
[/pubic]
  ./pubic
  accs:
    r: *
    rwmda: exampleadmin
  1. Create folder for session/history files:
mkdir -p ~/copyparty-config/hists
  1. Ensure proper permissions (Copyparty container runs as user 1000):
sudo chown -R 1000:1000 ~/copyparty-config
  1. Create a folder for media files (optional):
mkdir -p /mnt/media

2. Deploy Copyparty

You can deploy using Docker CLI, Docker Compose, or Portainer. All options use the same configuration and volume structure.

Option 1: Docker CLI

docker run -d \
  --name copyparty \
  -p 3939:3939 \
  -p 8086:8086 \
  -v ~/copyparty-config/config.conf:/cfg/config.conf:ro \
  -v ~/copyparty-config/hists:/cfg/hists \
  -v /mnt/media:/media \
  --user 1000 \
  --restart unless-stopped \
  copyparty/ac:latest

Notes:

  • -d → run container in background
  • -p → map host ports to container ports
  • -v → mount volumes (config read-only, history writable)
  • --user 1000 → match container user permissions
  • --restart unless-stopped → auto-restart container

Option 2: Docker Compose

Create a docker-compose.yml:

version: "3.8"
 
services:
  copyparty:
    image: copyparty/ac:latest
    container_name: copyparty
    ports:
      - "3939:3939"
      - "8086:8086"
    volumes:
      - ~/copyparty-config/config.conf:/cfg/config.conf:ro
      - ~/copyparty-config/hists:/cfg/hists
      - /mnt/media:/media
    restart: unless-stopped
    user: "1000"

Start the container:

docker-compose up -d

Option 3: Portainer Stack

  1. Log in to Portainer → go to Stacks → Add stack.
  2. Paste the following YAML:
version: "3.8"
 
services:
  copyparty:
    image: copyparty/ac:latest
    container_name: copyparty
    ports:
      - "3939:3939"
      - "8086:8086"
    volumes:
      - /root/copyparty-config/config.conf:/cfg/config.conf:ro
      - /root/copyparty-config/hists:/cfg/hists
      - /mnt/media:/media
    restart: unless-stopped
    user: "1000"
  1. Deploy the stack.

All three options produce the same result. Choose the method you’re most comfortable with.


3. Verify Deployment

  1. Check container logs (Portainer or CLI):
docker logs -f copyparty

You should see:

LOG: listening @ http://0.0.0.0:3939/
LOG: listening @ http://0.0.0.0:8086/
  1. Access Copyparty in a browser:
  • http://<server-ip>:3939/
  • http://<server-ip>:8086/
  1. Test user permissions according to your config.conf.

4. Tips & Notes

  • Editing config: Update ~/copyparty-config/config.conf on the host and restart container:
docker restart copyparty
  • Media folder: Mount your media directory as /media inside the container.
  • Permissions: Ensure folders are writable by user 1000.
  • Ports: Ensure config.conf ports match Docker/Portainer ports.

This article

I Basically just did all these steps and then let chatgpt summarize my journey.