1+ variable "remote_user" {
2+ type = string
3+ description = " The remote user to connect to the server."
4+ }
5+
6+ variable "ssh_url" {
7+ type = string
8+ description = " The SSH URL to connect to the remote server."
9+ }
10+
11+ variable "remote_directory" {
12+ type = string
13+ description = " The remote directory where the competition files will be copied."
14+ default = " /opt/progsoc/progcomp2025/competition"
15+ }
16+
117terraform {
218 required_providers {
319 docker = {
@@ -8,12 +24,12 @@ terraform {
824}
925
1026provider "docker" {
11- host = " ssh://sebas@speed "
27+ host = " ssh://${ var . ssh_url } "
1228 ssh_opts = [" -o" , " StrictHostKeyChecking=no" , " -o" , " UserKnownHostsFile=/dev/null" ]
1329}
1430
1531data "docker_registry_image" "fuzzjudge" {
16- name = " ghcr.io/progsoc/fuzzjudge:latest"
32+ name = " ghcr.io/progsoc/fuzzjudge:runtimes- latest"
1733}
1834
1935
@@ -22,52 +38,38 @@ resource "docker_image" "fuzzjudge" {
2238 pull_triggers = [data . docker_registry_image . fuzzjudge . sha256_digest ]
2339}
2440
25- resource "terraform_data" "remote_docker_build" {
26- depends_on = [ docker_image . fuzzjudge ]
41+ data "external" "competition_files_hash" {
42+ program = [" bash" ," ${ path . module } /hash.sh" ]
43+ query = {
44+ # command ignoring all .db and rust target directories
45+ hash = " "
46+ }
47+ }
48+
49+ resource "terraform_data" "copy_competition_files" {
2750 connection {
2851 type = " ssh"
2952 user = " sebas"
3053 host = " speed"
3154 }
3255
3356 provisioner "remote-exec" {
57+ // Make sure the directory exists
3458 inline = [
35- " mkdir -p /opt/services/progcomp2025" ,
36- " chmod 755 /opt/services/progcomp2025" ,
37- " chown sebas:sebas /opt/services/progcomp2025"
38- ]
39-
40- }
41-
42- provisioner "file" {
43- source = " ../Dockerfile"
44- destination = " /opt/services/progcomp2025/Dockerfile"
45- }
46-
47- provisioner "remote-exec" {
48- inline = [
49- " chmod 644 /opt/services/progcomp2025/competition" ,
50- " cd /opt/services/progcomp2025" ,
51- " docker build -t progcomp2025:latest ."
59+ " mkdir -p ${ var . remote_directory } " ,
60+ " chown -R ${ var . remote_user } :${ var . remote_user } ${ var . remote_directory } " ,
61+ " find ${ var . remote_directory } -type d -exec chmod 755 {} \\ ;" ,
62+ " find ${ var . remote_directory } -type f -exec chmod 644 {} \\ ;"
5263 ]
5364 }
54- }
55-
56- resource "docker_image" "progcomp" {
57- depends_on = [ terraform_data . remote_docker_build ]
58- name = " progcomp2025:latest"
59- }
6065
61- resource "terraform_data" "copy_competition_files" {
62- connection {
63- type = " ssh"
64- user = " sebas"
65- host = " speed"
66+ // remote exec rsync
67+ provisioner "local-exec" {
68+ command = " rsync -avz --delete --exclude='*.db' --exclude='target' ../competition/ ${ var . ssh_url } :${ var . remote_directory } "
6669 }
6770
68- provisioner "file" {
69- source = " ../competition/"
70- destination = " /opt/services/progcomp2025/competition"
71+ triggers_replace = {
72+ file_hash = data.external.competition_files_hash.result
7173 }
7274}
7375
@@ -78,21 +80,20 @@ variable "progcomp_env" {
7880 ]
7981}
8082
81-
8283resource "docker_container" "progcomp" {
84+ depends_on = [ terraform_data . copy_competition_files ]
8385 name = " progcomp2025"
84- image = docker_image. progcomp . image_id
86+ image = docker_image. fuzzjudge . image_id
8587 ports {
8688 internal = 1989
8789 external = 2025
8890 }
8991 volumes {
90- host_path = " /opt/services/progcomp2025/competition "
92+ host_path = var . remote_directory
9193 container_path = " /app/competition"
9294 }
9395
9496 env = var. progcomp_env
9597 restart = " always"
96-
9798}
9899
0 commit comments