{"id":42430450,"url":"https://github.com/snackk/awesome-media-center","last_synced_at":"2026-01-28T03:52:05.778Z","repository":{"id":92462143,"uuid":"161674837","full_name":"snackk/awesome-media-center","owner":"snackk","description":"Media center using docker-compose with Traefik, Portainer, Nextcloud, Emby, Jackett, Radarr, Sonarr.","archived":false,"fork":false,"pushed_at":"2025-11-05T13:51:19.000Z","size":58,"stargazers_count":12,"open_issues_count":1,"forks_count":4,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-11-05T15:24:19.078Z","etag":null,"topics":["docker","docker-compose","emby","nextcloud","nextcloud-docker","portainer","traefik"],"latest_commit_sha":null,"homepage":"","language":"Dockerfile","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/snackk.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2018-12-13T17:48:15.000Z","updated_at":"2025-11-05T13:51:22.000Z","dependencies_parsed_at":"2024-01-13T13:22:30.348Z","dependency_job_id":"9b34ef3d-1a67-449b-9cae-e50893845c4b","html_url":"https://github.com/snackk/awesome-media-center","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/snackk/awesome-media-center","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snackk%2Fawesome-media-center","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snackk%2Fawesome-media-center/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snackk%2Fawesome-media-center/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snackk%2Fawesome-media-center/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/snackk","download_url":"https://codeload.github.com/snackk/awesome-media-center/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snackk%2Fawesome-media-center/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28837307,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-28T02:10:51.810Z","status":"ssl_error","status_checked_at":"2026-01-28T02:10:50.806Z","response_time":57,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["docker","docker-compose","emby","nextcloud","nextcloud-docker","portainer","traefik"],"created_at":"2026-01-28T03:52:04.369Z","updated_at":"2026-01-28T03:52:05.772Z","avatar_url":"https://github.com/snackk.png","language":"Dockerfile","funding_links":[],"categories":[],"sub_categories":[],"readme":"## awesome-media-center\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://upload.wikimedia.org/wikipedia/commons/7/79/Docker_%28container_engine%29_logo.png\" alt=\"alt text\"\u003e\n\u003c/p\u003e\nMedia center using docker-compose with Traefik, Portainer, Nextcloud and Emby.\n\n## Overview\n\nTraefik acts as a reverse proxy to expose the running docker containers, exposes ports 80 and 443. Port 80 redirects all the requests to 443, to enforce HTTPS. Services are registered as dynamic DNS entries in the host machine, that maps a subdomain for the respective container ip. Additionally, each service is SSL certified, managed by Traefik using Letsencrypt.\n\n## Prerequisites\n\n* Domain, with the subdomains registered\n* Server\n* Docker and docker compose\n\n## Installation\n\nEach of the services is represented by a docker stack, containing a *docker-compose.yml*. For the installation to be more manageable, the only two service deployed by docker cli are [traefik](#traefik) and [portainer](#portainer). The remaining services will be deployed using [portainer](#portainer) to easily manage the stacks.\n\nFirst, run trafik - traefik will expose all internal services that enable traefik in their configs:\n```sh\n$ cd trafik \u0026\u0026 docker compose up -d\n```\n\nNext, run the portainer:\n```sh\n$ cd portainer \u0026\u0026 docker compose up -d\n```\n\nWith portainer up and running, we can either add the stacks on portainer dashboard, by adding each of the docker-compose files, or by repeating the docker compose up on each of the services.\n\nAny issue with the installation should refer to the [problems](#problems) section.\n\n### \u003ca name=\"traefik\"\u003e\u003c/a\u003e Traefik\n\nOn the *docker-compose.yml* one should change the property *basicauth.users*. The password should be generated by *htpasswd*, and for each character \"$\" should be escaped by inserting another \"$\" character.\n\n#### Traefik upgrade\n\nTraefik is not managed by portainer, so we can't recreate the stack and pull the latest image, so we need to do it manually: \n```sh\n$ docker pull traefik\n$ cd traefik\n$ docker stop traefik\n$ docker rm traefik \n$ docker compose up -d\n```\n\n### \u003ca name=\"portainer\"\u003e\u003c/a\u003e Portainer\n\nLike Traefik, not managed by itself, so we need to manually recreate and pull the latest image:\n\n#### Portainer upgrade\n\n```sh\n$ docker pull portainer/portainer-ce\n$ cd portainer\n$ docker stop portainer\n$ docker rm portainer \n$ docker compose up -d\n```\n\n### Nextcloud\n\nShould be deployed using portainer under stacks.\n\nTo setup wizard requires the following credentials:\n* *user* - nextcloud\n* *password* - secret\n* *database* - nextcloud\n* *host* - db:3306\n\n#### Nextcloud upgrade\n\nSince nextcloud is managed by the Portainer, we could just recreate the stack, and portainer will automatically fetch the latest image and recreate it. \n\n```sh\n$ docker pull nextcloud/nextcloud\n$ cd nextcloud\n$ docker stop nextcloud\n$ docker rm nextcloud \n$ docker-compose up -d\n```\n\n### Emby\n\nShould be deployed using portainer under stacks.\n\nThe *UID* and *GID* on the environment are described in the section [User ID and Group ID](#user). \n\n#### Emby upgrade\n\nSince emby is managed by the Portainer, we could just recreate the stack, and portainer will automatically fetch the latest image and recreate it. \n\n```sh\n$ docker pull emby/emby\n$ cd emby\n$ docker stop emby\n$ docker rm emby \n$ docker compose up -d\n```\n\n#### Emby Backup\n\nThis step is recommended when changing the OS of the host machine / changing hardware parts.\nThis will backup the entire emby config and create a **backup.tar** file.\n```sh\n$ cd ~ \u0026\u0026 mkdir emby-backup \u0026\u0026 cd emby-backup\n$ docker run --rm --volumes-from emby -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /config\n```\n\n#### Emby Restore Backup\n\nIf you're using colima, please read through this first: [Additional config - Colima](#colima).\n\nFor Colima:\n\nAdditionally, you need to copy the generated emby-backup folder to `~/colima-data`.\n```sh\n$ docker run --rm --volumes-from emby -v ~/colima-data/emby-backup:/backup ubuntu bash -c \\\n  \"cd /config \u0026\u0026 tar xvf /backup/backup.tar --strip 1 \u0026\u0026 chown -R 501:20 /config\"\n```\n\nHere, you should make sure you've copied the emby-backup to the new host machine, and cd into it:\n```\n$ cd ~/Desktop/emby-backup\n$ docker run --rm --volumes-from emby -v $(pwd):/backup ubuntu bash -c \"cd /config \u0026\u0026 tar xvf /backup/backup.tar --strip 1\"\n```\n\n### Transmission\n\nShould be deployed using portainer under stacks.\n\nThe volumes should be changed to match the wanted mount. The *PUID* and *PGID* on the environment are described in the section [User ID and Group ID](#user).\n\n#### Transmission upgrade\n\nSince transmission is managed by the Portainer, we could just recreate the stack, and portainer will automatically fetch the latest image and recreate it. \n\n```sh\n$ docker pull transmission/transmission\n$ cd transmission\n$ docker stop transmission\n$ docker rm transmission \n$ docker compose up -d\n```\n\n### \u003ca name=\"colima\"\u003e\u003c/a\u003e Additional config - Colima\n\nBecause Colima doesn't automatically mount the host volumes, we need to manually add them to the VM config of Colima in order to use them.\nTo do that, you should add mount points to the Colima VM template:\n```\nsubl ~/.colima/default/colima.yaml\n```\nA folder should also exist on your home folder (`mkdir ~/colima-data`).\n\nexample:\n```\nmounts:\n  - location: /Volumes/Media\n    writable: true\n  - location: ~/colima-data\n    writab\n```\n\n### \u003ca name=\"user\"\u003e\u003c/a\u003e User ID and Group ID\n\nWith the user you're running docker run:\n```sh\n$ id -u\n```\nreturns UID for the user, and\n```sh\n$ id -g\n```\nreturns GID for the user.\n\n## \u003ca name=\"problems\"\u003e\u003c/a\u003e Problems\n\nPermissions on *data/acme.json* are too open then run:\n```sh\n$ chmod 600 acme.json\n```\n\n  Written by [@snackk](https://github.com/snackk)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsnackk%2Fawesome-media-center","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsnackk%2Fawesome-media-center","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsnackk%2Fawesome-media-center/lists"}