mirror of
				https://github.com/9001/copyparty.git
				synced 2025-10-31 04:32:20 -06:00 
			
		
		
		
	Add setup example for running with Podman under systemd (#460)
* Create copyparty.container file * Add and document rootful configuration * Add non-root config, clean up README Signed-off-by: Daniel Lovegrove <d.lovegrove11@gmail.com>
This commit is contained in:
		
							parent
							
								
									a8f53d5ef0
								
							
						
					
					
						commit
						7fc379abc8
					
				|  | @ -213,6 +213,7 @@ you may also want these, especially on servers: | ||||||
| 
 | 
 | ||||||
| * [contrib/systemd/copyparty.service](contrib/systemd/copyparty.service) to run copyparty as a systemd service (see guide inside) | * [contrib/systemd/copyparty.service](contrib/systemd/copyparty.service) to run copyparty as a systemd service (see guide inside) | ||||||
| * [contrib/systemd/prisonparty.service](contrib/systemd/prisonparty.service) to run it in a chroot (for extra security) | * [contrib/systemd/prisonparty.service](contrib/systemd/prisonparty.service) to run it in a chroot (for extra security) | ||||||
|  | * [contrib/podman-systemd/](contrib/podman-systemd/) to run copyparty in a Podman container as a systemd service (see guide inside) | ||||||
| * [contrib/openrc/copyparty](contrib/openrc/copyparty) to run copyparty on Alpine / Gentoo | * [contrib/openrc/copyparty](contrib/openrc/copyparty) to run copyparty on Alpine / Gentoo | ||||||
| * [contrib/rc/copyparty](contrib/rc/copyparty) to run copyparty on FreeBSD | * [contrib/rc/copyparty](contrib/rc/copyparty) to run copyparty on FreeBSD | ||||||
| * [nixos module](#nixos-module) to run copyparty on NixOS hosts | * [nixos module](#nixos-module) to run copyparty on NixOS hosts | ||||||
|  |  | ||||||
							
								
								
									
										173
									
								
								contrib/podman-systemd/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										173
									
								
								contrib/podman-systemd/README.md
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,173 @@ | ||||||
|  | # copyparty with Podman and Systemd | ||||||
|  | 
 | ||||||
|  | Use this configuration if you want to run copyparty in a Podman container, with the reliability of running the container under a systemd service. | ||||||
|  | 
 | ||||||
|  | Documentation for `.container` files can be found in the [Container unit](https://docs.podman.io/en/latest/markdown/podman-systemd.unit.5.html#container-units-container) docs. Systemd does not understand `.container` files natively, so Podman converts these to `.service` files with a [systemd-generator](https://www.freedesktop.org/software/systemd/man/latest/systemd.generator.html). This process is transparent, but sometimes needs to be debugged in case your `.container` file is malformed. There are instructions to debug the systemd generator in the Troubleshooting section below. | ||||||
|  | 
 | ||||||
|  | To run copyparty in this way, you must already have podman installed. To install Podman, see: https://podman.io/docs/installation | ||||||
|  | 
 | ||||||
|  | There is a sample configuration file in the same directory as this file (`copyparty.conf`). | ||||||
|  | 
 | ||||||
|  | ## Run the container as root | ||||||
|  | 
 | ||||||
|  | Running the container as the root user is easy to set up, but less secure. There are instructions in the next section to run the container as a rootless user if you'd rather run the container like that. | ||||||
|  | 
 | ||||||
|  | First, change this line in the `copyparty.container` file to reflect the directory you want to share. By default, it shares `/mnt/` but you'll probably want to change that. | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | # Change /mnt to something you want to share | ||||||
|  | Volume=/mnt:/w:z | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | Note that you can select the owner and group of this volume by changing the `uid:` and `gid:` of the volume in `copyparty.conf`, but for simplicity let's assume you want it to be owned by `root:root`. | ||||||
|  | 
 | ||||||
|  | To install and start copyparty with Podman and systemd as the root user, run the following: | ||||||
|  | 
 | ||||||
|  | ```shell | ||||||
|  | sudo mkdir -pv /etc/systemd/container/ /etc/copyparty/ | ||||||
|  | sudo cp -v copyparty.container /etc/systemd/containers/ | ||||||
|  | sudo cp -v copyparty.conf /etc/copyparty/ | ||||||
|  | sudo systemctl daemon-reload | ||||||
|  | sudo systemctl start copyparty | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | Note: You can't "enable" this kind of Podman service. The `[Install]` section of the `.container` file effectively handles enabling the service so that it starts when the server reboots. | ||||||
|  | 
 | ||||||
|  | You can see the status of the service with: | ||||||
|  | 
 | ||||||
|  | ```shell | ||||||
|  | sudo systemctl status -a copyparty | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | You can see (and follow) the logs with either of these commands: | ||||||
|  | 
 | ||||||
|  | ```shell | ||||||
|  | sudo podman logs -f copyparty | ||||||
|  | 
 | ||||||
|  | # -a is required or else you'll get output like: copyparty[549025]: [649B blob data] | ||||||
|  | sudo journalctl -a -f -u copyparty | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | ## Run the container as a non-root user | ||||||
|  | 
 | ||||||
|  | This configuration is more secure, but is more involved and requires ensuring files have proper permissions. You will need a root user account to do some of this setup. | ||||||
|  | 
 | ||||||
|  | First, you need a user to run the container as. In this example we'll create a "podman" user with UID=1001 and GID=1001. | ||||||
|  | 
 | ||||||
|  | ```shell | ||||||
|  | sudo groupadd -g 1001 podman | ||||||
|  | sudo useradd -u 1001 -m podman | ||||||
|  | sudo usermod -aG podman podman | ||||||
|  | sudo loginctl enable-linger podman | ||||||
|  | # Set a strong password for this user | ||||||
|  | sudo -u podman passwd | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | The `enable-linger` command allows the podman user to run systemd user services that persist even when the user is not logged in. You could use a user that already exists in the system to run this service as, just make sure to run `loginctl enable-linger USERNAME` for that user. | ||||||
|  | 
 | ||||||
|  | Next, change these lines in the `copyparty.container` file to reflect the config directory and the directory you want to share. By default, the config shares `/home/podman/copyparty/sharing/` but you'll probably want to change this: | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | # Change to reflect your non-root user's home directory | ||||||
|  | Volume=/home/podman/copyparty/config:/cfg:z | ||||||
|  | 
 | ||||||
|  | # Change to the directory you want to share | ||||||
|  | Volume=/home/podman/copyparty/sharing:/w:z | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | Make sure the podman user has read/write access to both of these directories. | ||||||
|  | 
 | ||||||
|  | Next, **log in to the server as the podman user**. | ||||||
|  | 
 | ||||||
|  | To install and start copyparty as the non-root podman user, run the following: | ||||||
|  | 
 | ||||||
|  | ```shell | ||||||
|  | mkdir -pv /home/podman/.config/containers/systemd/ /home/podman/copyparty/config | ||||||
|  | cp -v copyparty.container /home/podman/.config/containers/systemd/copyparty.container | ||||||
|  | cp -v copyparty.conf /home/podman/copyparty/config | ||||||
|  | systemctl --user daemon-reload | ||||||
|  | systemctl --user start copyparty | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | **Important note: Never use `sudo` with `systemctl --user`!** | ||||||
|  | 
 | ||||||
|  | You can check the status of the user service with: | ||||||
|  | 
 | ||||||
|  | ```shell | ||||||
|  | systemctl --user status -a copyparty | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | You can see (and follow) the logs with: | ||||||
|  | 
 | ||||||
|  | ```shell | ||||||
|  | podman logs -f copyparty | ||||||
|  | 
 | ||||||
|  | journalctl --user -a -f -u copyparty | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | ## Troubleshooting | ||||||
|  | 
 | ||||||
|  | If the container fails to start, and you've modified the `.container` service, it's likely that your `.container` file failed to be translated into a `.service` file. You can debug the podman service generator with this command: | ||||||
|  | 
 | ||||||
|  | ```shell | ||||||
|  | sudo /usr/lib/systemd/system-generators/podman-system-generator --dryrun | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | ## Allowing Traffic from Outside your Server | ||||||
|  | 
 | ||||||
|  | To allow traffic on port 3923 of your server, you should run: | ||||||
|  | 
 | ||||||
|  | ```shell | ||||||
|  | sudo firewall-cmd --permanent --add-port=3923/tcp | ||||||
|  | sudo firewall-cmd --reload | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | Otherwise, you won't be able to access the copyparty server from anywhere other than the server itself. | ||||||
|  | 
 | ||||||
|  | ## Updating copyparty | ||||||
|  | 
 | ||||||
|  | To update the version of copyparty used in the container, you can: | ||||||
|  | 
 | ||||||
|  | ```shell | ||||||
|  | # If root: | ||||||
|  | sudo podman pull docker.io/copyparty/ac:latest | ||||||
|  | sudo systemctl restart copyparty | ||||||
|  | 
 | ||||||
|  | # If non-root: | ||||||
|  | podman pull docker.io/copyparty/ac:latest | ||||||
|  | systemctl --user restart copyparty | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | Or, you can change the pinned version of the image in the `[Container]` section of the `.container` file and run: | ||||||
|  | 
 | ||||||
|  | ```shell | ||||||
|  | # If root: | ||||||
|  | sudo systemctl daemon-reload | ||||||
|  | sudo systemctl restart copyparty | ||||||
|  | 
 | ||||||
|  | # If non-root: | ||||||
|  | systemctl --user daemon-reload | ||||||
|  | systemctl --user restart copyparty | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | Podman will pull the image you've specified when restarting. If you have it set to `:latest`, Podman does not know to re-pull the container. | ||||||
|  | 
 | ||||||
|  | ### Enabling auto-update | ||||||
|  | 
 | ||||||
|  | Alternatively, you can enable auto-updates by un-commenting this line: | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | # AutoUpdate=registry | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | You will also need to enable the [podman auto-updater service](https://docs.podman.io/en/latest/markdown/podman-auto-update.1.html) with: | ||||||
|  | 
 | ||||||
|  | ```shell | ||||||
|  | # If root: | ||||||
|  | sudo systemctl enable podman-auto-update.timer podman-auto-update.service | ||||||
|  | 
 | ||||||
|  | # If non-root: | ||||||
|  | systemctl --user enable podman-auto-update.timer podman-auto-update.service | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | This works best if you always want the latest version of copyparty. The auto-updater runs once every 24 hours. | ||||||
							
								
								
									
										36
									
								
								contrib/podman-systemd/copyparty.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								contrib/podman-systemd/copyparty.conf
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,36 @@ | ||||||
|  | [global] | ||||||
|  |   e2dsa  # enable file indexing and filesystem scanning | ||||||
|  |   e2ts   # and enable multimedia indexing | ||||||
|  |   ansi   # and colors in log messages | ||||||
|  | 
 | ||||||
|  |   # uncomment the line starting with q, lo: to log to a file instead of stdout/journalctl; | ||||||
|  |   # $LOGS_DIRECTORY is usually /var/log/copyparty (comes from systemd) | ||||||
|  |   # and copyparty replaces %Y-%m%d with Year-MonthDay, so the | ||||||
|  |   # full path will be something like /var/log/copyparty/2023-1130.txt | ||||||
|  |   # (note: enable compression by adding .xz at the end) | ||||||
|  |   # q, lo: $LOGS_DIRECTORY/%Y-%m%d.log | ||||||
|  | 
 | ||||||
|  |   # p: 80,443,3923   # listen on 80/443 as well (requires CAP_NET_BIND_SERVICE) | ||||||
|  |   # i: 127.0.0.1     # only allow connections from localhost (reverse-proxies) | ||||||
|  |   # ftp: 3921        # enable ftp server on port 3921 | ||||||
|  |   # p: 3939          # listen on another port | ||||||
|  |   # df: 16           # stop accepting uploads if less than 16 GB free disk space | ||||||
|  |   # ver              # show copyparty version in the controlpanel | ||||||
|  |   # grid             # show thumbnails/grid-view by default | ||||||
|  |   # theme: 2         # monokai | ||||||
|  |   # name: datasaver  # change the server-name that's displayed in the browser | ||||||
|  |   # stats, nos-dup   # enable the prometheus endpoint, but disable the dupes counter (too slow) | ||||||
|  |   # no-robots, force-js  # make it harder for search engines to read your server | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | [accounts] | ||||||
|  |   ed: wark  # username: password | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | [/]            # create a volume at "/" (the webroot), which will | ||||||
|  |   /w           # share the contents of the "/w" folder | ||||||
|  |   accs: | ||||||
|  |     rw: *      # everyone gets read-write access, but | ||||||
|  |     rwmda: ed  # the user "ed" gets read-write-move-delete-admin | ||||||
|  |     # uid: 1000  # If you're running as root, you can change the owner of this volume here | ||||||
|  |     # gid: 1000  # If you're running as root, you can change the group of this volume here | ||||||
							
								
								
									
										55
									
								
								contrib/podman-systemd/copyparty.container
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								contrib/podman-systemd/copyparty.container
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,55 @@ | ||||||
|  | [Container] | ||||||
|  | # It's recommended to replace :latest with a specific version | ||||||
|  | # for example: docker.io/copyparty/ac:1.19.15 | ||||||
|  | Image=docker.io/copyparty/ac:latest | ||||||
|  | ContainerName=copyparty | ||||||
|  | 
 | ||||||
|  | # Uncomment to enable auto-updates | ||||||
|  | # AutoUpdate=registry | ||||||
|  | 
 | ||||||
|  | # Environment variables | ||||||
|  | # enable mimalloc by replacing "NOPE" with "2" for a nice speed-boost (will use twice as much ram) | ||||||
|  | Environment=LD_PRELOAD=/usr/lib/libmimalloc-secure.so.NOPE | ||||||
|  | # ensures log-messages are not delayed (but can reduce speed a tiny bit) | ||||||
|  | Environment=PYTHONUNBUFFERED=1 | ||||||
|  | 
 | ||||||
|  | # Ports | ||||||
|  | PublishPort=3923:3923 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Volumes (PLEASE LOOK!) | ||||||
|  | 
 | ||||||
|  | # Rootful setup: | ||||||
|  | #   Leave as-is | ||||||
|  | # Non-root setup: | ||||||
|  | #   Change /etc/copyparty to /home/<USER>/copyparty/config | ||||||
|  | Volume=/etc/copyparty:/cfg:z | ||||||
|  | 
 | ||||||
|  | # Rootful setup: | ||||||
|  | #   Change /mnt to the directory you want to share | ||||||
|  | # Non-root setup: | ||||||
|  | #   Change /mnt to something owned by your user, e.g., /home/<USER>/copyparty/sharing:/w:z | ||||||
|  | Volume=/mnt:/w:z | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Give the container time to stop in case the thumbnailer is still running. | ||||||
|  | # It's allowed to continue finishing up for 10s after the shutdown signal, give it a 5s buffer | ||||||
|  | StopTimeout=15 | ||||||
|  | 
 | ||||||
|  | # hide it from logs with "/._" so it matches the default --lf-url filter | ||||||
|  | HealthCmd="wget --spider -q 127.0.0.1:3923/?reset=/._" | ||||||
|  | HealthInterval=1m | ||||||
|  | HealthTimeout=2s | ||||||
|  | HealthRetries=5 | ||||||
|  | HealthStartPeriod=15s | ||||||
|  | 
 | ||||||
|  | [Unit] | ||||||
|  | After=default.target | ||||||
|  | 
 | ||||||
|  | [Install] | ||||||
|  | # Start by default on boot | ||||||
|  | WantedBy=default.target | ||||||
|  | 
 | ||||||
|  | [Service] | ||||||
|  | # Give the container time to start in case it needs to pull the image | ||||||
|  | TimeoutStartSec=600 | ||||||
		Loading…
	
		Reference in a new issue