| 
									
										
										
										
											2024-12-09 21:04:03 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   config, | 
					
						
							|  |  |  |   lib, | 
					
						
							|  |  |  |   pkgs, | 
					
						
							|  |  |  |   ... | 
					
						
							|  |  |  | }: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | with lib; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | let | 
					
						
							| 
									
										
										
										
											2025-03-05 15:09:06 +00:00
										 |  |  |   cfg = config.nixosModules.tubearchivist-container; | 
					
						
							| 
									
										
										
										
											2024-12-09 21:04:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-01 14:45:03 +00:00
										 |  |  |   port = 8085; | 
					
						
							| 
									
										
										
										
											2025-02-02 11:08:17 +00:00
										 |  |  |   url = "tubearchivist.oliverdavies.uk"; | 
					
						
							| 
									
										
										
										
											2024-12-09 21:04:03 +00:00
										 |  |  | in | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2025-03-05 15:09:06 +00:00
										 |  |  |   options.nixosModules.tubearchivist-container = { | 
					
						
							| 
									
										
										
										
											2024-12-09 21:04:03 +00:00
										 |  |  |     enable = mkEnableOption "Enable the tubearchivist-container service."; | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   config = mkIf cfg.enable { | 
					
						
							|  |  |  |     virtualisation.docker = { | 
					
						
							|  |  |  |       enable = true; | 
					
						
							|  |  |  |       autoPrune.enable = true; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     virtualisation.oci-containers.backend = "docker"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     virtualisation.oci-containers.containers."archivist-es" = { | 
					
						
							|  |  |  |       image = "bbilly1/tubearchivist-es"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       environment = { | 
					
						
							|  |  |  |         "ES_JAVA_OPTS" = "-Xms1g -Xmx1g"; | 
					
						
							|  |  |  |         "discovery.type" = "single-node"; | 
					
						
							|  |  |  |         "path.repo" = "/usr/share/elasticsearch/data/snapshot"; | 
					
						
							|  |  |  |         "xpack.security.enabled" = "true"; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-09 22:35:34 +00:00
										 |  |  |       environmentFiles = [ | 
					
						
							|  |  |  |         config.age.secrets.tubearchivist.path | 
					
						
							|  |  |  |       ]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-09 21:04:03 +00:00
										 |  |  |       volumes = [ | 
					
						
							|  |  |  |         "tubearchivist_es:/usr/share/elasticsearch/data:rw" | 
					
						
							|  |  |  |       ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       log-driver = "journald"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       extraOptions = [ | 
					
						
							|  |  |  |         "--network-alias=archivist-es" | 
					
						
							|  |  |  |         "--network=tubearchivist_default" | 
					
						
							|  |  |  |       ]; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     systemd.services."docker-archivist-es" = { | 
					
						
							|  |  |  |       serviceConfig = { | 
					
						
							|  |  |  |         Restart = mkOverride 90 "always"; | 
					
						
							|  |  |  |         RestartMaxDelaySec = mkOverride 90 "1m"; | 
					
						
							|  |  |  |         RestartSec = mkOverride 90 "100ms"; | 
					
						
							|  |  |  |         RestartSteps = mkOverride 90 9; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       after = [ | 
					
						
							|  |  |  |         "docker-network-tubearchivist_default.service" | 
					
						
							|  |  |  |         "docker-volume-tubearchivist_es.service" | 
					
						
							|  |  |  |       ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       requires = [ | 
					
						
							|  |  |  |         "docker-network-tubearchivist_default.service" | 
					
						
							|  |  |  |         "docker-volume-tubearchivist_es.service" | 
					
						
							|  |  |  |       ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       partOf = [ | 
					
						
							|  |  |  |         "docker-compose-tubearchivist-root.target" | 
					
						
							|  |  |  |       ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       wantedBy = [ | 
					
						
							|  |  |  |         "docker-compose-tubearchivist-root.target" | 
					
						
							|  |  |  |       ]; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     virtualisation.oci-containers.containers."archivist-redis" = { | 
					
						
							|  |  |  |       image = "redis/redis-stack-server"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       volumes = [ | 
					
						
							|  |  |  |         "tubearchivist_redis:/data:rw" | 
					
						
							|  |  |  |       ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       dependsOn = [ | 
					
						
							|  |  |  |         "archivist-es" | 
					
						
							|  |  |  |       ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       log-driver = "journald"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       extraOptions = [ | 
					
						
							|  |  |  |         "--network-alias=archivist-redis" | 
					
						
							|  |  |  |         "--network=tubearchivist_default" | 
					
						
							|  |  |  |       ]; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     systemd.services."docker-archivist-redis" = { | 
					
						
							|  |  |  |       serviceConfig = { | 
					
						
							|  |  |  |         Restart = mkOverride 90 "always"; | 
					
						
							|  |  |  |         RestartMaxDelaySec = mkOverride 90 "1m"; | 
					
						
							|  |  |  |         RestartSec = mkOverride 90 "100ms"; | 
					
						
							|  |  |  |         RestartSteps = mkOverride 90 9; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       after = [ | 
					
						
							|  |  |  |         "docker-network-tubearchivist_default.service" | 
					
						
							|  |  |  |         "docker-volume-tubearchivist_redis.service" | 
					
						
							|  |  |  |       ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       requires = [ | 
					
						
							|  |  |  |         "docker-network-tubearchivist_default.service" | 
					
						
							|  |  |  |         "docker-volume-tubearchivist_redis.service" | 
					
						
							|  |  |  |       ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       partOf = [ | 
					
						
							|  |  |  |         "docker-compose-tubearchivist-root.target" | 
					
						
							|  |  |  |       ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       wantedBy = [ | 
					
						
							|  |  |  |         "docker-compose-tubearchivist-root.target" | 
					
						
							|  |  |  |       ]; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     virtualisation.oci-containers.containers."tubearchivist" = { | 
					
						
							|  |  |  |       image = "bbilly1/tubearchivist"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       environment = { | 
					
						
							|  |  |  |         "ES_URL" = "http://archivist-es:9200"; | 
					
						
							|  |  |  |         "HOST_GID" = "1000"; | 
					
						
							|  |  |  |         "HOST_UID" = "1000"; | 
					
						
							|  |  |  |         "REDIS_HOST" = "archivist-redis"; | 
					
						
							| 
									
										
										
										
											2025-02-02 22:41:36 +00:00
										 |  |  |         "TA_HOST" = url; | 
					
						
							| 
									
										
										
										
											2024-12-09 22:35:34 +00:00
										 |  |  |         "TZ" = "Europe/London"; | 
					
						
							| 
									
										
										
										
											2024-12-09 21:04:03 +00:00
										 |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-09 22:35:34 +00:00
										 |  |  |       environmentFiles = [ | 
					
						
							|  |  |  |         config.age.secrets.tubearchivist.path | 
					
						
							|  |  |  |       ]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-09 21:04:03 +00:00
										 |  |  |       volumes = [ | 
					
						
							| 
									
										
										
										
											2025-02-02 22:41:36 +00:00
										 |  |  |         "/mnt/media/tubearchivist_cache:/cache:rw" | 
					
						
							|  |  |  |         "/mnt/media/tubearchivist_media:/youtube:rw" | 
					
						
							| 
									
										
										
										
											2024-12-09 21:04:03 +00:00
										 |  |  |       ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       ports = [ | 
					
						
							|  |  |  |         "${toString port}:8000/tcp" | 
					
						
							|  |  |  |       ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       dependsOn = [ | 
					
						
							|  |  |  |         "archivist-es" | 
					
						
							|  |  |  |         "archivist-redis" | 
					
						
							|  |  |  |       ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       log-driver = "journald"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       extraOptions = [ | 
					
						
							|  |  |  |         "--health-cmd=[\"curl\", \"-f\", \"http://localhost:8000/health\"]" | 
					
						
							|  |  |  |         "--health-interval=2m0s" | 
					
						
							|  |  |  |         "--health-retries=3" | 
					
						
							|  |  |  |         "--health-start-period=30s" | 
					
						
							|  |  |  |         "--health-timeout=10s" | 
					
						
							|  |  |  |         "--network-alias=tubearchivist" | 
					
						
							|  |  |  |         "--network=tubearchivist_default" | 
					
						
							|  |  |  |       ]; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     systemd.services."docker-tubearchivist" = { | 
					
						
							|  |  |  |       serviceConfig = { | 
					
						
							|  |  |  |         Restart = mkOverride 90 "always"; | 
					
						
							|  |  |  |         RestartMaxDelaySec = mkOverride 90 "1m"; | 
					
						
							|  |  |  |         RestartSec = mkOverride 90 "100ms"; | 
					
						
							|  |  |  |         RestartSteps = mkOverride 90 9; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       after = [ | 
					
						
							|  |  |  |         "docker-network-tubearchivist_default.service" | 
					
						
							|  |  |  |         "docker-volume-tubearchivist_cache.service" | 
					
						
							|  |  |  |         "docker-volume-tubearchivist_media.service" | 
					
						
							|  |  |  |       ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       requires = [ | 
					
						
							|  |  |  |         "docker-network-tubearchivist_default.service" | 
					
						
							|  |  |  |         "docker-volume-tubearchivist_cache.service" | 
					
						
							|  |  |  |         "docker-volume-tubearchivist_media.service" | 
					
						
							|  |  |  |       ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       partOf = [ | 
					
						
							|  |  |  |         "docker-compose-tubearchivist-root.target" | 
					
						
							|  |  |  |       ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       wantedBy = [ | 
					
						
							|  |  |  |         "docker-compose-tubearchivist-root.target" | 
					
						
							|  |  |  |       ]; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     systemd.services."docker-network-tubearchivist_default" = { | 
					
						
							|  |  |  |       path = [ pkgs.docker ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       serviceConfig = { | 
					
						
							|  |  |  |         Type = "oneshot"; | 
					
						
							|  |  |  |         RemainAfterExit = true; | 
					
						
							|  |  |  |         ExecStop = "docker network rm -f tubearchivist_default"; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       script = ''
 | 
					
						
							|  |  |  |         docker network inspect tubearchivist_default || docker network create tubearchivist_default | 
					
						
							|  |  |  |       '';
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       partOf = [ "docker-compose-tubearchivist-root.target" ]; | 
					
						
							|  |  |  |       wantedBy = [ "docker-compose-tubearchivist-root.target" ]; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     systemd.services."docker-volume-tubearchivist_cache" = { | 
					
						
							|  |  |  |       path = [ pkgs.docker ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       serviceConfig = { | 
					
						
							|  |  |  |         Type = "oneshot"; | 
					
						
							|  |  |  |         RemainAfterExit = true; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       script = ''
 | 
					
						
							|  |  |  |         docker volume inspect tubearchivist_cache || docker volume create tubearchivist_cache | 
					
						
							|  |  |  |       '';
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       partOf = [ "docker-compose-tubearchivist-root.target" ]; | 
					
						
							|  |  |  |       wantedBy = [ "docker-compose-tubearchivist-root.target" ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     }; | 
					
						
							| 
									
										
										
										
											2024-12-15 23:13:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-09 21:04:03 +00:00
										 |  |  |     systemd.services."docker-volume-tubearchivist_es" = { | 
					
						
							|  |  |  |       path = [ pkgs.docker ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       serviceConfig = { | 
					
						
							|  |  |  |         Type = "oneshot"; | 
					
						
							|  |  |  |         RemainAfterExit = true; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       script = ''
 | 
					
						
							|  |  |  |         docker volume inspect tubearchivist_es || docker volume create tubearchivist_es | 
					
						
							|  |  |  |       '';
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       partOf = [ "docker-compose-tubearchivist-root.target" ]; | 
					
						
							|  |  |  |       wantedBy = [ "docker-compose-tubearchivist-root.target" ]; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     systemd.services."docker-volume-tubearchivist_media" = { | 
					
						
							|  |  |  |       path = [ pkgs.docker ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       serviceConfig = { | 
					
						
							|  |  |  |         Type = "oneshot"; | 
					
						
							|  |  |  |         RemainAfterExit = true; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       script = ''
 | 
					
						
							|  |  |  |         docker volume inspect tubearchivist_media || docker volume create tubearchivist_media | 
					
						
							|  |  |  |       '';
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       partOf = [ "docker-compose-tubearchivist-root.target" ]; | 
					
						
							|  |  |  |       wantedBy = [ "docker-compose-tubearchivist-root.target" ]; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     systemd.services."docker-volume-tubearchivist_redis" = { | 
					
						
							|  |  |  |       path = [ pkgs.docker ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       serviceConfig = { | 
					
						
							|  |  |  |         Type = "oneshot"; | 
					
						
							|  |  |  |         RemainAfterExit = true; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       script = ''
 | 
					
						
							|  |  |  |         docker volume inspect tubearchivist_redis || docker volume create tubearchivist_redis | 
					
						
							|  |  |  |       '';
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       partOf = [ "docker-compose-tubearchivist-root.target" ]; | 
					
						
							|  |  |  |       wantedBy = [ "docker-compose-tubearchivist-root.target" ]; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     systemd.targets."docker-compose-tubearchivist-root" = { | 
					
						
							|  |  |  |       unitConfig = { | 
					
						
							|  |  |  |         Description = "Root target generated by compose2nix."; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       wantedBy = [ "multi-user.target" ]; | 
					
						
							|  |  |  |     }; | 
					
						
							| 
									
										
										
										
											2024-12-15 23:13:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-21 00:46:13 +00:00
										 |  |  |     services.caddy.virtualHosts."tubearchivist.oliverdavies.uk" = { | 
					
						
							|  |  |  |       useACMEHost = "oliverdavies.uk"; | 
					
						
							| 
									
										
										
										
											2024-12-15 23:13:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-01 14:45:03 +00:00
										 |  |  |       extraConfig = "reverse_proxy localhost:${toString port}"; | 
					
						
							| 
									
										
										
										
											2024-12-15 23:13:11 +00:00
										 |  |  |     }; | 
					
						
							| 
									
										
										
										
											2024-12-09 21:04:03 +00:00
										 |  |  |   }; | 
					
						
							|  |  |  | } |