mirror of
https://github.com/factoriotools/factorio-docker.git
synced 2025-03-13 11:40:31 +01:00
Compare commits
334 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
83bffe4b13 | ||
|
14df05cd6d | ||
|
c0e1bae277 | ||
|
370059f2f6 | ||
|
7e8c89c02a | ||
|
1e52dc48c9 | ||
|
14aa945717 | ||
|
57bbf46196 | ||
|
090e771c0c | ||
|
9e89a7930e | ||
|
20e6176a85 | ||
|
e5e1993c97 | ||
|
6e0ea49985 | ||
|
f757e538b7 | ||
|
a94f8a0d4e | ||
|
2b76185f94 | ||
|
3c45811e15 | ||
|
8990021fa1 | ||
|
50e5c868e5 | ||
|
89aebaba4b | ||
|
d19c97c075 | ||
|
19e5dc7532 | ||
|
6a3b160d76 | ||
|
a3d5456e58 | ||
|
8d5096e28b | ||
|
a1135b6a55 | ||
|
192f686b6b | ||
|
66ce43c0ca | ||
|
ebadd1d8b8 | ||
|
c9989d3a07 | ||
|
2dfaac7ec4 | ||
|
c2d7c5696e | ||
|
f14bedbc63 | ||
|
d91c45fa62 | ||
|
2092e86aec | ||
|
ecb89b0c11 | ||
|
42a08a95d4 | ||
|
61d52eaa7c | ||
|
6916fcb150 | ||
|
8c9dfd004e | ||
|
867635db16 | ||
|
b7413607c4 | ||
|
5d6f70b285 | ||
|
a24e42b281 | ||
|
d1142e3408 | ||
|
4eb53b6e48 | ||
|
f986f1c870 | ||
|
bc760a9599 | ||
|
d153e30f1c | ||
|
cc5061d339 | ||
|
14ae422463 | ||
|
88ca95a1ae | ||
|
64980b9db3 | ||
|
85f8011105 | ||
|
cc8d89df84 | ||
|
956ade4f0b | ||
|
049d34ea9a | ||
|
d01580b5a5 | ||
|
25a283ad79 | ||
|
b172b16ff4 | ||
|
eb150cff0d | ||
|
b20d93e229 | ||
|
9562212254 | ||
|
6060c7b722 | ||
|
06baf6a186 | ||
|
6eb0cd96d8 | ||
|
bbbfef343c | ||
|
44a58b056c | ||
|
e37bcf1ed0 | ||
|
3defd74c46 | ||
|
dde2761a8c | ||
|
0ec91c3391 | ||
|
f9040c7450 | ||
|
c9957b7d76 | ||
|
89ae20012e | ||
|
d137f32c2f | ||
|
4f3c5f2e93 | ||
|
f7e9dea263 | ||
|
748dec4ad5 | ||
|
3ce89a714b | ||
|
a8ecb01f4c | ||
|
6692bb514d | ||
|
2d805feb4f | ||
|
bc2dc44cad | ||
|
04085ef23d | ||
|
fbb787e535 | ||
|
2ba59b4f95 | ||
|
c269289a96 | ||
|
ee0388e163 | ||
|
a1cb15b709 | ||
|
890489fb15 | ||
|
c756ffe827 | ||
|
4474b52473 | ||
|
84a808102f | ||
|
016c5cf3b5 | ||
|
159b14bd8e | ||
|
c1b0f6ca83 | ||
|
965fef7ac2 | ||
|
88fed07073 | ||
|
4ab4c889f4 | ||
|
bc28f4a917 | ||
|
d792589c56 | ||
|
486c0f1d0a | ||
|
80d8761520 | ||
|
f4e0e640c5 | ||
|
51b601b8b6 | ||
|
1d88d18b38 | ||
|
7d085d7fe5 | ||
|
630c5a1864 | ||
|
98d3e475d3 | ||
|
bd76f1c541 | ||
|
afde97243d | ||
|
81b476ac97 | ||
|
30e56a197c | ||
|
effd07f84c | ||
|
23d40f36de | ||
|
250a90de53 | ||
|
89f601e5ce | ||
|
73fe111bea | ||
|
18b455ba43 | ||
|
1c5e98f289 | ||
|
0a3d923c5b | ||
|
19f52a6ce0 | ||
|
f6461d99be | ||
|
f5a9224756 | ||
|
79eebfb0f9 | ||
|
b75bce7f91 | ||
|
ef449c4763 | ||
|
42c2d0f0b9 | ||
|
e2f732a61c | ||
|
d53f7900d8 | ||
|
abf3166142 | ||
|
f255b89a5e | ||
|
fd717ee1b1 | ||
|
551b748297 | ||
|
87403fdb1b | ||
|
882ad42893 | ||
|
f9c256e0e4 | ||
|
8f0e42ec25 | ||
|
6b92576644 | ||
|
2f51b1ae60 | ||
|
21fbb3f294 | ||
|
d5e3f1580b | ||
|
e3c1e34fe7 | ||
|
0fc0e18cb0 | ||
|
d634a84e0f | ||
|
ba5670692e | ||
|
ceea4e5dcb | ||
|
0f5d60d61c | ||
|
9171b1fd5d | ||
|
ced1340b11 | ||
|
d7e6952db8 | ||
|
24218ec31a | ||
|
5491f01acb | ||
|
3e8c2f5cb7 | ||
|
d306b82fbe | ||
|
bd1ba3cf9d | ||
|
dfd442dfda | ||
|
f262181b4e | ||
|
f7282c516c | ||
|
4fe8b3d0bd | ||
|
69e7d8ee55 | ||
|
d90480712d | ||
|
d74b635be5 | ||
|
0b5695e55a | ||
|
34bf552c2c | ||
|
bd048b90e2 | ||
|
771eb142f0 | ||
|
492b0378a3 | ||
|
2ac5f259fa | ||
|
5bf1b045e1 | ||
|
b09c5ab001 | ||
|
c6bf7fef1d | ||
|
626351232a | ||
|
db41eaad31 | ||
|
02695f0f00 | ||
|
5aef1b9f6f | ||
|
2f28ee6626 | ||
|
9912dbd9bb | ||
|
420fecc788 | ||
|
67bea4df99 | ||
|
b12e652e4d | ||
|
d0cfb691ec | ||
|
88757eb5d1 | ||
|
e365e2cd5e | ||
|
d7db07e265 | ||
|
e5aac5fc9e | ||
|
0f969e517a | ||
|
96d38bc3e8 | ||
|
4e43fdd73b | ||
|
b20ff166e7 | ||
|
e0165b4b2d | ||
|
bbfbb86308 | ||
|
0aae38e6a0 | ||
|
991d3e2765 | ||
|
e4ce42d9f3 | ||
|
157f9484db | ||
|
a8326cd88a | ||
|
1ebd9ced8d | ||
|
723160de54 | ||
|
cc96cf2294 | ||
|
79e22b8db5 | ||
|
5a03444010 | ||
|
43ce3dc8e1 | ||
|
97e1433fde | ||
|
f6aec0a546 | ||
|
039a8626ba | ||
|
634e7267a9 | ||
|
d1e5ac742e | ||
|
9eec6b9dd5 | ||
|
c8b079caf0 | ||
|
bce3ff95ba | ||
|
faa84dbfa6 | ||
|
8003142235 | ||
|
9863a4cd74 | ||
|
c5d668ac09 | ||
|
87a4ba87e5 | ||
|
9bdbd90322 | ||
|
4812b5b970 | ||
|
65e3f84c4f | ||
|
02cc66c3ba | ||
|
c09257d28a | ||
|
769617edc4 | ||
|
d6154359d9 | ||
|
765d2bb23d | ||
|
50d60680e0 | ||
|
0d5f77f0da | ||
|
0a56912cfd | ||
|
136329f45e | ||
|
f3dc109e7e | ||
|
f84fee3624 | ||
|
118f149aee | ||
|
60165855ff | ||
|
89b9851edb | ||
|
f2a5d6d075 | ||
|
5e018ca2ae | ||
|
0160889854 | ||
|
bc9276737b | ||
|
5e3943362b | ||
|
3778d6bb66 | ||
|
fbf430373d | ||
|
a495ac72cd | ||
|
17e84504cf | ||
|
cea55cda67 | ||
|
b0ad3fa036 | ||
|
1a6e902c6b | ||
|
dadf88d5e3 | ||
|
b065ecb257 | ||
|
f0b1ff342f | ||
|
9a563a35b8 | ||
|
75543ebbe6 | ||
|
d17a6e648e | ||
|
b96fb634b1 | ||
|
9248c57549 | ||
|
8641b6d34b | ||
|
aefd5339c6 | ||
|
504aa3a05a | ||
|
ccc7f5624a | ||
|
0336fbe3cf | ||
|
452aab7ffb | ||
|
a953759b96 | ||
|
f61abdc8b5 | ||
|
bb4d2d0154 | ||
|
f44f690b6a | ||
|
eadada76b9 | ||
|
45eb323d17 | ||
|
cad67f5d0b | ||
|
18fe336fb8 | ||
|
a7c9b3e1c8 | ||
|
2026cce01a | ||
|
7b7f47f464 | ||
|
1f83234834 | ||
|
bc06b94f38 | ||
|
3abd2d69fc | ||
|
63fc1066dc | ||
|
7f4e005b1a | ||
|
5222d392b1 | ||
|
be8c1b28a3 | ||
|
e5a70d4ada | ||
|
31448a0c06 | ||
|
6d2fcd5696 | ||
|
65b909310c | ||
|
e8fca26f7a | ||
|
6ce248eacb | ||
|
a683f67f86 | ||
|
b253a086cc | ||
|
36ecbb3de8 | ||
|
3bd6929ee7 | ||
|
cb4f36fc91 | ||
|
06433d2ba1 | ||
|
31a0c78ba6 | ||
|
29f5222c35 | ||
|
13ebf33867 | ||
|
3947458623 | ||
|
cb6eb6e519 | ||
|
9896b03e0a | ||
|
5176be56db | ||
|
72fdb9fc42 | ||
|
b0b62d5ba7 | ||
|
4f73862221 | ||
|
5b83699e5c | ||
|
511520c459 | ||
|
99db93d6f8 | ||
|
24825309c3 | ||
|
db25aab203 | ||
|
d10ec1e309 | ||
|
14851be061 | ||
|
1212e00fa3 | ||
|
c537410871 | ||
|
068b96ae2b | ||
|
9c3ec3c817 | ||
|
229f3d7fda | ||
|
248dab3db1 | ||
|
c25e2c8a1d | ||
|
4a84743920 | ||
|
cc4f8b192d | ||
|
acd9c559fb | ||
|
ff7074822b | ||
|
99100f8495 | ||
|
939827eb81 | ||
|
7c1406b38c | ||
|
5f7a32e492 | ||
|
a11cbbbf41 | ||
|
dac8e07016 | ||
|
63fcb292a8 | ||
|
2a313aa6d6 | ||
|
b5a6059386 | ||
|
5904849dbc | ||
|
1987d7b43a | ||
|
54b1a97074 | ||
|
ec1aef13d6 | ||
|
bc9ec68e87 | ||
|
51762ba589 | ||
|
dffc09f0ff |
11
.github/dependabot.yml
vendored
Normal file
11
.github/dependabot.yml
vendored
Normal file
@ -0,0 +1,11 @@
|
||||
version: 2
|
||||
updates:
|
||||
- package-ecosystem: "github-actions"
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: "daily"
|
||||
|
||||
- package-ecosystem: docker
|
||||
directory: "/docker"
|
||||
schedule:
|
||||
interval: "daily"
|
29
.github/workflows/docker-build.yml
vendored
Normal file
29
.github/workflows/docker-build.yml
vendored
Normal file
@ -0,0 +1,29 @@
|
||||
name: Docker build & push
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
paths:
|
||||
- buildinfo.json
|
||||
# workaround for #526
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v3
|
||||
|
||||
- name: build and push
|
||||
if: ${{ env.DOCKER_USERNAME != '' && env.DOCKER_PASSWORD != '' }}
|
||||
env:
|
||||
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
|
||||
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
|
||||
run: |
|
||||
./build.py --push-tags --multiarch
|
18
.github/workflows/docker-description.yml
vendored
18
.github/workflows/docker-description.yml
vendored
@ -1,17 +1,27 @@
|
||||
name: Docker build & push
|
||||
name: Docker Hub Description
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: master
|
||||
branches:
|
||||
- master
|
||||
paths:
|
||||
- README.md
|
||||
# workaround for #526
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
docker-description:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Docker Hub Description
|
||||
uses: peter-evans/dockerhub-description@v2.4.1
|
||||
uses: peter-evans/dockerhub-description@v4.0.0
|
||||
if: ${{ env.DOCKER_USERNAME != '' && env.DOCKER_PASSWORD != '' }}
|
||||
env:
|
||||
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
|
||||
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
|
||||
with:
|
||||
username: ${{ secrets.DOCKER_USERNAME }}
|
||||
password: ${{ secrets.DOCKER_PASSWORD }}
|
||||
|
53
.github/workflows/docker.yml
vendored
53
.github/workflows/docker.yml
vendored
@ -1,53 +0,0 @@
|
||||
name: Docker build & push
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
push:
|
||||
branches: master
|
||||
tags:
|
||||
- '*'
|
||||
|
||||
jobs:
|
||||
old-version:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
version: [ "1.0", "0.18", "0.17", "0.16", "0.15", "0.14" ]
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
- name: build
|
||||
env:
|
||||
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
|
||||
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
|
||||
VERSION_SHORT: ${{ matrix.version }}
|
||||
run: |
|
||||
./build.sh ${{ matrix.version }}
|
||||
|
||||
stable:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
- name: build
|
||||
env:
|
||||
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
|
||||
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
|
||||
EXTRA_TAG: stable,latest
|
||||
VERSION_SHORT: "1.1"
|
||||
run: |
|
||||
./build.sh $VERSION_SHORT
|
||||
|
||||
# experimental:
|
||||
# runs-on: ubuntu-latest
|
||||
# steps:
|
||||
# - name: Checkout
|
||||
# uses: actions/checkout@v2
|
||||
# - name: build
|
||||
# env:
|
||||
# DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
|
||||
# DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
|
||||
# EXTRA_TAG: latest
|
||||
# VERSION_SHORT: "1.2"
|
||||
# run: |
|
||||
# ./build.sh $VERSION_SHORT
|
11
.github/workflows/lint.yml
vendored
11
.github/workflows/lint.yml
vendored
@ -3,13 +3,16 @@ name: 'Linter'
|
||||
on:
|
||||
pull_request:
|
||||
push:
|
||||
branches: master
|
||||
branches:
|
||||
- master
|
||||
|
||||
jobs:
|
||||
shellcheck:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: shellcheck
|
||||
uses: reviewdog/action-shellcheck@v1
|
||||
with:
|
||||
@ -19,7 +22,9 @@ jobs:
|
||||
hadolint:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: hadolint
|
||||
uses: reviewdog/action-hadolint@v1
|
||||
with:
|
||||
|
21
.github/workflows/update.yml
vendored
Normal file
21
.github/workflows/update.yml
vendored
Normal file
@ -0,0 +1,21 @@
|
||||
name: Check Update
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: "0 * * * *"
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
check:
|
||||
runs-on: ubuntu-latest
|
||||
if: github.event_name != 'schedule' || (github.event_name == 'schedule' && github.repository == 'factoriotools/factorio-docker')
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
token: ${{ secrets.REPO_TOKEN }}
|
||||
|
||||
- name: Run update script
|
||||
run: ./update.sh
|
||||
shell: bash
|
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
# IDE
|
||||
.idea
|
@ -1,26 +0,0 @@
|
||||
FROM frolvlad/alpine-glibc:alpine-3.12
|
||||
|
||||
LABEL maintainer="https://github.com/factoriotools/factorio-docker"
|
||||
|
||||
ENV VERSION=0.14.23 \
|
||||
SHA1=6ef84341c6fc1cf45cfdd6acc8468aaa117b9e8a
|
||||
|
||||
RUN mkdir -p /opt \
|
||||
&& apk --no-cache add curl tini pwgen \
|
||||
&& curl -sSL https://www.factorio.com/get-download/$VERSION/headless/linux64 \
|
||||
-o /tmp/factorio_headless_x64_$VERSION.tar.gz \
|
||||
&& echo "$SHA1 /tmp/factorio_headless_x64_$VERSION.tar.gz" | sha1sum -c \
|
||||
&& tar xzf /tmp/factorio_headless_x64_$VERSION.tar.gz --directory /opt \
|
||||
&& rm /tmp/factorio_headless_x64_$VERSION.tar.gz \
|
||||
&& apk del curl \
|
||||
&& ln -s /factorio/saves /opt/factorio/saves \
|
||||
&& ln -s /factorio/mods /opt/factorio/mods
|
||||
|
||||
VOLUME /factorio
|
||||
|
||||
EXPOSE 34197/udp 27015/tcp
|
||||
|
||||
COPY ./docker-entrypoint.sh /
|
||||
|
||||
ENTRYPOINT ["/sbin/tini", "--"]
|
||||
CMD ["/docker-entrypoint.sh"]
|
@ -1,2 +0,0 @@
|
||||
#!/bin/sh
|
||||
sudo docker build --no-cache -t factorio .
|
@ -1,2 +0,0 @@
|
||||
#!/bin/sh
|
||||
sudo rm -rf /tmp/factorio
|
@ -1,35 +0,0 @@
|
||||
#!/bin/sh -x
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
SAVES=/factorio/saves
|
||||
CONFIG=/factorio/config
|
||||
|
||||
mkdir -p "$SAVES"
|
||||
mkdir -p /factorio/mods
|
||||
mkdir -p "$CONFIG"
|
||||
|
||||
if [ ! -f $CONFIG/rconpw ]; then
|
||||
pwgen 15 1 >"$CONFIG/rconpw"
|
||||
fi
|
||||
|
||||
if [ ! -f "$CONFIG/server-settings.json" ]; then
|
||||
cp /opt/factorio/data/server-settings.example.json "$CONFIG/server-settings.json"
|
||||
fi
|
||||
|
||||
if [ ! -f "$CONFIG/map-gen-settings.json" ]; then
|
||||
cp /opt/factorio/data/map-gen-settings.example.json "$CONFIG/map-gen-settings.json"
|
||||
fi
|
||||
|
||||
if ! find -L "$SAVES" -iname \*.zip -mindepth 1 -print | grep -q .; then
|
||||
/opt/factorio/bin/x64/factorio \
|
||||
--create "$SAVES/_autosave1.zip" \
|
||||
--map-gen-settings "$CONFIG/map-gen-settings.json"
|
||||
fi
|
||||
|
||||
exec /opt/factorio/bin/x64/factorio \
|
||||
--port 34197 \
|
||||
--start-server-load-latest \
|
||||
--server-settings "$CONFIG/server-settings.json" \
|
||||
--rcon-port 27015 \
|
||||
--rcon-password "$(cat "$CONFIG/rconpw")"
|
@ -1,6 +0,0 @@
|
||||
#!/bin/sh
|
||||
sudo docker run --rm -it \
|
||||
-v /tmp/factorio:/factorio \
|
||||
--name factorio \
|
||||
factorio "$@"
|
||||
find /tmp/factorio -type f
|
@ -1,30 +0,0 @@
|
||||
FROM frolvlad/alpine-glibc:alpine-3.12
|
||||
|
||||
LABEL maintainer="https://github.com/factoriotools/factorio-docker"
|
||||
|
||||
ENV PORT=34197 \
|
||||
RCON_PORT=27015 \
|
||||
VERSION=0.15.40 \
|
||||
SHA1=f79a975f6b8c0ee87e2fa60f7d1f7133f332c3ec
|
||||
|
||||
RUN mkdir -p /opt \
|
||||
&& apk add --update --no-cache tini pwgen \
|
||||
&& apk add --update --no-cache --virtual .build-deps curl \
|
||||
&& curl -sSL https://www.factorio.com/get-download/$VERSION/headless/linux64 \
|
||||
-o /tmp/factorio_headless_x64_$VERSION.tar.xz \
|
||||
&& echo "$SHA1 /tmp/factorio_headless_x64_$VERSION.tar.xz" | sha1sum -c \
|
||||
&& tar xf /tmp/factorio_headless_x64_$VERSION.tar.xz --directory /opt \
|
||||
&& chmod -R ugo=rwx /opt/factorio \
|
||||
&& rm /tmp/factorio_headless_x64_$VERSION.tar.xz \
|
||||
&& ln -s /factorio/saves /opt/factorio/saves \
|
||||
&& ln -s /factorio/mods /opt/factorio/mods \
|
||||
&& apk del .build-deps
|
||||
|
||||
VOLUME /factorio
|
||||
|
||||
EXPOSE $PORT/udp $RCON_PORT/tcp
|
||||
|
||||
COPY ./docker-entrypoint.sh /
|
||||
|
||||
ENTRYPOINT ["/sbin/tini", "--"]
|
||||
CMD ["/docker-entrypoint.sh"]
|
@ -1,8 +0,0 @@
|
||||
version: '2'
|
||||
services:
|
||||
factorio:
|
||||
build: .
|
||||
ports:
|
||||
- "34197:34197"
|
||||
volumes:
|
||||
- /tmp/factorio:/factorio
|
@ -1,43 +0,0 @@
|
||||
#!/bin/sh -x
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
SAVES=/factorio/saves
|
||||
CONFIG=/factorio/config
|
||||
|
||||
mkdir -p "$SAVES"
|
||||
mkdir -p /factorio/mods
|
||||
mkdir -p "$CONFIG"
|
||||
|
||||
if [ ! -f "$CONFIG/rconpw" ]; then
|
||||
pwgen 15 1 >"$CONFIG/rconpw"
|
||||
fi
|
||||
|
||||
if [ ! -f "$CONFIG/server-settings.json" ]; then
|
||||
cp /opt/factorio/data/server-settings.example.json "$CONFIG/server-settings.json"
|
||||
fi
|
||||
|
||||
if [ ! -f "$CONFIG/map-gen-settings.json" ]; then
|
||||
cp /opt/factorio/data/map-gen-settings.example.json "$CONFIG/map-gen-settings.json"
|
||||
fi
|
||||
|
||||
if [ ! -f "$CONFIG/map-settings.json" ]; then
|
||||
cp /opt/factorio/data/map-settings.example.json "$CONFIG/map-settings.json"
|
||||
fi
|
||||
|
||||
if ! find -L "$SAVES" -iname \*.zip -mindepth 1 -print | grep -q .; then
|
||||
/opt/factorio/bin/x64/factorio \
|
||||
--create "$SAVES/_autosave1.zip" \
|
||||
--map-gen-settings "$CONFIG/map-gen-settings.json" \
|
||||
--map-settings "$CONFIG/map-settings.json"
|
||||
fi
|
||||
|
||||
exec /opt/factorio/bin/x64/factorio \
|
||||
--port "$PORT" \
|
||||
--start-server-load-latest \
|
||||
--server-settings "$CONFIG/server-settings.json" \
|
||||
--server-whitelist "$CONFIG/server-whitelist.json" \
|
||||
--server-banlist "$CONFIG/server-banlist.json" \
|
||||
--rcon-port "$RCON_PORT" \
|
||||
--rcon-password "$(cat "$CONFIG/rconpw")" \
|
||||
--server-id /factorio/config/server-id.json
|
@ -1,46 +0,0 @@
|
||||
FROM frolvlad/alpine-glibc:alpine-3.12
|
||||
|
||||
LABEL maintainer="https://github.com/factoriotools/factorio-docker"
|
||||
|
||||
ARG USER=factorio
|
||||
ARG GROUP=factorio
|
||||
ARG PUID=845
|
||||
ARG PGID=845
|
||||
|
||||
ENV PORT=34197 \
|
||||
RCON_PORT=27015 \
|
||||
VERSION=0.16.51 \
|
||||
SHA1=127e7ff484ab263b13615d6114013ce0a66ac929 \
|
||||
SAVES=/factorio/saves \
|
||||
CONFIG=/factorio/config \
|
||||
MODS=/factorio/mods \
|
||||
SCENARIOS=/factorio/scenarios \
|
||||
SCRIPTOUTPUT=/factorio/script-output \
|
||||
PUID="$PUID" \
|
||||
PGID="$PGID"
|
||||
|
||||
RUN mkdir -p /opt /factorio \
|
||||
&& apk add --update --no-cache pwgen su-exec shadow \
|
||||
&& apk add --update --no-cache --virtual .build-deps curl \
|
||||
&& curl -sSL https://www.factorio.com/get-download/$VERSION/headless/linux64 \
|
||||
-o /tmp/factorio_headless_x64_$VERSION.tar.xz \
|
||||
&& echo "$SHA1 /tmp/factorio_headless_x64_$VERSION.tar.xz" | sha1sum -c \
|
||||
&& tar xf /tmp/factorio_headless_x64_$VERSION.tar.xz --directory /opt \
|
||||
&& chmod ugo=rwx /opt/factorio \
|
||||
&& rm /tmp/factorio_headless_x64_$VERSION.tar.xz \
|
||||
&& ln -s $SAVES /opt/factorio/saves \
|
||||
&& ln -s $MODS /opt/factorio/mods \
|
||||
&& ln -s $SCENARIOS /opt/factorio/scenarios \
|
||||
&& ln -s $SCRIPTOUTPUT /opt/factorio/script-output \
|
||||
&& apk del .build-deps \
|
||||
&& addgroup -g $PGID -S $GROUP \
|
||||
&& adduser -u $PUID -G $GROUP -s /bin/sh -SDH $USER \
|
||||
&& chown -R $USER:$GROUP /opt/factorio /factorio
|
||||
|
||||
VOLUME /factorio
|
||||
|
||||
EXPOSE $PORT/udp $RCON_PORT/tcp
|
||||
|
||||
COPY files/ /
|
||||
|
||||
ENTRYPOINT ["/docker-entrypoint.sh"]
|
@ -1,9 +0,0 @@
|
||||
version: '2'
|
||||
services:
|
||||
factorio:
|
||||
build: .
|
||||
ports:
|
||||
- "34197:34197/udp"
|
||||
- "27015:27015/tcp"
|
||||
volumes:
|
||||
- /opt/factorio:/factorio
|
@ -1,62 +0,0 @@
|
||||
#!/bin/sh -x
|
||||
set -euo pipefail
|
||||
|
||||
id
|
||||
|
||||
FACTORIO_VOL=/factorio
|
||||
mkdir -p "$FACTORIO_VOL"
|
||||
mkdir -p "$SAVES"
|
||||
mkdir -p "$CONFIG"
|
||||
mkdir -p "$MODS"
|
||||
mkdir -p "$SCENARIOS"
|
||||
mkdir -p "$SCRIPTOUTPUT"
|
||||
|
||||
if [ ! -f "$CONFIG/rconpw" ]; then
|
||||
pwgen 15 1>"$CONFIG/rconpw"
|
||||
fi
|
||||
|
||||
if [ ! -f "$CONFIG/server-settings.json" ]; then
|
||||
cp /opt/factorio/data/server-settings.example.json "$CONFIG/server-settings.json"
|
||||
fi
|
||||
|
||||
if [ ! -f "$CONFIG/map-gen-settings.json" ]; then
|
||||
cp /opt/factorio/data/map-gen-settings.example.json "$CONFIG/map-gen-settings.json"
|
||||
fi
|
||||
|
||||
if [ ! -f "$CONFIG/map-settings.json" ]; then
|
||||
cp /opt/factorio/data/map-settings.example.json "$CONFIG/map-settings.json"
|
||||
fi
|
||||
|
||||
if find -L "$SAVES" -iname \*.tmp.zip -mindepth 1 -print | grep -q .; then
|
||||
rm -f "$SAVES"/*.tmp.zip
|
||||
fi
|
||||
|
||||
if [ "$(id -u)" = '0' ]; then
|
||||
# Update the User and Group ID based on the PUID/PGID variables
|
||||
usermod -o -u "$PUID" factorio
|
||||
groupmod -o -g "$PGID" factorio
|
||||
# Take ownership of factorio data if running as root
|
||||
chown -R factorio:factorio "$FACTORIO_VOL"
|
||||
# Drop to the factorio user
|
||||
SU_EXEC="su-exec factorio"
|
||||
else
|
||||
SU_EXEC=""
|
||||
fi
|
||||
|
||||
if ! find -L "$SAVES" -iname \*.zip -mindepth 1 -print | grep -q .; then
|
||||
$SU_EXEC /opt/factorio/bin/x64/factorio \
|
||||
--create "$SAVES/_autosave1.zip" \
|
||||
--map-gen-settings "$CONFIG/map-gen-settings.json" \
|
||||
--map-settings "$CONFIG/map-settings.json"
|
||||
fi
|
||||
|
||||
$SU_EXEC /opt/factorio/bin/x64/factorio \
|
||||
--port "$PORT" \
|
||||
--start-server-load-latest \
|
||||
--server-settings "$CONFIG/server-settings.json" \
|
||||
--server-whitelist "$CONFIG/server-whitelist.json" \
|
||||
--server-banlist "$CONFIG/server-banlist.json" \
|
||||
--rcon-port "$RCON_PORT" \
|
||||
--rcon-password "$(cat "$CONFIG/rconpw")" \
|
||||
--server-id /factorio/config/server-id.json \
|
||||
"$@"
|
@ -1,42 +0,0 @@
|
||||
#!/bin/sh -x
|
||||
if [ -z "$1" ]; then
|
||||
echo "No argument supplied"
|
||||
fi
|
||||
SERVER_SCENARIO=$1
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
id
|
||||
|
||||
mkdir -p "$SAVES"
|
||||
mkdir -p "$CONFIG"
|
||||
mkdir -p "$MODS"
|
||||
mkdir -p "$SCENARIOS"
|
||||
|
||||
#chown -R factorio /factorio
|
||||
|
||||
if [ ! -f "$CONFIG/rconpw" ]; then
|
||||
pwgen 15 1 >"$CONFIG/rconpw"
|
||||
fi
|
||||
|
||||
if [ ! -f "$CONFIG/server-settings.json" ]; then
|
||||
cp /opt/factorio/data/server-settings.example.json "$CONFIG/server-settings.json"
|
||||
fi
|
||||
|
||||
if [ ! -f "$CONFIG/map-gen-settings.json" ]; then
|
||||
cp /opt/factorio/data/map-gen-settings.example.json "$CONFIG/map-gen-settings.json"
|
||||
fi
|
||||
|
||||
if [ ! -f "$CONFIG/map-settings.json" ]; then
|
||||
cp /opt/factorio/data/map-settings.example.json "$CONFIG/map-settings.json"
|
||||
fi
|
||||
|
||||
exec /opt/factorio/bin/x64/factorio \
|
||||
--port "$PORT" \
|
||||
--start-server-load-scenario "$SERVER_SCENARIO" \
|
||||
--server-settings "$CONFIG/server-settings.json" \
|
||||
--server-whitelist "$CONFIG/server-whitelist.json" \
|
||||
--server-banlist "$CONFIG/server-banlist.json" \
|
||||
--rcon-port "$RCON_PORT" \
|
||||
--rcon-password "$(cat "$CONFIG/rconpw")" \
|
||||
--server-id /factorio/config/server-id.json
|
@ -1,29 +0,0 @@
|
||||
#!/bin/sh -x
|
||||
if [ -z "$1" ]; then
|
||||
echo "No argument supplied"
|
||||
fi
|
||||
SERVER_SCENARIO=$1
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
id
|
||||
|
||||
mkdir -p "$SAVES"
|
||||
mkdir -p "$CONFIG"
|
||||
mkdir -p "$MODS"
|
||||
mkdir -p "$SCENARIOS"
|
||||
|
||||
if [ ! -f "$CONFIG/server-settings.json" ]; then
|
||||
cp /opt/factorio/data/server-settings.example.json "$CONFIG/server-settings.json"
|
||||
fi
|
||||
|
||||
if [ ! -f "$CONFIG/map-gen-settings.json" ]; then
|
||||
cp /opt/factorio/data/map-gen-settings.example.json "$CONFIG/map-gen-settings.json"
|
||||
fi
|
||||
|
||||
if [ ! -f "$CONFIG/map-settings.json" ]; then
|
||||
cp /opt/factorio/data/map-settings.example.json "$CONFIG/map-settings.json"
|
||||
fi
|
||||
|
||||
exec /opt/factorio/bin/x64/factorio \
|
||||
--scenario2map "$SERVER_SCENARIO"
|
@ -1,45 +0,0 @@
|
||||
FROM frolvlad/alpine-glibc:alpine-3.12
|
||||
|
||||
LABEL maintainer="https://github.com/factoriotools/factorio-docker"
|
||||
|
||||
ARG USER=factorio
|
||||
ARG GROUP=factorio
|
||||
ARG PUID=845
|
||||
ARG PGID=845
|
||||
|
||||
ENV PORT=34197 \
|
||||
RCON_PORT=27015 \
|
||||
VERSION=0.17.79 \
|
||||
SHA1=7f127baf3cf01c6e545a9ca376dec1ac37468f8a \
|
||||
SAVES=/factorio/saves \
|
||||
CONFIG=/factorio/config \
|
||||
MODS=/factorio/mods \
|
||||
SCENARIOS=/factorio/scenarios \
|
||||
SCRIPTOUTPUT=/factorio/script-output \
|
||||
PUID="$PUID" \
|
||||
PGID="$PGID"
|
||||
|
||||
SHELL ["/bin/ash", "-eo", "pipefail", "-c"]
|
||||
RUN set -ox pipefail \
|
||||
&& archive="/tmp/factorio_headless_x64_$VERSION.tar.xz" \
|
||||
&& mkdir -p /opt /factorio \
|
||||
&& apk add --update --no-cache --no-progress bash binutils curl file gettext jq libintl pwgen shadow su-exec \
|
||||
&& curl -sSL "https://www.factorio.com/get-download/$VERSION/headless/linux64" -o "$archive" \
|
||||
&& echo "$SHA1 $archive" | sha1sum -c \
|
||||
|| (sha1sum "$archive" && file "$archive" && exit 1) \
|
||||
&& tar xf "$archive" --directory /opt \
|
||||
&& chmod ugo=rwx /opt/factorio \
|
||||
&& rm "$archive" \
|
||||
&& ln -s "$SCENARIOS" /opt/factorio/scenarios \
|
||||
&& ln -s "$SAVES" /opt/factorio/saves \
|
||||
&& mkdir -p /opt/factorio/config/ \
|
||||
&& addgroup -g "$PGID" -S "$GROUP" \
|
||||
&& adduser -u "$PUID" -G "$GROUP" -s /bin/sh -SDH "$USER" \
|
||||
&& chown -R "$USER":"$GROUP" /opt/factorio /factorio
|
||||
|
||||
COPY files/*.sh /
|
||||
COPY files/config.ini /opt/factorio/config/config.ini
|
||||
|
||||
VOLUME /factorio
|
||||
EXPOSE $PORT/udp $RCON_PORT/tcp
|
||||
ENTRYPOINT ["/docker-entrypoint.sh"]
|
@ -1,15 +0,0 @@
|
||||
version: '2'
|
||||
services:
|
||||
factorio:
|
||||
build: .
|
||||
ports:
|
||||
- "34197:34197/udp"
|
||||
- "27015:27015/tcp"
|
||||
volumes:
|
||||
- /opt/factorio:/factorio
|
||||
# environment:
|
||||
# - PUID=1000
|
||||
# - PGID=1000
|
||||
# - UPDATE_MODS_ON_START=true
|
||||
# - USERNAME=FactorioUsername
|
||||
# - TOKEN=FactorioToken
|
@ -1,714 +0,0 @@
|
||||
; version=5
|
||||
; This is INI file : https://en.wikipedia.org/wiki/INI_file#Format
|
||||
; Semicolons (;) at the beginning of the line indicate a comment. Comment lines are ignored.
|
||||
[path]
|
||||
read-data=__PATH__executable__/../../data
|
||||
write-data=__PATH__executable__/../..
|
||||
|
||||
[general]
|
||||
locale=
|
||||
|
||||
[other]
|
||||
; Options: true, false
|
||||
; verbose-logging=false
|
||||
|
||||
; Options: true, false
|
||||
; log-saving-statistics=false
|
||||
|
||||
; autosave-interval=5
|
||||
|
||||
; autosave-slots=3
|
||||
|
||||
; In ticks
|
||||
; minimum-latency-in-multiplayer=0
|
||||
|
||||
; In seconds
|
||||
; multiplayer-initial-connection-timeout=10
|
||||
|
||||
; port=34197
|
||||
|
||||
; max-map-preview-chunk-side=64
|
||||
|
||||
; max-map-preview-threads=7
|
||||
|
||||
; In bytes
|
||||
; max-multiplayer-script-reload-size=1048576
|
||||
|
||||
; Options: true, false
|
||||
; enable-steam-networking=true
|
||||
|
||||
; proxy=
|
||||
|
||||
; proxy-username=
|
||||
|
||||
; proxy-password=
|
||||
|
||||
; Options: true, false
|
||||
; check-updates=true
|
||||
|
||||
; Options: true, false
|
||||
; enable-experimental-updates=false
|
||||
|
||||
; Options: true, false
|
||||
; enable-new-mods=true
|
||||
|
||||
; Options: true, false
|
||||
; use-mod-settings-per-save=true
|
||||
|
||||
; Options: true, false
|
||||
; disable-minimal-mode=false
|
||||
|
||||
; Options: true, false
|
||||
; disable-blueprint-storage=false
|
||||
|
||||
; Disables tracking which mod created/changed what prototype. Mainly for faster startup during development.
|
||||
;
|
||||
; Options: true, false
|
||||
; disable-prototype-history=false
|
||||
|
||||
; Print a warning for all prototype values that were not accessed.
|
||||
;
|
||||
; Options: true, false
|
||||
; check-unused-prototype-data=false
|
||||
|
||||
; Options: true, false
|
||||
; enable-razer-chroma-support=true
|
||||
|
||||
; Options: true, false
|
||||
; enable-logitech-led-support=true
|
||||
|
||||
; Options: true, false
|
||||
; enable-crash-log-uploading=true
|
||||
|
||||
; Options: true, false
|
||||
; enable-heap-validation=true
|
||||
|
||||
; Options: true, false
|
||||
; enable-threaded-message-pump=true
|
||||
|
||||
; Options: true, false
|
||||
; enable-taskbar-animation=true
|
||||
|
||||
; Does nothing on Windows
|
||||
;
|
||||
; Options: true, false
|
||||
; non-blocking-saving=false
|
||||
|
||||
; Related to MacOS
|
||||
;
|
||||
; Options: true, false
|
||||
; discard-mouse-events-when-accessibility-zoomed=false
|
||||
|
||||
; Options: true, false
|
||||
; enable-blueprint-storage-cloud-sync=false
|
||||
|
||||
; Options: fast, maximum
|
||||
; multiplayer-compression-level=fast
|
||||
|
||||
; Options: none, fast, maximum
|
||||
; autosave-compression-level=fast
|
||||
|
||||
; Socket to host RCON on when lauching MP server from the menu.
|
||||
; local-rcon-socket=0.0.0.0:0
|
||||
|
||||
; Password for RCON when launching MP server from the menu.
|
||||
; local-rcon-password=
|
||||
|
||||
|
||||
[interface]
|
||||
; Options: true, false
|
||||
; automatic-ui-scale=true
|
||||
|
||||
; custom-ui-scale=1.000000
|
||||
|
||||
; tooltip-delay=0.040000
|
||||
|
||||
; entity-tooltip-delay=0.000000
|
||||
|
||||
; tooltip-offset=20
|
||||
|
||||
; output-console-delay=1200
|
||||
|
||||
; train-stop-label-angle=0.085526
|
||||
|
||||
; active-quick-bars=2
|
||||
|
||||
; shortcut-bar-rows=2
|
||||
|
||||
; Options: true, false
|
||||
; force-default-logistic-filter-count-to-one=false
|
||||
|
||||
; Options: true, false
|
||||
; autosort-inventory=true
|
||||
|
||||
; Options: true, false
|
||||
; research-finished-stops-game=false
|
||||
|
||||
; Options: true, false
|
||||
; use-item-groups=true
|
||||
|
||||
; Options: true, false
|
||||
; use-item-subgroups=true
|
||||
|
||||
; Options: true, false
|
||||
; use-version-filter-in-browse-games-gui=true
|
||||
|
||||
; Options: true, false
|
||||
; use-version-filter-in-install-mods-gui=true
|
||||
|
||||
; Options: true, false
|
||||
; play-sound-for-chat-messages=true
|
||||
|
||||
; Options: true, false
|
||||
; fuzzy-search-enabled=false
|
||||
|
||||
; Options: true, false
|
||||
; pick-ghost-cursor=false
|
||||
|
||||
; Options: true, false
|
||||
; show-minimap=true
|
||||
|
||||
; Options: true, false
|
||||
; show-tips-and-tricks=true
|
||||
|
||||
; Options: true, false
|
||||
; show-tutorial-notifications=true
|
||||
|
||||
; Options: true, false
|
||||
; show-turret-radius-when-blueprinting=false
|
||||
|
||||
; Options: true, false
|
||||
; show-item-labels-in-cursor=true
|
||||
|
||||
; Options: true, false
|
||||
; show-rail-block-visualization=true
|
||||
|
||||
; Options: true, false
|
||||
; show-missing-logistic-network-icon=true
|
||||
|
||||
; Options: true, false
|
||||
; show-interaction-indications=true
|
||||
|
||||
; Options: true, false
|
||||
; show-grid-when-paused=true
|
||||
|
||||
; Options: true, false
|
||||
; show-inserter-arrows-when-selected=true
|
||||
|
||||
; Options: true, false
|
||||
; show-inserter-arrows-when-detailed-info-is-on=false
|
||||
|
||||
; Options: true, false
|
||||
; show-pump-arrows-when-detailed-info-is-on=true
|
||||
|
||||
; Options: true, false
|
||||
; show-mining-drill-arrows-when-detailed-info-is-on=true
|
||||
|
||||
; Options: true, false
|
||||
; show-combinator-settings-when-detailed-info-is-on=false
|
||||
|
||||
; Options: true, false
|
||||
; entity-tooltip-on-the-side=true
|
||||
|
||||
; Options: true, false
|
||||
; show-mod-owners-in-tooltips=true
|
||||
|
||||
; Options: true, false
|
||||
; show-descriptions-in-tooltips=true
|
||||
|
||||
; Options: true, false
|
||||
; show-total-raw-in-recipe-tooltips=true
|
||||
|
||||
; debug-font-size=18
|
||||
|
||||
; train-visualization-length=5
|
||||
|
||||
|
||||
[sound]
|
||||
; master-volume=0.600000
|
||||
|
||||
; music-volume=0.400000
|
||||
|
||||
; game-effects-volume=0.700000
|
||||
|
||||
; gui-effects-volume=0.700000
|
||||
|
||||
; walking-sound-volume=0.300000
|
||||
|
||||
; environment-sounds-volume=0.450000
|
||||
|
||||
; alerts-volume=0.550000
|
||||
|
||||
; wind-volume=0.400000
|
||||
|
||||
; audible-distance=40.000000
|
||||
|
||||
; environment-audible-distance=15.000000
|
||||
|
||||
; maximum-environment-sounds=15
|
||||
|
||||
; active-gui-volume-modifier=1.000000
|
||||
|
||||
; active-gui-environment-volume-modifier=0.600000
|
||||
|
||||
; ambient-music-pause-mean-seconds=45.000000
|
||||
|
||||
; ambient-music-pause-variance-seconds=30.000000
|
||||
|
||||
; Options: main-tracks-only, interleave-main-tracks-with-interludes, randomize-all
|
||||
; ambient-music-mode=interleave-main-tracks-with-interludes
|
||||
|
||||
; zoom-audible-distance-coefficient=1.000000
|
||||
|
||||
; zoom-volume-coefficient=2.000000
|
||||
|
||||
|
||||
[map-view]
|
||||
; Options: true, false
|
||||
; show-logistic-network=false
|
||||
|
||||
; Options: true, false
|
||||
; show-electric-network=false
|
||||
|
||||
; Options: true, false
|
||||
; show-turret-range=false
|
||||
|
||||
; Options: true, false
|
||||
; show-pollution=true
|
||||
|
||||
; Options: true, false
|
||||
; show-networkless-logistic-members=false
|
||||
|
||||
; Options: true, false
|
||||
; show-train-station-names=true
|
||||
|
||||
; Options: true, false
|
||||
; show-player-names=true
|
||||
|
||||
; Options: true, false
|
||||
; show-non-standard-map-info=false
|
||||
|
||||
|
||||
[debug]
|
||||
; force=enemy
|
||||
|
||||
; Options: true, false
|
||||
; capture-perf-statistics=false
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-fps=debug
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-detailed-info=debug
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-time-usage=debug
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-gpu-time-usage=debug
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-sprite-counts=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-lua-object-statistics=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-multiplayer-waiting-icon=debug
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-multiplayer-statistics=debug
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-multiplayer-selection-rectangles=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-debug-info-in-tooltips=debug
|
||||
|
||||
; Options: always, debug, never
|
||||
; hide-mod-guis=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-tile-grid=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-collision-rectangles=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-selection-rectangles=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-render-rectangles=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-entity-positions=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-entity-velocities=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-selected-entity-advanced-tiles=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-selected-input-transport-belts=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-paths=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-path-requests=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-next-waypoint-bb=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-target=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-unit-group-info=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-unit-behavior-info=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-pathfinder-fringe=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-path-cache=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-path-cache-paths=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-rail-paths=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-rolling-stock-count=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-rail-connections=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-rail-joints=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-rail-signal-states=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-rail-segment-collision-boxes=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-train-stop-point=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-train-braking-distance=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-train-signals=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-train-repathing=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-network-connected-entities=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-circuit-network-numbers=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-energy-sources-networks=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-active-state=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-wakeup-lists=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-transport-lines=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-transport-line-gaps=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-pollution-values=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-active-entities-on-chunk-counts=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-active-chunks=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-polluted-chunks=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-enemy-expansion-candidate-chunks=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-enemy-expansion-candidate-chunk-values=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-bad-attack-chunks=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-tile-variations=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-raw-tile-transitions=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-fluid-box-fluid-info=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-environment-sound-info=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-logistic-robot-targets=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-logistic-robots-on-map=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-recipe-icons-on-map=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-player-robots=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-fire-info=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-sticker-info=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-decorative-names=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-decorative-collision-rectangles=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; allow-increased-zoom=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-chunk-components=never
|
||||
|
||||
|
||||
[multiplayer-lobby]
|
||||
; name=
|
||||
|
||||
; description=
|
||||
|
||||
; Options: true, false
|
||||
; visibility-public=true
|
||||
|
||||
; Options: true, false
|
||||
; visibility-steam=true
|
||||
|
||||
; Options: true, false
|
||||
; visibility-lan=true
|
||||
|
||||
; max-players=0
|
||||
|
||||
; Options: true, false
|
||||
; ignore-player-limit-when-returning=false
|
||||
|
||||
; max-upload-in-kilobytes-per-second=0
|
||||
|
||||
; max-upload-slots=5
|
||||
|
||||
; password=
|
||||
|
||||
; tag-list=
|
||||
|
||||
; afk-auto-kick=0
|
||||
|
||||
; Options: true, false, admins-only
|
||||
; allowed-commands=admins-only
|
||||
|
||||
; Options: true, false
|
||||
; only-admins-can-pause=true
|
||||
|
||||
; Options: true, false
|
||||
; autosave-only-on-server=true
|
||||
|
||||
; Options: true, false
|
||||
; non-blocking-saving=true
|
||||
|
||||
; Options: true, false
|
||||
; verify-user-identity=true
|
||||
|
||||
; Options: true, false
|
||||
; enable-whitelist=false
|
||||
|
||||
|
||||
[graphics]
|
||||
; lights-render-quality=0.250000
|
||||
|
||||
; Default preferred display index should force finding primary monitor
|
||||
; preferred-display-index=255
|
||||
|
||||
; screenshots-threads-count=8
|
||||
|
||||
; cache-sprite-atlas-count=1
|
||||
|
||||
; Options: true, false
|
||||
; cache-sprite-atlas=false
|
||||
|
||||
; Options: true, false
|
||||
; compress-sprite-atlas-cache=false
|
||||
|
||||
; Options: true, false
|
||||
; texture-streaming=true
|
||||
|
||||
; streamed-atlas-physical-vram-size=0
|
||||
|
||||
; sprite-vertex-buffer-size=1048576
|
||||
|
||||
; max-texture-size=0
|
||||
|
||||
; max-threads=8
|
||||
|
||||
; 'low' and 'very-low' options are deprecated and will be migrated to 'normal'
|
||||
;
|
||||
; Options: high, normal, low, very-low
|
||||
; graphics-quality=normal
|
||||
|
||||
; Options: true, false
|
||||
; full-screen=true
|
||||
|
||||
; Options: true, false
|
||||
; minimize-on-focus-loss=false
|
||||
|
||||
; Options: true, false
|
||||
; show-smoke=true
|
||||
|
||||
; Options: true, false
|
||||
; show-clouds=true
|
||||
|
||||
; Options: true, false
|
||||
; show-decoratives=true
|
||||
|
||||
; Options: true, false
|
||||
; show-item-shadows=true
|
||||
|
||||
; Options: true, false
|
||||
; show-inserter-shadows=true
|
||||
|
||||
; Options: true, false
|
||||
; force-opengl=false
|
||||
|
||||
; Options: true, false
|
||||
; v-sync=true
|
||||
|
||||
; Options: true, false
|
||||
; high-quality-animations=true
|
||||
|
||||
; Options: true, false
|
||||
; high-quality-shadows=false
|
||||
|
||||
; Options: true, false
|
||||
; high-quality-terrain=true
|
||||
|
||||
; Minimum number of turrets required to turn on the turret range overdraw optimization
|
||||
; turret-overdraw-minimum-count=4
|
||||
|
||||
; Scale at which the turret range overdraw optimization will start being applied
|
||||
; turret-overdraw-scale-threshold=0.200000
|
||||
|
||||
; Options: true, false
|
||||
; skip-vram-detection=false
|
||||
|
||||
; Options: true, false
|
||||
; halt-rendering-when-minimized=true
|
||||
|
||||
; Options: true, false
|
||||
; runtime-sprite-reload=false
|
||||
|
||||
; Options: true, false
|
||||
; full-color-depth=true
|
||||
|
||||
; Options: true, false
|
||||
; render-in-native-resolution=true
|
||||
|
||||
; Options: true, false
|
||||
; use-flip-presentation-model=false
|
||||
|
||||
; Options: true, false
|
||||
; debug-api=false
|
||||
|
||||
; Options: true, false
|
||||
; discard-buffers-on-begin-frame=true
|
||||
|
||||
; Options: all, high, medium, low
|
||||
; video-memory-usage=high
|
||||
|
||||
; Options: none, high-quality, low-quality
|
||||
; texture-compression-level=high-quality
|
||||
|
||||
; Options: true, false
|
||||
; compress-virtual-atlas=true
|
||||
|
||||
; Options: copy, copy-sequential, flip, flip-discard
|
||||
; dxgi-presentation-model=copy
|
||||
|
||||
; Options: none, flush, wait-for-vblank, flush-and-wait-for-vblank
|
||||
; dxgi-action-before-present=none
|
||||
|
||||
; relevant only for flip presentation models
|
||||
;
|
||||
; Options: true, false
|
||||
; dxgi-allow-tearing=false
|
||||
|
||||
; Options: false, true, auto
|
||||
; dxgi-flip-do-not-wait=false
|
||||
|
||||
; Options: true, false
|
||||
; dxgi-present-restart=false
|
||||
|
||||
; dxgi-swap-chain-buffer-count=0
|
||||
|
||||
; dxgi-max-frame-latency=0
|
||||
|
||||
; dxgi-adapter-index=-1
|
||||
|
||||
; max-sprite-loading-threads=32
|
||||
|
||||
; Options: true, false
|
||||
; gpu-accelerated-compression=true
|
||||
|
||||
; Options: true, false
|
||||
; gpu-accelerated-mipmap-compression=true
|
||||
|
||||
; Options: true, false
|
||||
; wait-until-mipmap-generation-finished=true
|
||||
|
||||
; Options: true, false
|
||||
; check-for-unused-pixels=false
|
||||
|
||||
; ogl-depth-buffer-bit-depth=0
|
||||
|
||||
; Options: false, true, auto
|
||||
; ogl-accelerated-renderer=auto
|
||||
|
||||
; Options: true, false
|
||||
; ogl-double-buffered=true
|
||||
|
||||
; Set to true if mipmapped sprites render very blurry on your GPU. Limited support.
|
||||
;
|
||||
; Options: true, false
|
||||
; legacy-gpu-no-mipmaps=false
|
||||
|
||||
; Options: true, false
|
||||
; force-linear-magnification=false
|
||||
|
||||
; Options: true, false
|
||||
; custom-mipmap-workaround=false
|
||||
|
||||
; Options: true, false
|
||||
; buffer-rename-workaround=false
|
||||
|
||||
; Comma separated list of OpenGL extensions that should not be used (for example: ARB_copy_image,KHR_debug)
|
||||
; disabled-opengl-extensions=
|
||||
|
||||
|
@ -1,98 +0,0 @@
|
||||
#!/bin/bash
|
||||
set -eoux pipefail
|
||||
|
||||
FACTORIO_VOL=/factorio
|
||||
LOAD_LATEST_SAVE="${LOAD_LATEST_SAVE:-true}"
|
||||
GENERATE_NEW_SAVE="${GENERATE_NEW_SAVE:-false}"
|
||||
SAVE_NAME="${SAVE_NAME:-""}"
|
||||
|
||||
mkdir -p "$FACTORIO_VOL"
|
||||
mkdir -p "$SAVES"
|
||||
mkdir -p "$CONFIG"
|
||||
mkdir -p "$MODS"
|
||||
mkdir -p "$SCENARIOS"
|
||||
mkdir -p "$SCRIPTOUTPUT"
|
||||
|
||||
if [[ ! -f $CONFIG/rconpw ]]; then
|
||||
# Generate a new RCON password if none exists
|
||||
pwgen 15 1 >"$CONFIG/rconpw"
|
||||
fi
|
||||
|
||||
if [[ ! -f $CONFIG/server-settings.json ]]; then
|
||||
# Copy default settings if server-settings.json doesn't exist
|
||||
cp /opt/factorio/data/server-settings.example.json "$CONFIG/server-settings.json"
|
||||
fi
|
||||
|
||||
if [[ ! -f $CONFIG/map-gen-settings.json ]]; then
|
||||
cp /opt/factorio/data/map-gen-settings.example.json "$CONFIG/map-gen-settings.json"
|
||||
fi
|
||||
|
||||
if [[ ! -f $CONFIG/map-settings.json ]]; then
|
||||
cp /opt/factorio/data/map-settings.example.json "$CONFIG/map-settings.json"
|
||||
fi
|
||||
|
||||
NRTMPSAVES=$( find -L "$SAVES" -iname \*.tmp.zip -mindepth 1 | wc -l )
|
||||
if [[ $NRTMPSAVES -gt 0 ]]; then
|
||||
# Delete incomplete saves (such as after a forced exit)
|
||||
rm -f "$SAVES"/*.tmp.zip
|
||||
fi
|
||||
|
||||
if [[ ${UPDATE_MODS_ON_START:-} == "true" ]]; then
|
||||
./docker-update-mods.sh
|
||||
fi
|
||||
|
||||
if [[ $(id -u) = 0 ]]; then
|
||||
# Update the User and Group ID based on the PUID/PGID variables
|
||||
usermod -o -u "$PUID" factorio
|
||||
groupmod -o -g "$PGID" factorio
|
||||
# Take ownership of factorio data if running as root
|
||||
chown -R factorio:factorio "$FACTORIO_VOL"
|
||||
# Drop to the factorio user
|
||||
SU_EXEC="su-exec factorio"
|
||||
else
|
||||
SU_EXEC=""
|
||||
fi
|
||||
|
||||
sed -i '/write-data=/c\write-data=\/factorio/' /opt/factorio/config/config.ini
|
||||
|
||||
NRSAVES=$(find -L "$SAVES" -iname \*.zip -mindepth 1 | wc -l)
|
||||
if [[ $GENERATE_NEW_SAVE != true && $NRSAVES == 0 ]]; then
|
||||
GENERATE_NEW_SAVE=true
|
||||
SAVE_NAME=_autosave1
|
||||
fi
|
||||
|
||||
if [[ $GENERATE_NEW_SAVE == true ]]; then
|
||||
if [[ -z "$SAVE_NAME" ]]; then
|
||||
echo "If \$GENERATE_NEW_SAVE is true, you must specify \$SAVE_NAME"
|
||||
exit 1
|
||||
fi
|
||||
if [[ -f "$SAVES/$SAVE_NAME.zip" ]]; then
|
||||
echo "Map $SAVES/$SAVE_NAME.zip already exists, skipping map generation"
|
||||
else
|
||||
$SU_EXEC /opt/factorio/bin/x64/factorio \
|
||||
--create "$SAVES/$SAVE_NAME.zip" \
|
||||
--map-gen-settings "$CONFIG/map-gen-settings.json" \
|
||||
--map-settings "$CONFIG/map-settings.json"
|
||||
fi
|
||||
fi
|
||||
|
||||
FLAGS=(\
|
||||
--port "$PORT" \
|
||||
--server-settings "$CONFIG/server-settings.json" \
|
||||
--server-banlist "$CONFIG/server-banlist.json" \
|
||||
--rcon-port "$RCON_PORT" \
|
||||
--server-whitelist "$CONFIG/server-whitelist.json" \
|
||||
--use-server-whitelist \
|
||||
--server-adminlist "$CONFIG/server-adminlist.json" \
|
||||
--rcon-password "$(cat "$CONFIG/rconpw")" \
|
||||
--server-id /factorio/config/server-id.json \
|
||||
)
|
||||
|
||||
if [[ $LOAD_LATEST_SAVE == true ]]; then
|
||||
FLAGS+=( --start-server-load-latest )
|
||||
else
|
||||
FLAGS+=( --start-server "$SAVE_NAME" )
|
||||
fi
|
||||
|
||||
# shellcheck disable=SC2086
|
||||
exec $SU_EXEC /opt/factorio/bin/x64/factorio "${FLAGS[@]}" "$@"
|
@ -1,44 +0,0 @@
|
||||
#!/bin/bash
|
||||
set -eoux pipefail
|
||||
|
||||
if [[ -z ${1:-} ]]; then
|
||||
echo "No argument supplied"
|
||||
fi
|
||||
|
||||
SERVER_SCENARIO="$1"
|
||||
mkdir -p "$SAVES"
|
||||
mkdir -p "$CONFIG"
|
||||
mkdir -p "$MODS"
|
||||
mkdir -p "$SCENARIOS"
|
||||
|
||||
#chown -R factorio /factorio
|
||||
|
||||
if [[ ! -f $CONFIG/rconpw ]]; then
|
||||
pwgen 15 1 >"$CONFIG/rconpw"
|
||||
fi
|
||||
|
||||
if [[ ! -f $CONFIG/server-settings.json ]]; then
|
||||
cp /opt/factorio/data/server-settings.example.json "$CONFIG/server-settings.json"
|
||||
fi
|
||||
|
||||
if [[ ! -f $CONFIG/map-gen-settings.json ]]; then
|
||||
cp /opt/factorio/data/map-gen-settings.example.json "$CONFIG/map-gen-settings.json"
|
||||
fi
|
||||
|
||||
if [[ ! -f $CONFIG/map-settings.json ]]; then
|
||||
cp /opt/factorio/data/map-settings.example.json "$CONFIG/map-settings.json"
|
||||
fi
|
||||
|
||||
exec /opt/factorio/bin/x64/factorio \
|
||||
--port "$PORT" \
|
||||
--start-server-load-scenario "$SERVER_SCENARIO" \
|
||||
--map-gen-settings "$CONFIG/map-gen-settings.json" \
|
||||
--map-settings "$CONFIG/map-settings.json" \
|
||||
--server-settings "$CONFIG/server-settings.json" \
|
||||
--server-banlist "$CONFIG/server-banlist.json" \
|
||||
--server-whitelist "$CONFIG/server-whitelist.json" \
|
||||
--use-server-whitelist \
|
||||
--server-adminlist "$CONFIG/server-adminlist.json" \
|
||||
--rcon-port "$RCON_PORT" \
|
||||
--rcon-password "$(cat "$CONFIG/rconpw")" \
|
||||
--server-id /factorio/config/server-id.json
|
@ -1,96 +0,0 @@
|
||||
#!/bin/bash
|
||||
set -eou pipefail
|
||||
|
||||
FACTORIO_VERSION=$1
|
||||
MOD_DIR=$2
|
||||
USERNAME=$3
|
||||
TOKEN=$4
|
||||
|
||||
MOD_BASE_URL="https://mods.factorio.com"
|
||||
|
||||
print_step()
|
||||
{
|
||||
echo "$1"
|
||||
}
|
||||
|
||||
print_success()
|
||||
{
|
||||
echo "$1"
|
||||
}
|
||||
|
||||
print_failure()
|
||||
{
|
||||
echo "$1"
|
||||
}
|
||||
|
||||
update_mod()
|
||||
{
|
||||
MOD_NAME="$1"
|
||||
MOD_NAME_ENCODED="${1// /%20}"
|
||||
|
||||
print_step "Checking for update of mod $MOD_NAME..."
|
||||
|
||||
MOD_INFO_URL="$MOD_BASE_URL/api/mods/$MOD_NAME_ENCODED"
|
||||
MOD_INFO_JSON=$(curl --silent "$MOD_INFO_URL")
|
||||
|
||||
if ! echo "$MOD_INFO_JSON" | jq -e .name >/dev/null; then
|
||||
print_success " Custom mod not on $MOD_BASE_URL, skipped."
|
||||
return 0
|
||||
fi
|
||||
|
||||
MOD_INFO=$(echo "$MOD_INFO_JSON" | jq -j --arg version "$FACTORIO_VERSION" ".releases|reverse|map(select(.info_json.factorio_version as \$mod_version | \$version | startswith(\$mod_version)))[0]|.file_name, \";\", .download_url, \";\", .sha1")
|
||||
|
||||
MOD_FILENAME=$(echo "$MOD_INFO" | cut -f1 -d";")
|
||||
MOD_URL=$(echo "$MOD_INFO" | cut -f2 -d";")
|
||||
MOD_SHA1=$(echo "$MOD_INFO" | cut -f3 -d";")
|
||||
|
||||
if [[ $MOD_FILENAME == null ]]; then
|
||||
print_failure " Not compatible with version"
|
||||
return 0
|
||||
fi
|
||||
|
||||
if [[ -f $MOD_DIR/$MOD_FILENAME ]]; then
|
||||
print_success " Already up-to-date."
|
||||
return 0
|
||||
fi
|
||||
|
||||
print_step "Downloading..."
|
||||
FULL_URL="$MOD_BASE_URL$MOD_URL?username=$USERNAME&token=$TOKEN"
|
||||
HTTP_STATUS=$(curl --silent -L -w "%{http_code}" -o "$MOD_DIR/$MOD_FILENAME" "$FULL_URL")
|
||||
|
||||
if [[ $HTTP_STATUS != 200 ]]; then
|
||||
print_failure " Download failed: Code $HTTP_STATUS."
|
||||
rm -f "$MOD_DIR/$MOD_FILENAME"
|
||||
return 1
|
||||
fi
|
||||
|
||||
if [[ ! -f $MOD_DIR/$MOD_FILENAME ]]; then
|
||||
print_failure " Downloaded file missing!"
|
||||
return 1
|
||||
fi
|
||||
|
||||
if ! [[ $(sha1sum "$MOD_DIR/$MOD_FILENAME") =~ $MOD_SHA1 ]]; then
|
||||
print_failure " SHA1 mismatch!"
|
||||
rm -f "$MOD_DIR/$MOD_FILENAME"
|
||||
return 1
|
||||
fi
|
||||
|
||||
print_success " Download complete."
|
||||
|
||||
for file in "$MOD_DIR/${MOD_NAME}_"*".zip"; do # wildcard does usually not work in quotes: https://unix.stackexchange.com/a/67761
|
||||
if [[ $file != $MOD_DIR/$MOD_FILENAME ]]; then
|
||||
print_success " Deleting old version: $file"
|
||||
rm -f "$file"
|
||||
fi
|
||||
done
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
if [[ -f $MOD_DIR/mod-list.json ]]; then
|
||||
jq -r ".mods|map(select(.enabled))|.[].name" "$MOD_DIR/mod-list.json" | while read -r mod; do
|
||||
if [[ $mod != base ]]; then
|
||||
update_mod "$mod"
|
||||
fi
|
||||
done
|
||||
fi
|
@ -1,45 +0,0 @@
|
||||
FROM frolvlad/alpine-glibc:alpine-3.12
|
||||
|
||||
LABEL maintainer="https://github.com/factoriotools/factorio-docker"
|
||||
|
||||
ARG USER=factorio
|
||||
ARG GROUP=factorio
|
||||
ARG PUID=845
|
||||
ARG PGID=845
|
||||
|
||||
ENV PORT=34197 \
|
||||
RCON_PORT=27015 \
|
||||
VERSION=0.18.47 \
|
||||
SHA1=32e23b0e83c41f6328d9270667330ee71f60837e \
|
||||
SAVES=/factorio/saves \
|
||||
CONFIG=/factorio/config \
|
||||
MODS=/factorio/mods \
|
||||
SCENARIOS=/factorio/scenarios \
|
||||
SCRIPTOUTPUT=/factorio/script-output \
|
||||
PUID="$PUID" \
|
||||
PGID="$PGID"
|
||||
|
||||
SHELL ["/bin/ash", "-eo", "pipefail", "-c"]
|
||||
RUN set -ox pipefail \
|
||||
&& archive="/tmp/factorio_headless_x64_$VERSION.tar.xz" \
|
||||
&& mkdir -p /opt /factorio \
|
||||
&& apk add --update --no-cache --no-progress bash binutils curl file gettext jq libintl pwgen shadow su-exec \
|
||||
&& curl -sSL "https://www.factorio.com/get-download/$VERSION/headless/linux64" -o "$archive" \
|
||||
&& echo "$SHA1 $archive" | sha1sum -c \
|
||||
|| (sha1sum "$archive" && file "$archive" && exit 1) \
|
||||
&& tar xf "$archive" --directory /opt \
|
||||
&& chmod ugo=rwx /opt/factorio \
|
||||
&& rm "$archive" \
|
||||
&& ln -s "$SCENARIOS" /opt/factorio/scenarios \
|
||||
&& ln -s "$SAVES" /opt/factorio/saves \
|
||||
&& mkdir -p /opt/factorio/config/ \
|
||||
&& addgroup -g "$PGID" -S "$GROUP" \
|
||||
&& adduser -u "$PUID" -G "$GROUP" -s /bin/sh -SDH "$USER" \
|
||||
&& chown -R "$USER":"$GROUP" /opt/factorio /factorio
|
||||
|
||||
COPY files/*.sh /
|
||||
COPY files/config.ini /opt/factorio/config/config.ini
|
||||
|
||||
VOLUME /factorio
|
||||
EXPOSE $PORT/udp $RCON_PORT/tcp
|
||||
ENTRYPOINT ["/docker-entrypoint.sh"]
|
@ -1,15 +0,0 @@
|
||||
version: '2'
|
||||
services:
|
||||
factorio:
|
||||
build: .
|
||||
ports:
|
||||
- "34197:34197/udp"
|
||||
- "27015:27015/tcp"
|
||||
volumes:
|
||||
- /opt/factorio:/factorio
|
||||
# environment:
|
||||
# - PUID=1000
|
||||
# - PGID=1000
|
||||
# - UPDATE_MODS_ON_START=true
|
||||
# - USERNAME=FactorioUsername
|
||||
# - TOKEN=FactorioToken
|
@ -1,98 +0,0 @@
|
||||
#!/bin/bash
|
||||
set -eoux pipefail
|
||||
|
||||
FACTORIO_VOL=/factorio
|
||||
LOAD_LATEST_SAVE="${LOAD_LATEST_SAVE:-true}"
|
||||
GENERATE_NEW_SAVE="${GENERATE_NEW_SAVE:-false}"
|
||||
SAVE_NAME="${SAVE_NAME:-""}"
|
||||
|
||||
mkdir -p "$FACTORIO_VOL"
|
||||
mkdir -p "$SAVES"
|
||||
mkdir -p "$CONFIG"
|
||||
mkdir -p "$MODS"
|
||||
mkdir -p "$SCENARIOS"
|
||||
mkdir -p "$SCRIPTOUTPUT"
|
||||
|
||||
if [[ ! -f $CONFIG/rconpw ]]; then
|
||||
# Generate a new RCON password if none exists
|
||||
pwgen 15 1 >"$CONFIG/rconpw"
|
||||
fi
|
||||
|
||||
if [[ ! -f $CONFIG/server-settings.json ]]; then
|
||||
# Copy default settings if server-settings.json doesn't exist
|
||||
cp /opt/factorio/data/server-settings.example.json "$CONFIG/server-settings.json"
|
||||
fi
|
||||
|
||||
if [[ ! -f $CONFIG/map-gen-settings.json ]]; then
|
||||
cp /opt/factorio/data/map-gen-settings.example.json "$CONFIG/map-gen-settings.json"
|
||||
fi
|
||||
|
||||
if [[ ! -f $CONFIG/map-settings.json ]]; then
|
||||
cp /opt/factorio/data/map-settings.example.json "$CONFIG/map-settings.json"
|
||||
fi
|
||||
|
||||
NRTMPSAVES=$( find -L "$SAVES" -iname \*.tmp.zip -mindepth 1 | wc -l )
|
||||
if [[ $NRTMPSAVES -gt 0 ]]; then
|
||||
# Delete incomplete saves (such as after a forced exit)
|
||||
rm -f "$SAVES"/*.tmp.zip
|
||||
fi
|
||||
|
||||
if [[ ${UPDATE_MODS_ON_START:-} == "true" ]]; then
|
||||
./docker-update-mods.sh
|
||||
fi
|
||||
|
||||
if [[ $(id -u) = 0 ]]; then
|
||||
# Update the User and Group ID based on the PUID/PGID variables
|
||||
usermod -o -u "$PUID" factorio
|
||||
groupmod -o -g "$PGID" factorio
|
||||
# Take ownership of factorio data if running as root
|
||||
chown -R factorio:factorio "$FACTORIO_VOL"
|
||||
# Drop to the factorio user
|
||||
SU_EXEC="su-exec factorio"
|
||||
else
|
||||
SU_EXEC=""
|
||||
fi
|
||||
|
||||
sed -i '/write-data=/c\write-data=\/factorio/' /opt/factorio/config/config.ini
|
||||
|
||||
NRSAVES=$(find -L "$SAVES" -iname \*.zip -mindepth 1 | wc -l)
|
||||
if [[ $GENERATE_NEW_SAVE != true && $NRSAVES == 0 ]]; then
|
||||
GENERATE_NEW_SAVE=true
|
||||
SAVE_NAME=_autosave1
|
||||
fi
|
||||
|
||||
if [[ $GENERATE_NEW_SAVE == true ]]; then
|
||||
if [[ -z "$SAVE_NAME" ]]; then
|
||||
echo "If \$GENERATE_NEW_SAVE is true, you must specify \$SAVE_NAME"
|
||||
exit 1
|
||||
fi
|
||||
if [[ -f "$SAVES/$SAVE_NAME.zip" ]]; then
|
||||
echo "Map $SAVES/$SAVE_NAME.zip already exists, skipping map generation"
|
||||
else
|
||||
$SU_EXEC /opt/factorio/bin/x64/factorio \
|
||||
--create "$SAVES/$SAVE_NAME.zip" \
|
||||
--map-gen-settings "$CONFIG/map-gen-settings.json" \
|
||||
--map-settings "$CONFIG/map-settings.json"
|
||||
fi
|
||||
fi
|
||||
|
||||
FLAGS=(\
|
||||
--port "$PORT" \
|
||||
--server-settings "$CONFIG/server-settings.json" \
|
||||
--server-banlist "$CONFIG/server-banlist.json" \
|
||||
--rcon-port "$RCON_PORT" \
|
||||
--server-whitelist "$CONFIG/server-whitelist.json" \
|
||||
--use-server-whitelist \
|
||||
--server-adminlist "$CONFIG/server-adminlist.json" \
|
||||
--rcon-password "$(cat "$CONFIG/rconpw")" \
|
||||
--server-id /factorio/config/server-id.json \
|
||||
)
|
||||
|
||||
if [[ $LOAD_LATEST_SAVE == true ]]; then
|
||||
FLAGS+=( --start-server-load-latest )
|
||||
else
|
||||
FLAGS+=( --start-server "$SAVE_NAME" )
|
||||
fi
|
||||
|
||||
# shellcheck disable=SC2086
|
||||
exec $SU_EXEC /opt/factorio/bin/x64/factorio "${FLAGS[@]}" "$@"
|
@ -1,28 +0,0 @@
|
||||
#!/bin/bash
|
||||
set -eou pipefail
|
||||
|
||||
if [[ -f /run/secrets/username ]]; then
|
||||
USERNAME=$(cat /run/secrets/username)
|
||||
fi
|
||||
|
||||
if [[ -f /run/secrets/token ]]; then
|
||||
TOKEN=$(cat /run/secrets/token)
|
||||
fi
|
||||
|
||||
if [[ -z ${USERNAME:-} ]]; then
|
||||
USERNAME="$(jq -j ".username" "$CONFIG/server-settings.json")"
|
||||
fi
|
||||
|
||||
if [[ -z ${TOKEN:-} ]]; then
|
||||
TOKEN="$(jq -j ".token" "$CONFIG/server-settings.json")"
|
||||
fi
|
||||
|
||||
if [[ -z ${USERNAME:-} ]]; then
|
||||
echo "You need to provide your Factorio username to update mods."
|
||||
fi
|
||||
|
||||
if [[ -z ${TOKEN:-} ]]; then
|
||||
echo "You need to provide your Factorio token to update mods."
|
||||
fi
|
||||
|
||||
./update-mods.sh "$VERSION" "$MODS" "$USERNAME" "$TOKEN"
|
@ -1,44 +0,0 @@
|
||||
#!/bin/bash
|
||||
set -eoux pipefail
|
||||
|
||||
if [[ -z ${1:-} ]]; then
|
||||
echo "No argument supplied"
|
||||
fi
|
||||
|
||||
SERVER_SCENARIO="$1"
|
||||
mkdir -p "$SAVES"
|
||||
mkdir -p "$CONFIG"
|
||||
mkdir -p "$MODS"
|
||||
mkdir -p "$SCENARIOS"
|
||||
|
||||
#chown -R factorio /factorio
|
||||
|
||||
if [[ ! -f $CONFIG/rconpw ]]; then
|
||||
pwgen 15 1 >"$CONFIG/rconpw"
|
||||
fi
|
||||
|
||||
if [[ ! -f $CONFIG/server-settings.json ]]; then
|
||||
cp /opt/factorio/data/server-settings.example.json "$CONFIG/server-settings.json"
|
||||
fi
|
||||
|
||||
if [[ ! -f $CONFIG/map-gen-settings.json ]]; then
|
||||
cp /opt/factorio/data/map-gen-settings.example.json "$CONFIG/map-gen-settings.json"
|
||||
fi
|
||||
|
||||
if [[ ! -f $CONFIG/map-settings.json ]]; then
|
||||
cp /opt/factorio/data/map-settings.example.json "$CONFIG/map-settings.json"
|
||||
fi
|
||||
|
||||
exec /opt/factorio/bin/x64/factorio \
|
||||
--port "$PORT" \
|
||||
--start-server-load-scenario "$SERVER_SCENARIO" \
|
||||
--map-gen-settings "$CONFIG/map-gen-settings.json" \
|
||||
--map-settings "$CONFIG/map-settings.json" \
|
||||
--server-settings "$CONFIG/server-settings.json" \
|
||||
--server-banlist "$CONFIG/server-banlist.json" \
|
||||
--server-whitelist "$CONFIG/server-whitelist.json" \
|
||||
--use-server-whitelist \
|
||||
--server-adminlist "$CONFIG/server-adminlist.json" \
|
||||
--rcon-port "$RCON_PORT" \
|
||||
--rcon-password "$(cat "$CONFIG/rconpw")" \
|
||||
--server-id /factorio/config/server-id.json
|
@ -1,27 +0,0 @@
|
||||
#!/bin/bash
|
||||
set -eoux pipefail
|
||||
|
||||
if [[ -z ${1:-} ]]; then
|
||||
echo "No argument supplied"
|
||||
fi
|
||||
|
||||
SERVER_SCENARIO="$1"
|
||||
mkdir -p "$SAVES"
|
||||
mkdir -p "$CONFIG"
|
||||
mkdir -p "$MODS"
|
||||
mkdir -p "$SCENARIOS"
|
||||
|
||||
if [[ ! -f $CONFIG/server-settings.json ]]; then
|
||||
cp /opt/factorio/data/server-settings.example.json "$CONFIG/server-settings.json"
|
||||
fi
|
||||
|
||||
if [[ ! -f $CONFIG/map-gen-settings.json ]]; then
|
||||
cp /opt/factorio/data/map-gen-settings.example.json "$CONFIG/map-gen-settings.json"
|
||||
fi
|
||||
|
||||
if [[ ! -f $CONFIG/map-settings.json ]]; then
|
||||
cp /opt/factorio/data/map-settings.example.json "$CONFIG/map-settings.json"
|
||||
fi
|
||||
|
||||
exec /opt/factorio/bin/x64/factorio \
|
||||
--scenario2map "$SERVER_SCENARIO"
|
@ -1,96 +0,0 @@
|
||||
#!/bin/bash
|
||||
set -eou pipefail
|
||||
|
||||
FACTORIO_VERSION=$1
|
||||
MOD_DIR=$2
|
||||
USERNAME=$3
|
||||
TOKEN=$4
|
||||
|
||||
MOD_BASE_URL="https://mods.factorio.com"
|
||||
|
||||
print_step()
|
||||
{
|
||||
echo "$1"
|
||||
}
|
||||
|
||||
print_success()
|
||||
{
|
||||
echo "$1"
|
||||
}
|
||||
|
||||
print_failure()
|
||||
{
|
||||
echo "$1"
|
||||
}
|
||||
|
||||
update_mod()
|
||||
{
|
||||
MOD_NAME="$1"
|
||||
MOD_NAME_ENCODED="${1// /%20}"
|
||||
|
||||
print_step "Checking for update of mod $MOD_NAME..."
|
||||
|
||||
MOD_INFO_URL="$MOD_BASE_URL/api/mods/$MOD_NAME_ENCODED"
|
||||
MOD_INFO_JSON=$(curl --silent "$MOD_INFO_URL")
|
||||
|
||||
if ! echo "$MOD_INFO_JSON" | jq -e .name >/dev/null; then
|
||||
print_success " Custom mod not on $MOD_BASE_URL, skipped."
|
||||
return 0
|
||||
fi
|
||||
|
||||
MOD_INFO=$(echo "$MOD_INFO_JSON" | jq -j --arg version "$FACTORIO_VERSION" ".releases|reverse|map(select(.info_json.factorio_version as \$mod_version | \$version | startswith(\$mod_version)))[0]|.file_name, \";\", .download_url, \";\", .sha1")
|
||||
|
||||
MOD_FILENAME=$(echo "$MOD_INFO" | cut -f1 -d";")
|
||||
MOD_URL=$(echo "$MOD_INFO" | cut -f2 -d";")
|
||||
MOD_SHA1=$(echo "$MOD_INFO" | cut -f3 -d";")
|
||||
|
||||
if [[ $MOD_FILENAME == null ]]; then
|
||||
print_failure " Not compatible with version"
|
||||
return 0
|
||||
fi
|
||||
|
||||
if [[ -f $MOD_DIR/$MOD_FILENAME ]]; then
|
||||
print_success " Already up-to-date."
|
||||
return 0
|
||||
fi
|
||||
|
||||
print_step "Downloading..."
|
||||
FULL_URL="$MOD_BASE_URL$MOD_URL?username=$USERNAME&token=$TOKEN"
|
||||
HTTP_STATUS=$(curl --silent -L -w "%{http_code}" -o "$MOD_DIR/$MOD_FILENAME" "$FULL_URL")
|
||||
|
||||
if [[ $HTTP_STATUS != 200 ]]; then
|
||||
print_failure " Download failed: Code $HTTP_STATUS."
|
||||
rm -f "$MOD_DIR/$MOD_FILENAME"
|
||||
return 1
|
||||
fi
|
||||
|
||||
if [[ ! -f $MOD_DIR/$MOD_FILENAME ]]; then
|
||||
print_failure " Downloaded file missing!"
|
||||
return 1
|
||||
fi
|
||||
|
||||
if ! [[ $(sha1sum "$MOD_DIR/$MOD_FILENAME") =~ $MOD_SHA1 ]]; then
|
||||
print_failure " SHA1 mismatch!"
|
||||
rm -f "$MOD_DIR/$MOD_FILENAME"
|
||||
return 1
|
||||
fi
|
||||
|
||||
print_success " Download complete."
|
||||
|
||||
for file in "$MOD_DIR/${MOD_NAME}_"*".zip"; do # wildcard does usually not work in quotes: https://unix.stackexchange.com/a/67761
|
||||
if [[ $file != $MOD_DIR/$MOD_FILENAME ]]; then
|
||||
print_success " Deleting old version: $file"
|
||||
rm -f "$file"
|
||||
fi
|
||||
done
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
if [[ -f $MOD_DIR/mod-list.json ]]; then
|
||||
jq -r ".mods|map(select(.enabled))|.[].name" "$MOD_DIR/mod-list.json" | while read -r mod; do
|
||||
if [[ $mod != base ]]; then
|
||||
update_mod "$mod"
|
||||
fi
|
||||
done
|
||||
fi
|
@ -1,45 +0,0 @@
|
||||
FROM frolvlad/alpine-glibc:alpine-3.12
|
||||
|
||||
LABEL maintainer="https://github.com/factoriotools/factorio-docker"
|
||||
|
||||
ARG USER=factorio
|
||||
ARG GROUP=factorio
|
||||
ARG PUID=845
|
||||
ARG PGID=845
|
||||
|
||||
ENV PORT=34197 \
|
||||
RCON_PORT=27015 \
|
||||
VERSION=1.0.0 \
|
||||
SHA1=a50dd6f1ab17acde5a8d77bc5fb478c798d9c20e \
|
||||
SAVES=/factorio/saves \
|
||||
CONFIG=/factorio/config \
|
||||
MODS=/factorio/mods \
|
||||
SCENARIOS=/factorio/scenarios \
|
||||
SCRIPTOUTPUT=/factorio/script-output \
|
||||
PUID="$PUID" \
|
||||
PGID="$PGID"
|
||||
|
||||
SHELL ["/bin/ash", "-eo", "pipefail", "-c"]
|
||||
RUN set -ox pipefail \
|
||||
&& archive="/tmp/factorio_headless_x64_$VERSION.tar.xz" \
|
||||
&& mkdir -p /opt /factorio \
|
||||
&& apk add --update --no-cache --no-progress bash binutils curl file gettext jq libintl pwgen shadow su-exec \
|
||||
&& curl -sSL "https://www.factorio.com/get-download/$VERSION/headless/linux64" -o "$archive" \
|
||||
&& echo "$SHA1 $archive" | sha1sum -c \
|
||||
|| (sha1sum "$archive" && file "$archive" && exit 1) \
|
||||
&& tar xf "$archive" --directory /opt \
|
||||
&& chmod ugo=rwx /opt/factorio \
|
||||
&& rm "$archive" \
|
||||
&& ln -s "$SCENARIOS" /opt/factorio/scenarios \
|
||||
&& ln -s "$SAVES" /opt/factorio/saves \
|
||||
&& mkdir -p /opt/factorio/config/ \
|
||||
&& addgroup -g "$PGID" -S "$GROUP" \
|
||||
&& adduser -u "$PUID" -G "$GROUP" -s /bin/sh -SDH "$USER" \
|
||||
&& chown -R "$USER":"$GROUP" /opt/factorio /factorio
|
||||
|
||||
COPY files/*.sh /
|
||||
COPY files/config.ini /opt/factorio/config/config.ini
|
||||
|
||||
VOLUME /factorio
|
||||
EXPOSE $PORT/udp $RCON_PORT/tcp
|
||||
ENTRYPOINT ["/docker-entrypoint.sh"]
|
@ -1,16 +0,0 @@
|
||||
version: '2'
|
||||
services:
|
||||
factorio:
|
||||
build: .
|
||||
ports:
|
||||
- "34197:34197/udp"
|
||||
- "27015:27015/tcp"
|
||||
volumes:
|
||||
- /opt/factorio:/factorio
|
||||
# environment:
|
||||
# - PUID=1000
|
||||
# - PGID=1000
|
||||
# - UPDATE_MODS_ON_START=true
|
||||
# - USERNAME=FactorioUsername
|
||||
# - TOKEN=FactorioToken
|
||||
# - PORT=34198
|
@ -1,755 +0,0 @@
|
||||
; version=8
|
||||
; This is INI file : https://en.wikipedia.org/wiki/INI_file#Format
|
||||
; Semicolons (;) at the beginning of the line indicate a comment. Comment lines are ignored.
|
||||
[path]
|
||||
read-data=__PATH__executable__/../../data
|
||||
write-data=__PATH__executable__/../..
|
||||
|
||||
[general]
|
||||
locale=
|
||||
|
||||
[other]
|
||||
; Options: true, false
|
||||
; verbose-logging=false
|
||||
|
||||
; Options: true, false
|
||||
; log-saving-statistics=false
|
||||
|
||||
; autosave-interval=5
|
||||
|
||||
; autosave-slots=3
|
||||
|
||||
; In ticks
|
||||
; minimum-latency-in-multiplayer=0
|
||||
|
||||
; In seconds
|
||||
; multiplayer-initial-connection-timeout=10
|
||||
|
||||
; port=34197
|
||||
|
||||
; max-map-preview-chunk-side=64
|
||||
|
||||
; max-map-preview-threads=7
|
||||
|
||||
; In bytes
|
||||
; max-multiplayer-script-reload-size=1048576
|
||||
|
||||
; Options: true, false
|
||||
; enable-steam-networking=true
|
||||
|
||||
; proxy=
|
||||
|
||||
; proxy-username=
|
||||
|
||||
; proxy-password=
|
||||
|
||||
; Options: true, false
|
||||
; check-updates=true
|
||||
|
||||
; Options: true, false
|
||||
; enable-experimental-updates=false
|
||||
|
||||
; Options: true, false
|
||||
; enable-new-mods=true
|
||||
|
||||
; Options: true, false
|
||||
; use-mod-settings-per-save=true
|
||||
|
||||
; Options: true, false
|
||||
; disable-minimal-mode=false
|
||||
|
||||
; Options: true, false
|
||||
; disable-blueprint-storage=false
|
||||
|
||||
; Disables tracking which mod created/changed what prototype. Mainly for faster startup during development.
|
||||
;
|
||||
; Options: true, false
|
||||
; disable-prototype-history=false
|
||||
|
||||
; Print a warning for all prototype values that were not accessed.
|
||||
;
|
||||
; Options: true, false
|
||||
; check-unused-prototype-data=false
|
||||
|
||||
; Cache data stage prototype data for faster startup. Experimental.
|
||||
;
|
||||
; Options: true, false
|
||||
; cache-prototype-data=false
|
||||
|
||||
; Options: true, false
|
||||
; enable-razer-chroma-support=true
|
||||
|
||||
; Options: true, false
|
||||
; enable-logitech-led-support=true
|
||||
|
||||
; Options: true, false
|
||||
; enable-crash-log-uploading=true
|
||||
|
||||
; Options: true, false
|
||||
; enable-heap-validation=true
|
||||
|
||||
; Options: true, false
|
||||
; enable-threaded-message-pump=true
|
||||
|
||||
; Options: true, false
|
||||
; enable-taskbar-animation=true
|
||||
|
||||
; Does nothing on Windows
|
||||
;
|
||||
; Options: true, false
|
||||
; non-blocking-saving=false
|
||||
|
||||
; Related to MacOS
|
||||
;
|
||||
; Options: true, false
|
||||
; discard-mouse-events-when-accessibility-zoomed=false
|
||||
|
||||
; Options: true, false
|
||||
; enable-blueprint-storage-cloud-sync=false
|
||||
|
||||
; Options: true, false
|
||||
; force-enable-factorio-version-check=false
|
||||
|
||||
; Options: true, false
|
||||
; bring-window-to-top-on-click=true
|
||||
|
||||
; Options: fast, maximum
|
||||
; multiplayer-compression-level=fast
|
||||
|
||||
; Options: none, fast, maximum
|
||||
; autosave-compression-level=fast
|
||||
|
||||
; Socket to host RCON on when lauching MP server from the menu.
|
||||
; local-rcon-socket=0.0.0.0:0
|
||||
|
||||
; Password for RCON when launching MP server from the menu.
|
||||
; local-rcon-password=
|
||||
|
||||
|
||||
[interface]
|
||||
; Options: true, false
|
||||
; automatic-ui-scale=true
|
||||
|
||||
; custom-ui-scale=1.000000
|
||||
|
||||
; tooltip-delay=0.040000
|
||||
|
||||
; entity-tooltip-delay=0.000000
|
||||
|
||||
; tooltip-offset=20
|
||||
|
||||
; output-console-delay=1200
|
||||
|
||||
; train-stop-label-angle=0.085526
|
||||
|
||||
; active-quick-bars=2
|
||||
|
||||
; shortcut-bar-rows=2
|
||||
|
||||
; Options: true, false
|
||||
; autosort-inventory=true
|
||||
|
||||
; Options: true, false
|
||||
; research-finished-stops-game=false
|
||||
|
||||
; Options: true, false
|
||||
; use-item-groups=true
|
||||
|
||||
; Options: true, false
|
||||
; use-item-subgroups=true
|
||||
|
||||
; Options: true, false
|
||||
; use-version-filter-in-browse-games-gui=true
|
||||
|
||||
; Options: true, false
|
||||
; use-version-filter-in-install-mods-gui=true
|
||||
|
||||
; Options: true, false
|
||||
; play-sound-for-chat-messages=true
|
||||
|
||||
; Options: true, false
|
||||
; fuzzy-search-enabled=false
|
||||
|
||||
; Options: true, false
|
||||
; pick-ghost-cursor=false
|
||||
|
||||
; Options: true, false
|
||||
; show-minimap=true
|
||||
|
||||
; Options: true, false
|
||||
; show-tips-and-tricks=true
|
||||
|
||||
; Options: true, false
|
||||
; show-tutorial-notifications=true
|
||||
|
||||
; Options: true, false
|
||||
; show-turret-radius-when-blueprinting=false
|
||||
|
||||
; Options: true, false
|
||||
; show-item-labels-in-cursor=true
|
||||
|
||||
; Options: true, false
|
||||
; show-rail-block-visualization=true
|
||||
|
||||
; Options: true, false
|
||||
; show-missing-logistic-network-icon=true
|
||||
|
||||
; Options: true, false
|
||||
; show-interaction-indications=true
|
||||
|
||||
; Options: true, false
|
||||
; show-grid-when-paused=true
|
||||
|
||||
; Options: true, false
|
||||
; show-inserter-arrows-when-selected=true
|
||||
|
||||
; Options: true, false
|
||||
; show-inserter-arrows-when-detailed-info-is-on=false
|
||||
|
||||
; Options: true, false
|
||||
; show-pump-arrows-when-detailed-info-is-on=true
|
||||
|
||||
; Options: true, false
|
||||
; show-mining-drill-arrows-when-detailed-info-is-on=true
|
||||
|
||||
; Options: true, false
|
||||
; show-combinator-settings-when-detailed-info-is-on=false
|
||||
|
||||
; Options: true, false
|
||||
; entity-tooltip-on-the-side=true
|
||||
|
||||
; Options: true, false
|
||||
; show-mod-owners-in-tooltips=true
|
||||
|
||||
; Options: true, false
|
||||
; show-descriptions-in-tooltips=true
|
||||
|
||||
; Options: true, false
|
||||
; show-total-raw-in-recipe-tooltips=true
|
||||
|
||||
; debug-font-size=18
|
||||
|
||||
; train-visualization-length=5
|
||||
|
||||
|
||||
[sound]
|
||||
; master-volume=0.800000
|
||||
|
||||
; music-volume=0.500000
|
||||
|
||||
; game-effects-volume=0.700000
|
||||
|
||||
; gui-effects-volume=0.600000
|
||||
|
||||
; walking-sound-volume=0.250000
|
||||
|
||||
; environment-sounds-volume=0.550000
|
||||
|
||||
; alerts-volume=0.500000
|
||||
|
||||
; wind-volume=0.350000
|
||||
|
||||
; audible-distance=40.000000
|
||||
|
||||
; environment-audible-distance=30.000000
|
||||
|
||||
; maximum-environment-sounds=50
|
||||
|
||||
; active-gui-volume-modifier=0.800000
|
||||
|
||||
; active-gui-environment-volume-modifier=0.400000
|
||||
|
||||
; The maximum volume allowed for any sound.
|
||||
; maximum-volume=2.000000
|
||||
|
||||
; ambient-music-pause-mean-seconds=45.000000
|
||||
|
||||
; ambient-music-pause-variance-seconds=30.000000
|
||||
|
||||
; Options: main-tracks-only, interleave-main-tracks-with-interludes, randomize-all
|
||||
; ambient-music-mode=interleave-main-tracks-with-interludes
|
||||
|
||||
; zoom-audible-distance-coefficient=0.500000
|
||||
|
||||
; zoom-volume-coefficient=0.750000
|
||||
|
||||
|
||||
[map-view]
|
||||
; Options: true, false
|
||||
; show-logistic-network=false
|
||||
|
||||
; Options: true, false
|
||||
; show-electric-network=false
|
||||
|
||||
; Options: true, false
|
||||
; show-turret-range=false
|
||||
|
||||
; Options: true, false
|
||||
; show-pollution=true
|
||||
|
||||
; Options: true, false
|
||||
; show-networkless-logistic-members=false
|
||||
|
||||
; Options: true, false
|
||||
; show-train-station-names=true
|
||||
|
||||
; Options: true, false
|
||||
; show-player-names=true
|
||||
|
||||
; Options: true, false
|
||||
; show-non-standard-map-info=false
|
||||
|
||||
|
||||
[debug]
|
||||
; force=enemy
|
||||
|
||||
; Options: true, false
|
||||
; capture-perf-statistics=false
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-fps=debug
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-detailed-info=debug
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-time-usage=debug
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-gpu-time-usage=debug
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-sprite-counts=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-lua-object-statistics=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-heat-buffer-info=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-multiplayer-waiting-icon=debug
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-multiplayer-statistics=debug
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-multiplayer-selection-rectangles=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-debug-info-in-tooltips=debug
|
||||
|
||||
; Options: always, debug, never
|
||||
; hide-mod-guis=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-tile-grid=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-collision-rectangles=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-selection-rectangles=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-render-rectangles=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-entity-positions=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-entity-velocities=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-selected-entity-advanced-tiles=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-selected-input-transport-belts=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-paths=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-path-requests=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-next-waypoint-bb=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-target=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-unit-group-info=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-unit-behavior-info=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-pathfinder-fringe=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-path-cache=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-path-cache-paths=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-rail-paths=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-rolling-stock-count=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-rail-connections=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-rail-joints=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-rail-signal-states=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-rail-segment-collision-boxes=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-train-stop-point=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-train-braking-distance=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-train-signals=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-train-repathing=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-network-connected-entities=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-circuit-network-numbers=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-energy-sources-networks=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-active-state=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-wakeup-lists=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-transport-lines=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-transport-line-gaps=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-pollution-values=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-active-entities-on-chunk-counts=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-active-chunks=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-polluted-chunks=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; hide-chart-tags=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-enemy-expansion-candidate-chunks=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-enemy-expansion-candidate-chunk-values=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-bad-attack-chunks=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-tile-variations=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-raw-tile-transitions=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-fluid-box-fluid-info=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-environment-sound-info=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-environment-sound-area=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-selected-entity-audible-range=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-recently-played-sound-info=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-logistic-robot-targets=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-logistic-robots-on-map=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-recipe-icons-on-map=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-player-robots=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-fire-info=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-sticker-info=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-decorative-names=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-decorative-collision-rectangles=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; allow-increased-zoom=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-chunk-components=never
|
||||
|
||||
|
||||
[multiplayer-lobby]
|
||||
; name=
|
||||
|
||||
; description=
|
||||
|
||||
; Options: true, false
|
||||
; visibility-public=true
|
||||
|
||||
; Options: true, false
|
||||
; visibility-steam=true
|
||||
|
||||
; Options: true, false
|
||||
; visibility-lan=true
|
||||
|
||||
; max-players=0
|
||||
|
||||
; Options: true, false
|
||||
; ignore-player-limit-when-returning=false
|
||||
|
||||
; max-upload-in-kilobytes-per-second=0
|
||||
|
||||
; max-upload-slots=5
|
||||
|
||||
; password=
|
||||
|
||||
; tag-list=
|
||||
|
||||
; afk-auto-kick=0
|
||||
|
||||
; Options: true, false, admins-only
|
||||
; allowed-commands=admins-only
|
||||
|
||||
; Options: true, false
|
||||
; only-admins-can-pause=true
|
||||
|
||||
; Options: true, false
|
||||
; autosave-only-on-server=true
|
||||
|
||||
; Options: true, false
|
||||
; non-blocking-saving=true
|
||||
|
||||
; Options: true, false
|
||||
; verify-user-identity=true
|
||||
|
||||
; Options: true, false
|
||||
; enable-whitelist=false
|
||||
|
||||
|
||||
[graphics]
|
||||
; lights-render-quality=0.250000
|
||||
|
||||
; Default preferred display index should force finding primary monitor
|
||||
; preferred-display-index=255
|
||||
|
||||
; screenshots-threads-count=8
|
||||
|
||||
; cache-sprite-atlas-count=1
|
||||
|
||||
; Options: true, false
|
||||
; cache-sprite-atlas=false
|
||||
|
||||
; Options: true, false
|
||||
; compress-sprite-atlas-cache=false
|
||||
|
||||
; Options: true, false
|
||||
; texture-streaming=true
|
||||
|
||||
; streamed-atlas-physical-vram-size=0
|
||||
|
||||
; sprite-vertex-buffer-size=1048576
|
||||
|
||||
; max-texture-size=0
|
||||
|
||||
; max-threads=8
|
||||
|
||||
; 'low' and 'very-low' options are deprecated and will be migrated to 'normal'
|
||||
;
|
||||
; Options: high, normal, low, very-low
|
||||
; graphics-quality=normal
|
||||
|
||||
; brightness=0
|
||||
|
||||
; contrast=0
|
||||
|
||||
; saturation=100
|
||||
|
||||
; Options: true, false
|
||||
; full-screen=true
|
||||
|
||||
; Options: true, false
|
||||
; minimize-on-focus-loss=false
|
||||
|
||||
; Options: true, false
|
||||
; show-smoke=true
|
||||
|
||||
; Options: true, false
|
||||
; show-clouds=true
|
||||
|
||||
; Options: true, false
|
||||
; show-decoratives=true
|
||||
|
||||
; Options: true, false
|
||||
; show-particles=true
|
||||
|
||||
; Options: true, false
|
||||
; show-item-shadows=true
|
||||
|
||||
; Options: true, false
|
||||
; show-inserter-shadows=true
|
||||
|
||||
; Options: true, false
|
||||
; show-animated-water=true
|
||||
|
||||
; Options: true, false
|
||||
; show-tree-distortion=true
|
||||
|
||||
; Options: true, false
|
||||
; force-opengl=false
|
||||
|
||||
; Options: true, false
|
||||
; v-sync=true
|
||||
|
||||
; Options: true, false
|
||||
; high-quality-animations=true
|
||||
|
||||
; Options: true, false
|
||||
; high-quality-shadows=false
|
||||
|
||||
; Options: true, false
|
||||
; high-quality-terrain=true
|
||||
|
||||
; Minimum number of turrets required to turn on the turret range overdraw optimization
|
||||
; turret-overdraw-minimum-count=4
|
||||
|
||||
; Scale at which the turret range overdraw optimization will start being applied
|
||||
; turret-overdraw-scale-threshold=0.200000
|
||||
|
||||
; Options: true, false
|
||||
; skip-vram-detection=false
|
||||
|
||||
; Options: true, false
|
||||
; halt-rendering-when-minimized=true
|
||||
|
||||
; Options: true, false
|
||||
; runtime-sprite-reload=false
|
||||
|
||||
; Options: true, false
|
||||
; full-color-depth=true
|
||||
|
||||
; Options: true, false
|
||||
; render-in-native-resolution=true
|
||||
|
||||
; Options: true, false
|
||||
; use-flip-presentation-model=false
|
||||
|
||||
; Options: true, false
|
||||
; debug-api=false
|
||||
|
||||
; Options: true, false
|
||||
; discard-buffers-on-begin-frame=true
|
||||
|
||||
; Options: all, high, medium, low
|
||||
; video-memory-usage=high
|
||||
|
||||
; Options: none, high-quality, low-quality
|
||||
; texture-compression-level=high-quality
|
||||
|
||||
; Options: true, false
|
||||
; compress-virtual-atlas=true
|
||||
|
||||
; Options: copy, copy-sequential, flip, flip-discard
|
||||
; dxgi-presentation-model=copy
|
||||
|
||||
; Options: none, flush, wait-for-vblank, flush-and-wait-for-vblank
|
||||
; dxgi-action-before-present=none
|
||||
|
||||
; relevant only for flip presentation models
|
||||
;
|
||||
; Options: true, false
|
||||
; dxgi-allow-tearing=false
|
||||
|
||||
; Options: false, true, auto
|
||||
; dxgi-flip-do-not-wait=false
|
||||
|
||||
; Options: true, false
|
||||
; dxgi-present-restart=false
|
||||
|
||||
; dxgi-swap-chain-buffer-count=0
|
||||
|
||||
; dxgi-max-frame-latency=0
|
||||
|
||||
; dxgi-adapter-index=-1
|
||||
|
||||
; max-sprite-loading-threads=32
|
||||
|
||||
; Options: true, false
|
||||
; gpu-accelerated-compression=true
|
||||
|
||||
; Options: true, false
|
||||
; gpu-accelerated-mipmap-compression=true
|
||||
|
||||
; Options: true, false
|
||||
; wait-until-mipmap-generation-finished=true
|
||||
|
||||
; Options: true, false
|
||||
; check-for-unused-pixels=false
|
||||
|
||||
; ogl-depth-buffer-bit-depth=0
|
||||
|
||||
; Options: false, true, auto
|
||||
; ogl-accelerated-renderer=auto
|
||||
|
||||
; Options: true, false
|
||||
; ogl-double-buffered=true
|
||||
|
||||
; Set to true if mipmapped sprites render very blurry on your GPU. Limited support.
|
||||
;
|
||||
; Options: true, false
|
||||
; legacy-gpu-no-mipmaps=false
|
||||
|
||||
; Options: true, false
|
||||
; force-linear-magnification=false
|
||||
|
||||
; Options: true, false
|
||||
; custom-mipmap-workaround=false
|
||||
|
||||
; Options: true, false
|
||||
; buffer-rename-workaround=false
|
||||
|
||||
; Comma separated list of OpenGL extensions that should not be used (for example: ARB_copy_image,KHR_debug)
|
||||
; disabled-opengl-extensions=
|
||||
|
||||
|
@ -1,28 +0,0 @@
|
||||
#!/bin/bash
|
||||
set -eou pipefail
|
||||
|
||||
if [[ -f /run/secrets/username ]]; then
|
||||
USERNAME=$(cat /run/secrets/username)
|
||||
fi
|
||||
|
||||
if [[ -f /run/secrets/token ]]; then
|
||||
TOKEN=$(cat /run/secrets/token)
|
||||
fi
|
||||
|
||||
if [[ -z ${USERNAME:-} ]]; then
|
||||
USERNAME="$(jq -j ".username" "$CONFIG/server-settings.json")"
|
||||
fi
|
||||
|
||||
if [[ -z ${TOKEN:-} ]]; then
|
||||
TOKEN="$(jq -j ".token" "$CONFIG/server-settings.json")"
|
||||
fi
|
||||
|
||||
if [[ -z ${USERNAME:-} ]]; then
|
||||
echo "You need to provide your Factorio username to update mods."
|
||||
fi
|
||||
|
||||
if [[ -z ${TOKEN:-} ]]; then
|
||||
echo "You need to provide your Factorio token to update mods."
|
||||
fi
|
||||
|
||||
./update-mods.sh "$VERSION" "$MODS" "$USERNAME" "$TOKEN"
|
@ -1,27 +0,0 @@
|
||||
#!/bin/bash
|
||||
set -eoux pipefail
|
||||
|
||||
if [[ -z ${1:-} ]]; then
|
||||
echo "No argument supplied"
|
||||
fi
|
||||
|
||||
SERVER_SCENARIO="$1"
|
||||
mkdir -p "$SAVES"
|
||||
mkdir -p "$CONFIG"
|
||||
mkdir -p "$MODS"
|
||||
mkdir -p "$SCENARIOS"
|
||||
|
||||
if [[ ! -f $CONFIG/server-settings.json ]]; then
|
||||
cp /opt/factorio/data/server-settings.example.json "$CONFIG/server-settings.json"
|
||||
fi
|
||||
|
||||
if [[ ! -f $CONFIG/map-gen-settings.json ]]; then
|
||||
cp /opt/factorio/data/map-gen-settings.example.json "$CONFIG/map-gen-settings.json"
|
||||
fi
|
||||
|
||||
if [[ ! -f $CONFIG/map-settings.json ]]; then
|
||||
cp /opt/factorio/data/map-settings.example.json "$CONFIG/map-settings.json"
|
||||
fi
|
||||
|
||||
exec /opt/factorio/bin/x64/factorio \
|
||||
--scenario2map "$SERVER_SCENARIO"
|
@ -1,45 +0,0 @@
|
||||
FROM frolvlad/alpine-glibc:alpine-3.12
|
||||
|
||||
LABEL maintainer="https://github.com/factoriotools/factorio-docker"
|
||||
|
||||
ARG USER=factorio
|
||||
ARG GROUP=factorio
|
||||
ARG PUID=845
|
||||
ARG PGID=845
|
||||
|
||||
ENV PORT=34197 \
|
||||
RCON_PORT=27015 \
|
||||
VERSION=1.1.32 \
|
||||
SHA1=cfef51b85a29babe79639ab6212df73ad24f2631 \
|
||||
SAVES=/factorio/saves \
|
||||
CONFIG=/factorio/config \
|
||||
MODS=/factorio/mods \
|
||||
SCENARIOS=/factorio/scenarios \
|
||||
SCRIPTOUTPUT=/factorio/script-output \
|
||||
PUID="$PUID" \
|
||||
PGID="$PGID"
|
||||
|
||||
SHELL ["/bin/ash", "-eo", "pipefail", "-c"]
|
||||
RUN set -ox pipefail \
|
||||
&& archive="/tmp/factorio_headless_x64_$VERSION.tar.xz" \
|
||||
&& mkdir -p /opt /factorio \
|
||||
&& apk add --update --no-cache --no-progress bash binutils curl file gettext jq libintl pwgen shadow su-exec \
|
||||
&& curl -sSL "https://www.factorio.com/get-download/$VERSION/headless/linux64" -o "$archive" \
|
||||
&& echo "$SHA1 $archive" | sha1sum -c \
|
||||
|| (sha1sum "$archive" && file "$archive" && exit 1) \
|
||||
&& tar xf "$archive" --directory /opt \
|
||||
&& chmod ugo=rwx /opt/factorio \
|
||||
&& rm "$archive" \
|
||||
&& ln -s "$SCENARIOS" /opt/factorio/scenarios \
|
||||
&& ln -s "$SAVES" /opt/factorio/saves \
|
||||
&& mkdir -p /opt/factorio/config/ \
|
||||
&& addgroup -g "$PGID" -S "$GROUP" \
|
||||
&& adduser -u "$PUID" -G "$GROUP" -s /bin/sh -SDH "$USER" \
|
||||
&& chown -R "$USER":"$GROUP" /opt/factorio /factorio
|
||||
|
||||
COPY files/*.sh /
|
||||
COPY files/config.ini /opt/factorio/config/config.ini
|
||||
|
||||
VOLUME /factorio
|
||||
EXPOSE $PORT/udp $RCON_PORT/tcp
|
||||
ENTRYPOINT ["/docker-entrypoint.sh"]
|
@ -1,16 +0,0 @@
|
||||
version: '2'
|
||||
services:
|
||||
factorio:
|
||||
build: .
|
||||
ports:
|
||||
- "34197:34197/udp"
|
||||
- "27015:27015/tcp"
|
||||
volumes:
|
||||
- /opt/factorio:/factorio
|
||||
# environment:
|
||||
# - PUID=1000
|
||||
# - PGID=1000
|
||||
# - UPDATE_MODS_ON_START=true
|
||||
# - USERNAME=FactorioUsername
|
||||
# - TOKEN=FactorioToken
|
||||
# - PORT=34198
|
@ -1,755 +0,0 @@
|
||||
; version=8
|
||||
; This is INI file : https://en.wikipedia.org/wiki/INI_file#Format
|
||||
; Semicolons (;) at the beginning of the line indicate a comment. Comment lines are ignored.
|
||||
[path]
|
||||
read-data=__PATH__executable__/../../data
|
||||
write-data=__PATH__executable__/../..
|
||||
|
||||
[general]
|
||||
locale=
|
||||
|
||||
[other]
|
||||
; Options: true, false
|
||||
; verbose-logging=false
|
||||
|
||||
; Options: true, false
|
||||
; log-saving-statistics=false
|
||||
|
||||
; autosave-interval=5
|
||||
|
||||
; autosave-slots=3
|
||||
|
||||
; In ticks
|
||||
; minimum-latency-in-multiplayer=0
|
||||
|
||||
; In seconds
|
||||
; multiplayer-initial-connection-timeout=10
|
||||
|
||||
; port=34197
|
||||
|
||||
; max-map-preview-chunk-side=64
|
||||
|
||||
; max-map-preview-threads=7
|
||||
|
||||
; In bytes
|
||||
; max-multiplayer-script-reload-size=1048576
|
||||
|
||||
; Options: true, false
|
||||
; enable-steam-networking=true
|
||||
|
||||
; proxy=
|
||||
|
||||
; proxy-username=
|
||||
|
||||
; proxy-password=
|
||||
|
||||
; Options: true, false
|
||||
; check-updates=true
|
||||
|
||||
; Options: true, false
|
||||
; enable-experimental-updates=false
|
||||
|
||||
; Options: true, false
|
||||
; enable-new-mods=true
|
||||
|
||||
; Options: true, false
|
||||
; use-mod-settings-per-save=true
|
||||
|
||||
; Options: true, false
|
||||
; disable-minimal-mode=false
|
||||
|
||||
; Options: true, false
|
||||
; disable-blueprint-storage=false
|
||||
|
||||
; Disables tracking which mod created/changed what prototype. Mainly for faster startup during development.
|
||||
;
|
||||
; Options: true, false
|
||||
; disable-prototype-history=false
|
||||
|
||||
; Print a warning for all prototype values that were not accessed.
|
||||
;
|
||||
; Options: true, false
|
||||
; check-unused-prototype-data=false
|
||||
|
||||
; Cache data stage prototype data for faster startup. Experimental.
|
||||
;
|
||||
; Options: true, false
|
||||
; cache-prototype-data=false
|
||||
|
||||
; Options: true, false
|
||||
; enable-razer-chroma-support=true
|
||||
|
||||
; Options: true, false
|
||||
; enable-logitech-led-support=true
|
||||
|
||||
; Options: true, false
|
||||
; enable-crash-log-uploading=true
|
||||
|
||||
; Options: true, false
|
||||
; enable-heap-validation=true
|
||||
|
||||
; Options: true, false
|
||||
; enable-threaded-message-pump=true
|
||||
|
||||
; Options: true, false
|
||||
; enable-taskbar-animation=true
|
||||
|
||||
; Does nothing on Windows
|
||||
;
|
||||
; Options: true, false
|
||||
; non-blocking-saving=false
|
||||
|
||||
; Related to MacOS
|
||||
;
|
||||
; Options: true, false
|
||||
; discard-mouse-events-when-accessibility-zoomed=false
|
||||
|
||||
; Options: true, false
|
||||
; enable-blueprint-storage-cloud-sync=false
|
||||
|
||||
; Options: true, false
|
||||
; force-enable-factorio-version-check=false
|
||||
|
||||
; Options: true, false
|
||||
; bring-window-to-top-on-click=true
|
||||
|
||||
; Options: fast, maximum
|
||||
; multiplayer-compression-level=fast
|
||||
|
||||
; Options: none, fast, maximum
|
||||
; autosave-compression-level=fast
|
||||
|
||||
; Socket to host RCON on when lauching MP server from the menu.
|
||||
; local-rcon-socket=0.0.0.0:0
|
||||
|
||||
; Password for RCON when launching MP server from the menu.
|
||||
; local-rcon-password=
|
||||
|
||||
|
||||
[interface]
|
||||
; Options: true, false
|
||||
; automatic-ui-scale=true
|
||||
|
||||
; custom-ui-scale=1.000000
|
||||
|
||||
; tooltip-delay=0.040000
|
||||
|
||||
; entity-tooltip-delay=0.000000
|
||||
|
||||
; tooltip-offset=20
|
||||
|
||||
; output-console-delay=1200
|
||||
|
||||
; train-stop-label-angle=0.085526
|
||||
|
||||
; active-quick-bars=2
|
||||
|
||||
; shortcut-bar-rows=2
|
||||
|
||||
; Options: true, false
|
||||
; autosort-inventory=true
|
||||
|
||||
; Options: true, false
|
||||
; research-finished-stops-game=false
|
||||
|
||||
; Options: true, false
|
||||
; use-item-groups=true
|
||||
|
||||
; Options: true, false
|
||||
; use-item-subgroups=true
|
||||
|
||||
; Options: true, false
|
||||
; use-version-filter-in-browse-games-gui=true
|
||||
|
||||
; Options: true, false
|
||||
; use-version-filter-in-install-mods-gui=true
|
||||
|
||||
; Options: true, false
|
||||
; play-sound-for-chat-messages=true
|
||||
|
||||
; Options: true, false
|
||||
; fuzzy-search-enabled=false
|
||||
|
||||
; Options: true, false
|
||||
; pick-ghost-cursor=false
|
||||
|
||||
; Options: true, false
|
||||
; show-minimap=true
|
||||
|
||||
; Options: true, false
|
||||
; show-tips-and-tricks=true
|
||||
|
||||
; Options: true, false
|
||||
; show-tutorial-notifications=true
|
||||
|
||||
; Options: true, false
|
||||
; show-turret-radius-when-blueprinting=false
|
||||
|
||||
; Options: true, false
|
||||
; show-item-labels-in-cursor=true
|
||||
|
||||
; Options: true, false
|
||||
; show-rail-block-visualization=true
|
||||
|
||||
; Options: true, false
|
||||
; show-missing-logistic-network-icon=true
|
||||
|
||||
; Options: true, false
|
||||
; show-interaction-indications=true
|
||||
|
||||
; Options: true, false
|
||||
; show-grid-when-paused=true
|
||||
|
||||
; Options: true, false
|
||||
; show-inserter-arrows-when-selected=true
|
||||
|
||||
; Options: true, false
|
||||
; show-inserter-arrows-when-detailed-info-is-on=false
|
||||
|
||||
; Options: true, false
|
||||
; show-pump-arrows-when-detailed-info-is-on=true
|
||||
|
||||
; Options: true, false
|
||||
; show-mining-drill-arrows-when-detailed-info-is-on=true
|
||||
|
||||
; Options: true, false
|
||||
; show-combinator-settings-when-detailed-info-is-on=false
|
||||
|
||||
; Options: true, false
|
||||
; entity-tooltip-on-the-side=true
|
||||
|
||||
; Options: true, false
|
||||
; show-mod-owners-in-tooltips=true
|
||||
|
||||
; Options: true, false
|
||||
; show-descriptions-in-tooltips=true
|
||||
|
||||
; Options: true, false
|
||||
; show-total-raw-in-recipe-tooltips=true
|
||||
|
||||
; debug-font-size=18
|
||||
|
||||
; train-visualization-length=5
|
||||
|
||||
|
||||
[sound]
|
||||
; master-volume=0.800000
|
||||
|
||||
; music-volume=0.500000
|
||||
|
||||
; game-effects-volume=0.700000
|
||||
|
||||
; gui-effects-volume=0.600000
|
||||
|
||||
; walking-sound-volume=0.250000
|
||||
|
||||
; environment-sounds-volume=0.550000
|
||||
|
||||
; alerts-volume=0.500000
|
||||
|
||||
; wind-volume=0.350000
|
||||
|
||||
; audible-distance=40.000000
|
||||
|
||||
; environment-audible-distance=30.000000
|
||||
|
||||
; maximum-environment-sounds=50
|
||||
|
||||
; active-gui-volume-modifier=0.800000
|
||||
|
||||
; active-gui-environment-volume-modifier=0.400000
|
||||
|
||||
; The maximum volume allowed for any sound.
|
||||
; maximum-volume=2.000000
|
||||
|
||||
; ambient-music-pause-mean-seconds=45.000000
|
||||
|
||||
; ambient-music-pause-variance-seconds=30.000000
|
||||
|
||||
; Options: main-tracks-only, interleave-main-tracks-with-interludes, randomize-all
|
||||
; ambient-music-mode=interleave-main-tracks-with-interludes
|
||||
|
||||
; zoom-audible-distance-coefficient=0.500000
|
||||
|
||||
; zoom-volume-coefficient=0.750000
|
||||
|
||||
|
||||
[map-view]
|
||||
; Options: true, false
|
||||
; show-logistic-network=false
|
||||
|
||||
; Options: true, false
|
||||
; show-electric-network=false
|
||||
|
||||
; Options: true, false
|
||||
; show-turret-range=false
|
||||
|
||||
; Options: true, false
|
||||
; show-pollution=true
|
||||
|
||||
; Options: true, false
|
||||
; show-networkless-logistic-members=false
|
||||
|
||||
; Options: true, false
|
||||
; show-train-station-names=true
|
||||
|
||||
; Options: true, false
|
||||
; show-player-names=true
|
||||
|
||||
; Options: true, false
|
||||
; show-non-standard-map-info=false
|
||||
|
||||
|
||||
[debug]
|
||||
; force=enemy
|
||||
|
||||
; Options: true, false
|
||||
; capture-perf-statistics=false
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-fps=debug
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-detailed-info=debug
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-time-usage=debug
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-gpu-time-usage=debug
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-sprite-counts=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-lua-object-statistics=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-heat-buffer-info=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-multiplayer-waiting-icon=debug
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-multiplayer-statistics=debug
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-multiplayer-selection-rectangles=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-debug-info-in-tooltips=debug
|
||||
|
||||
; Options: always, debug, never
|
||||
; hide-mod-guis=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-tile-grid=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-collision-rectangles=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-selection-rectangles=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-render-rectangles=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-entity-positions=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-entity-velocities=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-selected-entity-advanced-tiles=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-selected-input-transport-belts=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-paths=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-path-requests=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-next-waypoint-bb=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-target=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-unit-group-info=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-unit-behavior-info=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-pathfinder-fringe=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-path-cache=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-path-cache-paths=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-rail-paths=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-rolling-stock-count=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-rail-connections=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-rail-joints=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-rail-signal-states=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-rail-segment-collision-boxes=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-train-stop-point=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-train-braking-distance=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-train-signals=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-train-repathing=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-network-connected-entities=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-circuit-network-numbers=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-energy-sources-networks=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-active-state=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-wakeup-lists=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-transport-lines=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-transport-line-gaps=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-pollution-values=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-active-entities-on-chunk-counts=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-active-chunks=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-polluted-chunks=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; hide-chart-tags=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-enemy-expansion-candidate-chunks=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-enemy-expansion-candidate-chunk-values=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-bad-attack-chunks=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-tile-variations=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-raw-tile-transitions=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-fluid-box-fluid-info=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-environment-sound-info=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-environment-sound-area=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-selected-entity-audible-range=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-recently-played-sound-info=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-logistic-robot-targets=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-logistic-robots-on-map=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-recipe-icons-on-map=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-player-robots=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-fire-info=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-sticker-info=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-decorative-names=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-decorative-collision-rectangles=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; allow-increased-zoom=never
|
||||
|
||||
; Options: always, debug, never
|
||||
; show-chunk-components=never
|
||||
|
||||
|
||||
[multiplayer-lobby]
|
||||
; name=
|
||||
|
||||
; description=
|
||||
|
||||
; Options: true, false
|
||||
; visibility-public=true
|
||||
|
||||
; Options: true, false
|
||||
; visibility-steam=true
|
||||
|
||||
; Options: true, false
|
||||
; visibility-lan=true
|
||||
|
||||
; max-players=0
|
||||
|
||||
; Options: true, false
|
||||
; ignore-player-limit-when-returning=false
|
||||
|
||||
; max-upload-in-kilobytes-per-second=0
|
||||
|
||||
; max-upload-slots=5
|
||||
|
||||
; password=
|
||||
|
||||
; tag-list=
|
||||
|
||||
; afk-auto-kick=0
|
||||
|
||||
; Options: true, false, admins-only
|
||||
; allowed-commands=admins-only
|
||||
|
||||
; Options: true, false
|
||||
; only-admins-can-pause=true
|
||||
|
||||
; Options: true, false
|
||||
; autosave-only-on-server=true
|
||||
|
||||
; Options: true, false
|
||||
; non-blocking-saving=true
|
||||
|
||||
; Options: true, false
|
||||
; verify-user-identity=true
|
||||
|
||||
; Options: true, false
|
||||
; enable-whitelist=false
|
||||
|
||||
|
||||
[graphics]
|
||||
; lights-render-quality=0.250000
|
||||
|
||||
; Default preferred display index should force finding primary monitor
|
||||
; preferred-display-index=255
|
||||
|
||||
; screenshots-threads-count=8
|
||||
|
||||
; cache-sprite-atlas-count=1
|
||||
|
||||
; Options: true, false
|
||||
; cache-sprite-atlas=false
|
||||
|
||||
; Options: true, false
|
||||
; compress-sprite-atlas-cache=false
|
||||
|
||||
; Options: true, false
|
||||
; texture-streaming=true
|
||||
|
||||
; streamed-atlas-physical-vram-size=0
|
||||
|
||||
; sprite-vertex-buffer-size=1048576
|
||||
|
||||
; max-texture-size=0
|
||||
|
||||
; max-threads=8
|
||||
|
||||
; 'low' and 'very-low' options are deprecated and will be migrated to 'normal'
|
||||
;
|
||||
; Options: high, normal, low, very-low
|
||||
; graphics-quality=normal
|
||||
|
||||
; brightness=0
|
||||
|
||||
; contrast=0
|
||||
|
||||
; saturation=100
|
||||
|
||||
; Options: true, false
|
||||
; full-screen=true
|
||||
|
||||
; Options: true, false
|
||||
; minimize-on-focus-loss=false
|
||||
|
||||
; Options: true, false
|
||||
; show-smoke=true
|
||||
|
||||
; Options: true, false
|
||||
; show-clouds=true
|
||||
|
||||
; Options: true, false
|
||||
; show-decoratives=true
|
||||
|
||||
; Options: true, false
|
||||
; show-particles=true
|
||||
|
||||
; Options: true, false
|
||||
; show-item-shadows=true
|
||||
|
||||
; Options: true, false
|
||||
; show-inserter-shadows=true
|
||||
|
||||
; Options: true, false
|
||||
; show-animated-water=true
|
||||
|
||||
; Options: true, false
|
||||
; show-tree-distortion=true
|
||||
|
||||
; Options: true, false
|
||||
; force-opengl=false
|
||||
|
||||
; Options: true, false
|
||||
; v-sync=true
|
||||
|
||||
; Options: true, false
|
||||
; high-quality-animations=true
|
||||
|
||||
; Options: true, false
|
||||
; high-quality-shadows=false
|
||||
|
||||
; Options: true, false
|
||||
; high-quality-terrain=true
|
||||
|
||||
; Minimum number of turrets required to turn on the turret range overdraw optimization
|
||||
; turret-overdraw-minimum-count=4
|
||||
|
||||
; Scale at which the turret range overdraw optimization will start being applied
|
||||
; turret-overdraw-scale-threshold=0.200000
|
||||
|
||||
; Options: true, false
|
||||
; skip-vram-detection=false
|
||||
|
||||
; Options: true, false
|
||||
; halt-rendering-when-minimized=true
|
||||
|
||||
; Options: true, false
|
||||
; runtime-sprite-reload=false
|
||||
|
||||
; Options: true, false
|
||||
; full-color-depth=true
|
||||
|
||||
; Options: true, false
|
||||
; render-in-native-resolution=true
|
||||
|
||||
; Options: true, false
|
||||
; use-flip-presentation-model=false
|
||||
|
||||
; Options: true, false
|
||||
; debug-api=false
|
||||
|
||||
; Options: true, false
|
||||
; discard-buffers-on-begin-frame=true
|
||||
|
||||
; Options: all, high, medium, low
|
||||
; video-memory-usage=high
|
||||
|
||||
; Options: none, high-quality, low-quality
|
||||
; texture-compression-level=high-quality
|
||||
|
||||
; Options: true, false
|
||||
; compress-virtual-atlas=true
|
||||
|
||||
; Options: copy, copy-sequential, flip, flip-discard
|
||||
; dxgi-presentation-model=copy
|
||||
|
||||
; Options: none, flush, wait-for-vblank, flush-and-wait-for-vblank
|
||||
; dxgi-action-before-present=none
|
||||
|
||||
; relevant only for flip presentation models
|
||||
;
|
||||
; Options: true, false
|
||||
; dxgi-allow-tearing=false
|
||||
|
||||
; Options: false, true, auto
|
||||
; dxgi-flip-do-not-wait=false
|
||||
|
||||
; Options: true, false
|
||||
; dxgi-present-restart=false
|
||||
|
||||
; dxgi-swap-chain-buffer-count=0
|
||||
|
||||
; dxgi-max-frame-latency=0
|
||||
|
||||
; dxgi-adapter-index=-1
|
||||
|
||||
; max-sprite-loading-threads=32
|
||||
|
||||
; Options: true, false
|
||||
; gpu-accelerated-compression=true
|
||||
|
||||
; Options: true, false
|
||||
; gpu-accelerated-mipmap-compression=true
|
||||
|
||||
; Options: true, false
|
||||
; wait-until-mipmap-generation-finished=true
|
||||
|
||||
; Options: true, false
|
||||
; check-for-unused-pixels=false
|
||||
|
||||
; ogl-depth-buffer-bit-depth=0
|
||||
|
||||
; Options: false, true, auto
|
||||
; ogl-accelerated-renderer=auto
|
||||
|
||||
; Options: true, false
|
||||
; ogl-double-buffered=true
|
||||
|
||||
; Set to true if mipmapped sprites render very blurry on your GPU. Limited support.
|
||||
;
|
||||
; Options: true, false
|
||||
; legacy-gpu-no-mipmaps=false
|
||||
|
||||
; Options: true, false
|
||||
; force-linear-magnification=false
|
||||
|
||||
; Options: true, false
|
||||
; custom-mipmap-workaround=false
|
||||
|
||||
; Options: true, false
|
||||
; buffer-rename-workaround=false
|
||||
|
||||
; Comma separated list of OpenGL extensions that should not be used (for example: ARB_copy_image,KHR_debug)
|
||||
; disabled-opengl-extensions=
|
||||
|
||||
|
@ -1,98 +0,0 @@
|
||||
#!/bin/bash
|
||||
set -eoux pipefail
|
||||
|
||||
FACTORIO_VOL=/factorio
|
||||
LOAD_LATEST_SAVE="${LOAD_LATEST_SAVE:-true}"
|
||||
GENERATE_NEW_SAVE="${GENERATE_NEW_SAVE:-false}"
|
||||
SAVE_NAME="${SAVE_NAME:-""}"
|
||||
|
||||
mkdir -p "$FACTORIO_VOL"
|
||||
mkdir -p "$SAVES"
|
||||
mkdir -p "$CONFIG"
|
||||
mkdir -p "$MODS"
|
||||
mkdir -p "$SCENARIOS"
|
||||
mkdir -p "$SCRIPTOUTPUT"
|
||||
|
||||
if [[ ! -f $CONFIG/rconpw ]]; then
|
||||
# Generate a new RCON password if none exists
|
||||
pwgen 15 1 >"$CONFIG/rconpw"
|
||||
fi
|
||||
|
||||
if [[ ! -f $CONFIG/server-settings.json ]]; then
|
||||
# Copy default settings if server-settings.json doesn't exist
|
||||
cp /opt/factorio/data/server-settings.example.json "$CONFIG/server-settings.json"
|
||||
fi
|
||||
|
||||
if [[ ! -f $CONFIG/map-gen-settings.json ]]; then
|
||||
cp /opt/factorio/data/map-gen-settings.example.json "$CONFIG/map-gen-settings.json"
|
||||
fi
|
||||
|
||||
if [[ ! -f $CONFIG/map-settings.json ]]; then
|
||||
cp /opt/factorio/data/map-settings.example.json "$CONFIG/map-settings.json"
|
||||
fi
|
||||
|
||||
NRTMPSAVES=$( find -L "$SAVES" -iname \*.tmp.zip -mindepth 1 | wc -l )
|
||||
if [[ $NRTMPSAVES -gt 0 ]]; then
|
||||
# Delete incomplete saves (such as after a forced exit)
|
||||
rm -f "$SAVES"/*.tmp.zip
|
||||
fi
|
||||
|
||||
if [[ ${UPDATE_MODS_ON_START:-} == "true" ]]; then
|
||||
./docker-update-mods.sh
|
||||
fi
|
||||
|
||||
if [[ $(id -u) = 0 ]]; then
|
||||
# Update the User and Group ID based on the PUID/PGID variables
|
||||
usermod -o -u "$PUID" factorio
|
||||
groupmod -o -g "$PGID" factorio
|
||||
# Take ownership of factorio data if running as root
|
||||
chown -R factorio:factorio "$FACTORIO_VOL"
|
||||
# Drop to the factorio user
|
||||
SU_EXEC="su-exec factorio"
|
||||
else
|
||||
SU_EXEC=""
|
||||
fi
|
||||
|
||||
sed -i '/write-data=/c\write-data=\/factorio/' /opt/factorio/config/config.ini
|
||||
|
||||
NRSAVES=$(find -L "$SAVES" -iname \*.zip -mindepth 1 | wc -l)
|
||||
if [[ $GENERATE_NEW_SAVE != true && $NRSAVES == 0 ]]; then
|
||||
GENERATE_NEW_SAVE=true
|
||||
SAVE_NAME=_autosave1
|
||||
fi
|
||||
|
||||
if [[ $GENERATE_NEW_SAVE == true ]]; then
|
||||
if [[ -z "$SAVE_NAME" ]]; then
|
||||
echo "If \$GENERATE_NEW_SAVE is true, you must specify \$SAVE_NAME"
|
||||
exit 1
|
||||
fi
|
||||
if [[ -f "$SAVES/$SAVE_NAME.zip" ]]; then
|
||||
echo "Map $SAVES/$SAVE_NAME.zip already exists, skipping map generation"
|
||||
else
|
||||
$SU_EXEC /opt/factorio/bin/x64/factorio \
|
||||
--create "$SAVES/$SAVE_NAME.zip" \
|
||||
--map-gen-settings "$CONFIG/map-gen-settings.json" \
|
||||
--map-settings "$CONFIG/map-settings.json"
|
||||
fi
|
||||
fi
|
||||
|
||||
FLAGS=(\
|
||||
--port "$PORT" \
|
||||
--server-settings "$CONFIG/server-settings.json" \
|
||||
--server-banlist "$CONFIG/server-banlist.json" \
|
||||
--rcon-port "$RCON_PORT" \
|
||||
--server-whitelist "$CONFIG/server-whitelist.json" \
|
||||
--use-server-whitelist \
|
||||
--server-adminlist "$CONFIG/server-adminlist.json" \
|
||||
--rcon-password "$(cat "$CONFIG/rconpw")" \
|
||||
--server-id /factorio/config/server-id.json \
|
||||
)
|
||||
|
||||
if [[ $LOAD_LATEST_SAVE == true ]]; then
|
||||
FLAGS+=( --start-server-load-latest )
|
||||
else
|
||||
FLAGS+=( --start-server "$SAVE_NAME" )
|
||||
fi
|
||||
|
||||
# shellcheck disable=SC2086
|
||||
exec $SU_EXEC /opt/factorio/bin/x64/factorio "${FLAGS[@]}" "$@"
|
@ -1,28 +0,0 @@
|
||||
#!/bin/bash
|
||||
set -eou pipefail
|
||||
|
||||
if [[ -f /run/secrets/username ]]; then
|
||||
USERNAME=$(cat /run/secrets/username)
|
||||
fi
|
||||
|
||||
if [[ -f /run/secrets/token ]]; then
|
||||
TOKEN=$(cat /run/secrets/token)
|
||||
fi
|
||||
|
||||
if [[ -z ${USERNAME:-} ]]; then
|
||||
USERNAME="$(jq -j ".username" "$CONFIG/server-settings.json")"
|
||||
fi
|
||||
|
||||
if [[ -z ${TOKEN:-} ]]; then
|
||||
TOKEN="$(jq -j ".token" "$CONFIG/server-settings.json")"
|
||||
fi
|
||||
|
||||
if [[ -z ${USERNAME:-} ]]; then
|
||||
echo "You need to provide your Factorio username to update mods."
|
||||
fi
|
||||
|
||||
if [[ -z ${TOKEN:-} ]]; then
|
||||
echo "You need to provide your Factorio token to update mods."
|
||||
fi
|
||||
|
||||
./update-mods.sh "$VERSION" "$MODS" "$USERNAME" "$TOKEN"
|
@ -1,44 +0,0 @@
|
||||
#!/bin/bash
|
||||
set -eoux pipefail
|
||||
|
||||
if [[ -z ${1:-} ]]; then
|
||||
echo "No argument supplied"
|
||||
fi
|
||||
|
||||
SERVER_SCENARIO="$1"
|
||||
mkdir -p "$SAVES"
|
||||
mkdir -p "$CONFIG"
|
||||
mkdir -p "$MODS"
|
||||
mkdir -p "$SCENARIOS"
|
||||
|
||||
#chown -R factorio /factorio
|
||||
|
||||
if [[ ! -f $CONFIG/rconpw ]]; then
|
||||
pwgen 15 1 >"$CONFIG/rconpw"
|
||||
fi
|
||||
|
||||
if [[ ! -f $CONFIG/server-settings.json ]]; then
|
||||
cp /opt/factorio/data/server-settings.example.json "$CONFIG/server-settings.json"
|
||||
fi
|
||||
|
||||
if [[ ! -f $CONFIG/map-gen-settings.json ]]; then
|
||||
cp /opt/factorio/data/map-gen-settings.example.json "$CONFIG/map-gen-settings.json"
|
||||
fi
|
||||
|
||||
if [[ ! -f $CONFIG/map-settings.json ]]; then
|
||||
cp /opt/factorio/data/map-settings.example.json "$CONFIG/map-settings.json"
|
||||
fi
|
||||
|
||||
exec /opt/factorio/bin/x64/factorio \
|
||||
--port "$PORT" \
|
||||
--start-server-load-scenario "$SERVER_SCENARIO" \
|
||||
--map-gen-settings "$CONFIG/map-gen-settings.json" \
|
||||
--map-settings "$CONFIG/map-settings.json" \
|
||||
--server-settings "$CONFIG/server-settings.json" \
|
||||
--server-banlist "$CONFIG/server-banlist.json" \
|
||||
--server-whitelist "$CONFIG/server-whitelist.json" \
|
||||
--use-server-whitelist \
|
||||
--server-adminlist "$CONFIG/server-adminlist.json" \
|
||||
--rcon-port "$RCON_PORT" \
|
||||
--rcon-password "$(cat "$CONFIG/rconpw")" \
|
||||
--server-id /factorio/config/server-id.json
|
@ -1,27 +0,0 @@
|
||||
#!/bin/bash
|
||||
set -eoux pipefail
|
||||
|
||||
if [[ -z ${1:-} ]]; then
|
||||
echo "No argument supplied"
|
||||
fi
|
||||
|
||||
SERVER_SCENARIO="$1"
|
||||
mkdir -p "$SAVES"
|
||||
mkdir -p "$CONFIG"
|
||||
mkdir -p "$MODS"
|
||||
mkdir -p "$SCENARIOS"
|
||||
|
||||
if [[ ! -f $CONFIG/server-settings.json ]]; then
|
||||
cp /opt/factorio/data/server-settings.example.json "$CONFIG/server-settings.json"
|
||||
fi
|
||||
|
||||
if [[ ! -f $CONFIG/map-gen-settings.json ]]; then
|
||||
cp /opt/factorio/data/map-gen-settings.example.json "$CONFIG/map-gen-settings.json"
|
||||
fi
|
||||
|
||||
if [[ ! -f $CONFIG/map-settings.json ]]; then
|
||||
cp /opt/factorio/data/map-settings.example.json "$CONFIG/map-settings.json"
|
||||
fi
|
||||
|
||||
exec /opt/factorio/bin/x64/factorio \
|
||||
--scenario2map "$SERVER_SCENARIO"
|
@ -1,96 +0,0 @@
|
||||
#!/bin/bash
|
||||
set -eou pipefail
|
||||
|
||||
FACTORIO_VERSION=$1
|
||||
MOD_DIR=$2
|
||||
USERNAME=$3
|
||||
TOKEN=$4
|
||||
|
||||
MOD_BASE_URL="https://mods.factorio.com"
|
||||
|
||||
print_step()
|
||||
{
|
||||
echo "$1"
|
||||
}
|
||||
|
||||
print_success()
|
||||
{
|
||||
echo "$1"
|
||||
}
|
||||
|
||||
print_failure()
|
||||
{
|
||||
echo "$1"
|
||||
}
|
||||
|
||||
update_mod()
|
||||
{
|
||||
MOD_NAME="$1"
|
||||
MOD_NAME_ENCODED="${1// /%20}"
|
||||
|
||||
print_step "Checking for update of mod $MOD_NAME..."
|
||||
|
||||
MOD_INFO_URL="$MOD_BASE_URL/api/mods/$MOD_NAME_ENCODED"
|
||||
MOD_INFO_JSON=$(curl --silent "$MOD_INFO_URL")
|
||||
|
||||
if ! echo "$MOD_INFO_JSON" | jq -e .name >/dev/null; then
|
||||
print_success " Custom mod not on $MOD_BASE_URL, skipped."
|
||||
return 0
|
||||
fi
|
||||
|
||||
MOD_INFO=$(echo "$MOD_INFO_JSON" | jq -j --arg version "$FACTORIO_VERSION" ".releases|reverse|map(select(.info_json.factorio_version as \$mod_version | \$version | startswith(\$mod_version)))[0]|.file_name, \";\", .download_url, \";\", .sha1")
|
||||
|
||||
MOD_FILENAME=$(echo "$MOD_INFO" | cut -f1 -d";")
|
||||
MOD_URL=$(echo "$MOD_INFO" | cut -f2 -d";")
|
||||
MOD_SHA1=$(echo "$MOD_INFO" | cut -f3 -d";")
|
||||
|
||||
if [[ $MOD_FILENAME == null ]]; then
|
||||
print_failure " Not compatible with version"
|
||||
return 0
|
||||
fi
|
||||
|
||||
if [[ -f $MOD_DIR/$MOD_FILENAME ]]; then
|
||||
print_success " Already up-to-date."
|
||||
return 0
|
||||
fi
|
||||
|
||||
print_step "Downloading..."
|
||||
FULL_URL="$MOD_BASE_URL$MOD_URL?username=$USERNAME&token=$TOKEN"
|
||||
HTTP_STATUS=$(curl --silent -L -w "%{http_code}" -o "$MOD_DIR/$MOD_FILENAME" "$FULL_URL")
|
||||
|
||||
if [[ $HTTP_STATUS != 200 ]]; then
|
||||
print_failure " Download failed: Code $HTTP_STATUS."
|
||||
rm -f "$MOD_DIR/$MOD_FILENAME"
|
||||
return 1
|
||||
fi
|
||||
|
||||
if [[ ! -f $MOD_DIR/$MOD_FILENAME ]]; then
|
||||
print_failure " Downloaded file missing!"
|
||||
return 1
|
||||
fi
|
||||
|
||||
if ! [[ $(sha1sum "$MOD_DIR/$MOD_FILENAME") =~ $MOD_SHA1 ]]; then
|
||||
print_failure " SHA1 mismatch!"
|
||||
rm -f "$MOD_DIR/$MOD_FILENAME"
|
||||
return 1
|
||||
fi
|
||||
|
||||
print_success " Download complete."
|
||||
|
||||
for file in "$MOD_DIR/${MOD_NAME}_"*".zip"; do # wildcard does usually not work in quotes: https://unix.stackexchange.com/a/67761
|
||||
if [[ $file != $MOD_DIR/$MOD_FILENAME ]]; then
|
||||
print_success " Deleting old version: $file"
|
||||
rm -f "$file"
|
||||
fi
|
||||
done
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
if [[ -f $MOD_DIR/mod-list.json ]]; then
|
||||
jq -r ".mods|map(select(.enabled))|.[].name" "$MOD_DIR/mod-list.json" | while read -r mod; do
|
||||
if [[ $mod != base ]]; then
|
||||
update_mod "$mod"
|
||||
fi
|
||||
done
|
||||
fi
|
135
README.md
135
README.md
@ -1,19 +1,53 @@
|
||||
# Factorio [](https://travis-ci.org/factoriotools/factorio-docker)  [](https://hub.docker.com/r/factoriotools/factorio/) [](https://hub.docker.com/r/factoriotools/factorio/) [](https://hub.docker.com/r/factoriotools/factorio/) [](https://microbadger.com/images/factoriotools/factorio "Get your own image badge on microbadger.com")
|
||||
# Factorio [](https://hub.docker.com/r/factoriotools/factorio/) [](https://hub.docker.com/r/factoriotools/factorio/) [](https://hub.docker.com/r/factoriotools/factorio/)
|
||||
|
||||
> [!NOTE]
|
||||
> Support for ARM is experimental. Expect crashes and lag if you try to run this on a raspberry pi.
|
||||
|
||||
[中文](./README_zh_CN.md)
|
||||
|
||||
* `1.1.32`, `1.1`, `latest`, `stable` [(1.1/Dockerfile)](https://github.com/factoriotools/factorio-docker/blob/master/1.1/Dockerfile)
|
||||
* `1.0.0`, `1.0` [(1.0/Dockerfile)](https://github.com/factoriotools/factorio-docker/blob/master/1.0/Dockerfile)
|
||||
* `0.18.47`, `0.18` [(0.18/Dockerfile)](https://github.com/factoriotools/factorio-docker/blob/master/0.18/Dockerfile)
|
||||
* `0.17.79`, `0.17` [(0.17/Dockerfile)](https://github.com/factoriotools/factorio-docker/blob/master/0.17/Dockerfile)
|
||||
* `0.16.51`, `0.16` [(0.16/Dockerfile)](https://github.com/factoriotools/factorio-docker/blob/master/0.16/Dockerfile)
|
||||
* `0.15.40`, `0.15` [(0.15/Dockerfile)](https://github.com/factoriotools/factorio-docker/blob/master/0.15/Dockerfile)
|
||||
* `0.14.23`, `0.14` [(0.14/Dockerfile)](https://github.com/factoriotools/factorio-docker/blob/master/0.14/Dockerfile)
|
||||
<!-- start autogeneration tags -->
|
||||
* `2.0.41`, `latest`
|
||||
* `2.0.40`
|
||||
* `2`, `2.0`, `2.0.39`, `stable`, `stable-2.0.39`
|
||||
* `2.0.38`
|
||||
* `2.0.37`
|
||||
* `2.0.36`
|
||||
* `2.0.35`
|
||||
* `2.0.34`
|
||||
* `2.0.33`
|
||||
* `2.0`, `2.0.32`, `stable-2.0.32`
|
||||
* `2.0.31`
|
||||
* `2.0`, `2.0.30`, `stable-2.0.30`
|
||||
* `2.0.29`
|
||||
* `2.0`, `2.0.28`, `stable-2.0.28`
|
||||
* `2.0.27`
|
||||
* `2.0.26`
|
||||
* `2.0.25`
|
||||
* `2.0.24`
|
||||
* `2.0`, `2.0.23`, `stable-2.0.23`
|
||||
* `2.0.22`
|
||||
* `2.0`, `2.0.21`, `stable-2.0.21`
|
||||
* `2.0`, `2.0.20`, `stable-2.0.20`
|
||||
* `2.0.19`
|
||||
* `2.0.18`
|
||||
* `2.0.17`
|
||||
* `2.0.16`
|
||||
* `2.0`, `2.0.15`, `stable-2.0.15`
|
||||
* `2.0`, `2.0.14`, `stable-2.0.14`
|
||||
* `2.0`, `2.0.13`, `stable-2.0.13`
|
||||
* `1`, `1.1`, `1.1.110`, `stable-1.1.110`
|
||||
* `1.0`, `1.0.0`
|
||||
* `0.17`, `0.17.79`
|
||||
* `0.16`, `0.16.51`
|
||||
* `0.15`, `0.15.40`
|
||||
* `0.14`, `0.14.23`
|
||||
* `0.13`, `0.13.20`
|
||||
* `0.12`, `0.12.35`<!-- end autogeneration tags -->
|
||||
|
||||
## Tag descriptions
|
||||
|
||||
* `latest` - most up-to-date version (may be experimental).
|
||||
* `stable` - version declared stable on [factorio.com](https://www.factorio.com).
|
||||
* `stable` - version declared stable on [factorio.com](https://www.factorio.com) ([FFF-435 Since 2.0 versions gets released as experimental first, once stable it will be marked as stable](https://factorio.com/blog/post/fff-435)).
|
||||
* `0.x` - latest version in a branch.
|
||||
* `0.x.y` - a specific version.
|
||||
* `0.x-z` - incremental fix for that version.
|
||||
@ -42,7 +76,7 @@ sudo docker run -d \
|
||||
-p 27015:27015/tcp \
|
||||
-v /opt/factorio:/factorio \
|
||||
--name factorio \
|
||||
--restart=always \
|
||||
--restart=unless-stopped \
|
||||
factoriotools/factorio
|
||||
```
|
||||
|
||||
@ -87,11 +121,20 @@ docker run -d -it \
|
||||
docker attach factorio
|
||||
```
|
||||
|
||||
### RCON (2.0.18+)
|
||||
|
||||
Alternativly (e.g. for scripting) the RCON connection can be used to send commands to the running factorio server.
|
||||
This does not require the RCON connection to be exposed.
|
||||
|
||||
```shell
|
||||
docker exec factorio rcon /h
|
||||
```
|
||||
|
||||
### Upgrading
|
||||
|
||||
Before upgrading backup the save. It's easy to make a save in the client.
|
||||
|
||||
Ensure `-v` was used to run the server so the save is outside of the Docker container. The `docker rm` command completely destroys the container, which includes the save if it isn't stored in an data volume.
|
||||
Ensure `-v` was used to run the server so the save is outside of the Docker container. The `docker rm` command completely destroys the container, which includes the save if it isn't stored in a data volume.
|
||||
|
||||
Delete the container and refresh the image:
|
||||
|
||||
@ -125,7 +168,7 @@ sudo docker run -d \
|
||||
-e LOAD_LATEST_SAVE=false \
|
||||
-e SAVE_NAME=replaceme \
|
||||
--name factorio \
|
||||
--restart=always \
|
||||
--restart=unless-stopped \
|
||||
factoriotools/factorio
|
||||
```
|
||||
|
||||
@ -140,7 +183,7 @@ sudo docker run -d \
|
||||
-e GENERATE_NEW_SAVE=true \
|
||||
-e SAVE_NAME=replaceme \
|
||||
--name factorio \
|
||||
--restart=always \
|
||||
--restart=unless-stopped \
|
||||
factoriotools/factorio
|
||||
```
|
||||
|
||||
@ -160,7 +203,7 @@ docker run -d \
|
||||
-p 27015:27015/tcp \
|
||||
-v /opt/factorio:/factorio \
|
||||
--name factorio \
|
||||
--restart=always \
|
||||
--restart=unless-stopped \
|
||||
--entrypoint "/scenario.sh" \
|
||||
factoriotools/factorio \
|
||||
MyScenarioName
|
||||
@ -176,7 +219,7 @@ docker run -d \
|
||||
-p 27015:27015/tcp \
|
||||
-v /opt/factorio:/factorio \
|
||||
--name factorio \
|
||||
--restart=always \
|
||||
--restart=unless-stopped \
|
||||
--entrypoint "/scenario2map.sh" \
|
||||
factoriotools/factorio
|
||||
MyScenarioName
|
||||
@ -207,8 +250,8 @@ Create file `config/server-banlist.json` and add the banlisted users.
|
||||
|
||||
```json
|
||||
[
|
||||
"bad_person",
|
||||
"other_bad_person"
|
||||
"bad_person",
|
||||
"other_bad_person"
|
||||
]
|
||||
```
|
||||
|
||||
@ -218,8 +261,8 @@ Create file `config/server-adminlist.json` and add the adminlisted users.
|
||||
|
||||
```json
|
||||
[
|
||||
"you",
|
||||
"friend"
|
||||
"you",
|
||||
"friend"
|
||||
]
|
||||
```
|
||||
|
||||
@ -250,6 +293,27 @@ The `server-settings.json` file may then contain the variable references like th
|
||||
"description": "${INSTANCE_DESC}",
|
||||
```
|
||||
|
||||
### Environment Variables
|
||||
|
||||
These are the environment variables which can be specified at container run time.
|
||||
|
||||
| Variable Name | Description | Default | Available in |
|
||||
|----------------------|----------------------------------------------------------------------|----------------|--------------|
|
||||
| GENERATE_NEW_SAVE | Generate a new save if one does not exist before starting the server | false | 0.17+ |
|
||||
| LOAD_LATEST_SAVE | Load latest when true. Otherwise load SAVE_NAME | true | 0.17+ |
|
||||
| PORT | UDP port the server listens on | 34197 | 0.15+ |
|
||||
| BIND | IP address (v4 or v6) the server listens on (IP\[:PORT]) | | 0.15+ |
|
||||
| RCON_PORT | TCP port the rcon server listens on | 27015 | 0.15+ |
|
||||
| SAVE_NAME | Name to use for the save file | _autosave1 | 0.17+ |
|
||||
| TOKEN | factorio.com token | | 0.17+ |
|
||||
| UPDATE_MODS_ON_START | If mods should be updated before starting the server | | 0.17+ |
|
||||
| USERNAME | factorio.com username | | 0.17+ |
|
||||
| CONSOLE_LOG_LOCATION | Saves the console log to the specifies location | | |
|
||||
| DLC_SPACE_AGE | Enables or disables the mods for DLC Space Age in mod-list.json[^1] | true | 2.0.8+ |
|
||||
| MODS | Mod directory to use | /factorio/mods | 2.0.8+ |
|
||||
|
||||
**Note:** All environment variables are compared as strings
|
||||
|
||||
## Container Details
|
||||
|
||||
The philosophy is to [keep it simple](http://wiki.c2.com/?KeepItSimple).
|
||||
@ -284,16 +348,19 @@ The files in this volume should be owned by the factorio user, uid 845.
|
||||
|
||||
[Docker Compose](https://docs.docker.com/compose/install/) is an easy way to run Docker containers.
|
||||
|
||||
First get a [docker-compose.yml](https://github.com/factoriotools/factorio-docker/blob/master/0.17/docker-compose.yml) file. To get it from this repository:
|
||||
* docker-engine >= 1.10.0 is required
|
||||
* docker-compose >=1.6.0 is required
|
||||
|
||||
First get a [docker-compose.yml](https://github.com/factoriotools/factorio-docker/blob/master/docker/docker-compose.yml) file. To get it from this repository:
|
||||
|
||||
```shell
|
||||
git clone https://github.com/factoriotools/factorio-docker.git
|
||||
cd docker_factorio_server/0.17
|
||||
cd factorio-docker/docker
|
||||
```
|
||||
|
||||
Or make your own:
|
||||
|
||||
```shell
|
||||
```yaml
|
||||
version: '2'
|
||||
services:
|
||||
factorio:
|
||||
@ -322,7 +389,7 @@ sudo docker-compose up -d
|
||||
|
||||
Ensure the `lan` setting in server-settings.json is `true`.
|
||||
|
||||
```shell
|
||||
```json
|
||||
"visibility":
|
||||
{
|
||||
"public": false,
|
||||
@ -339,7 +406,7 @@ sudo docker run -d \
|
||||
-p 27015:27015/tcp \
|
||||
-v /opt/factorio:/factorio \
|
||||
--name factorio \
|
||||
--restart=always \
|
||||
--restart=unless-stopped \
|
||||
factoriotools/factorio
|
||||
```
|
||||
|
||||
@ -360,6 +427,21 @@ For LAN games the VM needs an internal IP in order for clients to connect. One w
|
||||
|
||||
If you're looking for a simple way to deploy this to the Amazon Web Services Cloud, check out the [Factorio Server Deployment (CloudFormation) repository](https://github.com/m-chandler/factorio-spot-pricing). This repository contains a CloudFormation template that will get you up and running in AWS in a matter of minutes. Optionally it uses Spot Pricing so the server is very cheap, and you can easily turn it off when not in use.
|
||||
|
||||
## Using a reverse proxy
|
||||
|
||||
If you need to use a reverse proxy you can use the following nginx snippet:
|
||||
|
||||
```
|
||||
stream {
|
||||
server {
|
||||
listen 34197 udp reuseport;
|
||||
proxy_pass my.upstream.host:34197;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
If your factorio host uses multiple IP addresses (very common with IPv6), you might additionally need to bind Factorio to a single IP (otherwise the UDP proxy might get confused with IP mismatches). To do that pass the `BIND` envvar to the container: `docker run --network=host -e BIND=2a02:1234::5678 ...`
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### My server is listed in the server browser, but nobody can connect
|
||||
@ -386,3 +468,8 @@ Use the `PORT` environment variable to start the server on the a different port,
|
||||
* [bplein](https://github.com/bplein/docker_factorio_server) - Coded scenario support
|
||||
* [jaredledvina](https://github.com/jaredledvina/docker_factorio_server) - Contributed version updates
|
||||
* [carlbennett](https://github.com/carlbennett) - Contributed version updates and bugfixes
|
||||
|
||||
[^1]: Space Age mods can also be individually enabled by using their name separated by space.
|
||||
Example 1: Enable all by using `true`
|
||||
Example 2: Enable all by listing the mod names `space-age elevated-rails quality`
|
||||
Example 3: Enable only Elevated rails `elevated-rails`
|
||||
|
@ -10,7 +10,7 @@
|
||||
* `0.x.y` - 具体的版本
|
||||
* `0.x-z` - 在该版本上的增量更新
|
||||
|
||||
## 什么是 Facotrio?
|
||||
## 什么是 Factorio?
|
||||
|
||||
> 摘录自 [steam factorio 页面](https://store.steampowered.com/app/427520/Factorio/)
|
||||
|
||||
|
109
build.py
Executable file
109
build.py
Executable file
@ -0,0 +1,109 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import os
|
||||
import json
|
||||
import subprocess
|
||||
import shutil
|
||||
import sys
|
||||
import tempfile
|
||||
|
||||
|
||||
PLATFORMS = [
|
||||
"linux/arm64",
|
||||
"linux/amd64",
|
||||
]
|
||||
|
||||
|
||||
def create_builder(build_dir, builder_name, platform):
|
||||
check_exists_command = ["docker", "buildx", "inspect", builder_name]
|
||||
if subprocess.run(check_exists_command, stderr=subprocess.DEVNULL).returncode != 0:
|
||||
create_command = ["docker", "buildx", "create", "--platform", platform, "--name", builder_name]
|
||||
try:
|
||||
subprocess.run(create_command, cwd=build_dir, check=True)
|
||||
except subprocess.CalledProcessError:
|
||||
print("Creating builder failed")
|
||||
exit(1)
|
||||
|
||||
|
||||
def build_and_push_multiarch(build_dir, build_args, push):
|
||||
builder_name = "factoriotools-multiarch"
|
||||
platform=",".join(PLATFORMS)
|
||||
create_builder(build_dir, builder_name, platform)
|
||||
build_command = ["docker", "buildx", "build", "--platform", platform, "--builder", builder_name] + build_args
|
||||
if push:
|
||||
build_command.append("--push")
|
||||
try:
|
||||
subprocess.run(build_command, cwd=build_dir, check=True)
|
||||
except subprocess.CalledProcessError:
|
||||
print("Build and push of image failed")
|
||||
exit(1)
|
||||
|
||||
|
||||
def build_singlearch(build_dir, build_args):
|
||||
build_command = ["docker", "build"] + build_args
|
||||
try:
|
||||
subprocess.run(build_command, cwd=build_dir, check=True)
|
||||
except subprocess.CalledProcessError:
|
||||
print("Build of image failed")
|
||||
exit(1)
|
||||
|
||||
|
||||
def push_singlearch(tags):
|
||||
for tag in tags:
|
||||
try:
|
||||
subprocess.run(["docker", "push", f"factoriotools/factorio:{tag}"],
|
||||
check=True)
|
||||
except subprocess.CalledProcessError:
|
||||
print("Docker push failed")
|
||||
exit(1)
|
||||
|
||||
|
||||
def build_and_push(sha256, version, tags, push, multiarch):
|
||||
build_dir = tempfile.mktemp()
|
||||
shutil.copytree("docker", build_dir)
|
||||
build_args = ["--build-arg", f"VERSION={version}", "--build-arg", f"SHA256={sha256}", "."]
|
||||
for tag in tags:
|
||||
build_args.extend(["-t", f"factoriotools/factorio:{tag}"])
|
||||
if multiarch:
|
||||
build_and_push_multiarch(build_dir, build_args, push)
|
||||
else:
|
||||
build_singlearch(build_dir, build_args)
|
||||
if push:
|
||||
push_singlearch(tags)
|
||||
|
||||
|
||||
def login():
|
||||
try:
|
||||
username = os.environ["DOCKER_USERNAME"]
|
||||
password = os.environ["DOCKER_PASSWORD"]
|
||||
subprocess.run(["docker", "login", "-u", username, "-p", password], check=True)
|
||||
except KeyError:
|
||||
print("Username and password need to be given")
|
||||
exit(1)
|
||||
except subprocess.CalledProcessError:
|
||||
print("Docker login failed")
|
||||
exit(1)
|
||||
|
||||
|
||||
def main(push_tags=False, multiarch=False):
|
||||
with open(os.path.join(os.path.dirname(__file__), "buildinfo.json")) as file_handle:
|
||||
builddata = json.load(file_handle)
|
||||
|
||||
if push_tags:
|
||||
login()
|
||||
|
||||
for version, buildinfo in sorted(builddata.items(), key=lambda item: item[0], reverse=True):
|
||||
sha256 = buildinfo["sha256"]
|
||||
tags = buildinfo["tags"]
|
||||
build_and_push(sha256, version, tags, push_tags, multiarch)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
push_tags = False
|
||||
multiarch = False
|
||||
for arg in sys.argv[1:]:
|
||||
if arg == "--push-tags":
|
||||
push_tags = True
|
||||
elif arg == "--multiarch":
|
||||
multiarch = True
|
||||
main(push_tags, multiarch)
|
@ -101,6 +101,4 @@ if [[ $VERSION == "${BRANCH_VERSION:-}" && ${GITHUB_BASE_REF:-} == "" ]] ||
|
||||
if [[ ${STABLE:-} == "$VERSION" ]]; then
|
||||
docker push "$DOCKER_REPO:stable"
|
||||
fi
|
||||
|
||||
curl -X POST https://hooks.microbadger.com/images/factoriotools/factorio/TmmKGNp8jKcFqZvcJhTCIAJVluw=
|
||||
fi
|
257
buildinfo.json
Normal file
257
buildinfo.json
Normal file
@ -0,0 +1,257 @@
|
||||
{
|
||||
"0.12.35": {
|
||||
"sha256": "ab9cf01a56dde3073aaaa5152c628bbf9a5bb85638b87dc3d7fdb77fb169aedd",
|
||||
"tags": [
|
||||
"0.12.35",
|
||||
"0.12"
|
||||
]
|
||||
},
|
||||
"0.13.20": {
|
||||
"sha256": "cbf5481e4b7e0efcc07c7b6a1fc3ff1404ad5597f3c9d37914a52ffb58d7c159",
|
||||
"tags": [
|
||||
"0.13.20",
|
||||
"0.13"
|
||||
]
|
||||
},
|
||||
"0.14.23": {
|
||||
"sha256": "96c3e7acd4e0f066a499baba01823cac7c1caf0e50dbddcea5793f57bd60dc8c",
|
||||
"tags": [
|
||||
"0.14.23",
|
||||
"0.14"
|
||||
]
|
||||
},
|
||||
"0.15.40": {
|
||||
"sha256": "1041ef61ea4aecd1f425e6030a909f0c349a9c01d1b3324d84a61b1cfef5ba6c",
|
||||
"tags": [
|
||||
"0.15.40",
|
||||
"0.15"
|
||||
]
|
||||
},
|
||||
"0.16.51": {
|
||||
"sha256": "6cb09f5ac87f16f8d5b43cef26c0ae26cc46a57a0382e253dfda032dc5bb367f",
|
||||
"tags": [
|
||||
"0.16.51",
|
||||
"0.16"
|
||||
]
|
||||
},
|
||||
"0.17.79": {
|
||||
"sha256": "9ace12fa986df028dc1851bf4de2cb038044d743e98823bc1c48ba21aa4d23df",
|
||||
"tags": [
|
||||
"0.17.79",
|
||||
"0.17"
|
||||
]
|
||||
},
|
||||
"1.0.0": {
|
||||
"sha256": "81d9e1aa94435aeec4131c8869fa6e9331726bea1ea31db750b65ba42dbd1464",
|
||||
"tags": [
|
||||
"1.0.0",
|
||||
"1.0"
|
||||
]
|
||||
},
|
||||
"1.1.110": {
|
||||
"sha256": "485fe6db36e5decd7dd0d70e7c97e61f818100fa3e48d87884b287027c7a646a",
|
||||
"tags": [
|
||||
"stable-1.1.110",
|
||||
"1",
|
||||
"1.1",
|
||||
"1.1.110"
|
||||
]
|
||||
},
|
||||
"2.0.13": {
|
||||
"sha256": "27b36901a39e593adf28418c0286142c6c7a9f83d156963c7369bd405a25c7d1",
|
||||
"tags": [
|
||||
"stable-2.0.13",
|
||||
"2.0",
|
||||
"2.0.13"
|
||||
]
|
||||
},
|
||||
"2.0.14": {
|
||||
"sha256": "5a4bc4c3b2a97ed1fc58eb796321e848dcc64435bd91013dd9c78a14a8ce8815",
|
||||
"tags": [
|
||||
"stable-2.0.14",
|
||||
"2.0",
|
||||
"2.0.14"
|
||||
]
|
||||
},
|
||||
"2.0.15": {
|
||||
"sha256": "70b441cb807811a60586c01107248c1d8d7ae043bd1f23675fc924fbaaa538d8",
|
||||
"tags": [
|
||||
"stable-2.0.15",
|
||||
"2.0",
|
||||
"2.0.15"
|
||||
]
|
||||
},
|
||||
"2.0.16": {
|
||||
"sha256": "f2069b4b746500d945eeb67ef7eda5e7aebe7fd0294c2af4e117af22a3bbaea3",
|
||||
"tags": [
|
||||
"2.0.16"
|
||||
]
|
||||
},
|
||||
"2.0.17": {
|
||||
"sha256": "183407f2fb21e05152442ffb5f15ffb283994339ca6a51b3559a257c30505e5e",
|
||||
"tags": [
|
||||
"2.0.17"
|
||||
]
|
||||
},
|
||||
"2.0.18": {
|
||||
"sha256": "f378a1dc8a545c13d8ca616cbe72d245aa3ce93e3f219d8d60d3c06c7df82dc0",
|
||||
"tags": [
|
||||
"2.0.18"
|
||||
]
|
||||
},
|
||||
"2.0.19": {
|
||||
"sha256": "2e27aca3a7f65b50916d14a62203b6861cbe657e8d2dbd8f813e0a606efce9c7",
|
||||
"tags": [
|
||||
"2.0.19"
|
||||
]
|
||||
},
|
||||
"2.0.20": {
|
||||
"sha256": "c4a901f2f1dbedbb41654560db4c6fab683a30c20334e805d4ef740c0416515a",
|
||||
"tags": [
|
||||
"stable-2.0.20",
|
||||
"2.0",
|
||||
"2.0.20"
|
||||
]
|
||||
},
|
||||
"2.0.21": {
|
||||
"sha256": "1d6d2785006d6a8d9d5fdcdaa7097a189ec35ba95f3521025dc4e046f7a1398e",
|
||||
"tags": [
|
||||
"stable-2.0.21",
|
||||
"2.0",
|
||||
"2.0.21"
|
||||
]
|
||||
},
|
||||
"2.0.22": {
|
||||
"sha256": "14c3eea7600fbe7f35bca52fe4c277e8f5e23b34c35ebebaa46c6752c750cb85",
|
||||
"tags": [
|
||||
"2.0.22"
|
||||
]
|
||||
},
|
||||
"2.0.23": {
|
||||
"sha256": "e819fc9ad6df061bf9d4bffc91988dd18d0e3982c8b1c22c0525d78bda3ef216",
|
||||
"tags": [
|
||||
"stable-2.0.23",
|
||||
"2.0",
|
||||
"2.0.23"
|
||||
]
|
||||
},
|
||||
"2.0.24": {
|
||||
"sha256": "4644acc4195391fe19a7468c546d10a494ce1a188964c79f20cb0fa050b67120",
|
||||
"tags": [
|
||||
"2.0.24"
|
||||
]
|
||||
},
|
||||
"2.0.25": {
|
||||
"sha256": "0d1698f1f29759ff27faa6a5d9c3804377cb1767f2692003a8e9d4c294845e5a",
|
||||
"tags": [
|
||||
"2.0.25"
|
||||
]
|
||||
},
|
||||
"2.0.26": {
|
||||
"sha256": "a401024039372a53b9a29b7deb4ac279cd9a34abe69426a109a13a9a1c599f1f",
|
||||
"tags": [
|
||||
"2.0.26"
|
||||
]
|
||||
},
|
||||
"2.0.27": {
|
||||
"sha256": "63c75ce74cd9d1e4b65ae9f98e9865abdbe3d600fb3259dcda5ea69a512b2993",
|
||||
"tags": [
|
||||
"2.0.27"
|
||||
]
|
||||
},
|
||||
"2.0.28": {
|
||||
"sha256": "ea9937b6adc7a18e17a4e1e64992ec389407497b36e68280bb14fcdd4c884dd3",
|
||||
"tags": [
|
||||
"stable-2.0.28",
|
||||
"2.0",
|
||||
"2.0.28"
|
||||
]
|
||||
},
|
||||
"2.0.29": {
|
||||
"sha256": "54088c9cacfddbce2e7bf90604fea095ff723e70d9bb056e1fb469b900a50f09",
|
||||
"tags": [
|
||||
"2.0.29"
|
||||
]
|
||||
},
|
||||
"2.0.30": {
|
||||
"sha256": "4137824a20e1f3298410432c85e62d0eb46b0dab1a8411c233699f890d4c1668",
|
||||
"tags": [
|
||||
"stable-2.0.30",
|
||||
"2.0",
|
||||
"2.0.30"
|
||||
]
|
||||
},
|
||||
"2.0.31": {
|
||||
"sha256": "0ee39ff6181ef41b606b7ba1ab5c04d8f81579ef56ec4947e4d74ce5d192b5d5",
|
||||
"tags": [
|
||||
"2.0.31"
|
||||
]
|
||||
},
|
||||
"2.0.32": {
|
||||
"sha256": "2a6102ae42dcc5e8fe923bd68bcd326a569e35912acde121301e5d4d2d856417",
|
||||
"tags": [
|
||||
"stable-2.0.32",
|
||||
"2.0",
|
||||
"2.0.32"
|
||||
]
|
||||
},
|
||||
"2.0.33": {
|
||||
"sha256": "9365a34d1724e5c9f592cc9da511485e2fa7da1c12df08029bce478586ba4b7b",
|
||||
"tags": [
|
||||
"2.0.33"
|
||||
]
|
||||
},
|
||||
"2.0.34": {
|
||||
"sha256": "9511462203ebb2763f9f8623bb17f3070041ae3cbd7d80284c1e9bb38c09fc40",
|
||||
"tags": [
|
||||
"2.0.34"
|
||||
]
|
||||
},
|
||||
"2.0.35": {
|
||||
"sha256": "31cd58eaf4b06cc0dc5d82640f7adf2366aa9da64133d2c228f1308f1060a990",
|
||||
"tags": [
|
||||
"2.0.35"
|
||||
]
|
||||
},
|
||||
"2.0.36": {
|
||||
"sha256": "e94567b986654f1f7c3ec5c8bd151e3768b4ab9ab9cc389f6b9fd8e0dab32ce2",
|
||||
"tags": [
|
||||
"2.0.36"
|
||||
]
|
||||
},
|
||||
"2.0.37": {
|
||||
"sha256": "5f105131fe4f48d47fd813f57b6bd275840a47b21e39b30d22bf5da30075a786",
|
||||
"tags": [
|
||||
"2.0.37"
|
||||
]
|
||||
},
|
||||
"2.0.38": {
|
||||
"sha256": "ad9650f7456aecc8adb5369eedb418507c7643bede0da60fc1a239878d4902de",
|
||||
"tags": [
|
||||
"2.0.38"
|
||||
]
|
||||
},
|
||||
"2.0.39": {
|
||||
"sha256": "0f8a3d0e43797b5ff4d8b85d7c334b095a3f07d9aa7f80b1e87f94939a93df34",
|
||||
"tags": [
|
||||
"stable-2.0.39",
|
||||
"2",
|
||||
"2.0",
|
||||
"2.0.39",
|
||||
"stable"
|
||||
]
|
||||
},
|
||||
"2.0.40": {
|
||||
"sha256": "eac1f24afb68acbfcf1d72d2ad142e8584d77f2d100a3af743f106e50ac176d3",
|
||||
"tags": [
|
||||
"2.0.40"
|
||||
]
|
||||
},
|
||||
"2.0.41": {
|
||||
"sha256": "77ebccae8167fc1a9fc4da8c11e8410f6017b92b1a0913eb58ac5285c9eec399",
|
||||
"tags": [
|
||||
"latest",
|
||||
"2.0.41"
|
||||
]
|
||||
}
|
||||
}
|
37
docker-compose.yml
Normal file
37
docker-compose.yml
Normal file
@ -0,0 +1,37 @@
|
||||
version: "2"
|
||||
services:
|
||||
factorio:
|
||||
container_name: factorio
|
||||
image: factoriotools/factorio:stable
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "34197:34197/udp"
|
||||
- "27015:27015/tcp"
|
||||
volumes:
|
||||
- ./data:/factorio
|
||||
environment:
|
||||
- UPDATE_MODS_ON_START=true
|
||||
|
||||
# Uncomment to enable autoupdate via watchtower
|
||||
#labels:
|
||||
# # Labels to allow watchtower autoupdate only if no players are online
|
||||
# - com.centurylinklabs.watchtower.enable=true
|
||||
# - com.centurylinklabs.watchtower.scope=factorio
|
||||
# - com.centurylinklabs.watchtower.lifecycle.pre-update="/players-online.sh"
|
||||
|
||||
# Uncomment the following files to use watchtower for updating the factorio container
|
||||
# Full documentation of watchtower: https://github.com/containrrr/watchtower
|
||||
#watchtower:
|
||||
# container_name: watchtower_factorio
|
||||
# image: containrrr/watchtower
|
||||
# restart: unless-stopped
|
||||
# volumes:
|
||||
# - /var/run/docker.sock:/var/run/docker.sock
|
||||
# environment:
|
||||
# # Only update containers which have the option 'watchtower.enable=true' set
|
||||
# - WATCHTOWER_TIMEOUT=30s
|
||||
# - WATCHTOWER_LABEL_ENABLE=true
|
||||
# - WATCHTOWER_POLL_INTERVAL=3600
|
||||
# - WATCHTOWER_LIFECYCLE_HOOKS=true
|
||||
# labels:
|
||||
# - com.centurylinklabs.watchtower.scope=factorio
|
97
docker/Dockerfile
Executable file
97
docker/Dockerfile
Executable file
@ -0,0 +1,97 @@
|
||||
# build rcon client
|
||||
FROM debian:stable-slim AS rcon-builder
|
||||
RUN apt-get -q update \
|
||||
&& DEBIAN_FRONTEND=noninteractive apt-get -qy install build-essential
|
||||
|
||||
WORKDIR /src
|
||||
COPY rcon/ /src
|
||||
RUN make
|
||||
|
||||
# build factorio image
|
||||
FROM debian:stable-slim
|
||||
LABEL maintainer="https://github.com/factoriotools/factorio-docker"
|
||||
|
||||
ARG USER=factorio
|
||||
ARG GROUP=factorio
|
||||
ARG PUID=845
|
||||
ARG PGID=845
|
||||
ARG BOX64_VERSION=v0.2.4
|
||||
|
||||
# optionally utilize a built-in map-gen-preset (see data/base/prototypes/map-gen-presets
|
||||
# if this is used, the preset will be used over any .json files supplied
|
||||
# vanilla factorio provides the following presets:
|
||||
# rich-resources, marathon, death-world, death-world-marathon, rail-world, ribbon-world, island
|
||||
# a modded factorio example for using this:
|
||||
# space-exploration
|
||||
ARG PRESET
|
||||
|
||||
# number of retries that curl will use when pulling the headless server tarball
|
||||
ARG CURL_RETRIES=8
|
||||
|
||||
ENV PORT=34197 \
|
||||
RCON_PORT=27015 \
|
||||
SAVES=/factorio/saves \
|
||||
PRESET="$PRESET" \
|
||||
CONFIG=/factorio/config \
|
||||
MODS=/factorio/mods \
|
||||
SCENARIOS=/factorio/scenarios \
|
||||
SCRIPTOUTPUT=/factorio/script-output \
|
||||
PUID="$PUID" \
|
||||
PGID="$PGID" \
|
||||
DLC_SPACE_AGE="true"
|
||||
|
||||
SHELL ["/bin/bash", "-eo", "pipefail", "-c"]
|
||||
|
||||
RUN apt-get -q update \
|
||||
&& DEBIAN_FRONTEND=noninteractive apt-get -qy install ca-certificates curl jq pwgen xz-utils procps gettext-base --no-install-recommends \
|
||||
&& if [[ "$(uname -m)" == "aarch64" ]]; then \
|
||||
echo "installing ARM compatability layer" \
|
||||
&& DEBIAN_FRONTEND=noninteractive apt-get -qy install unzip --no-install-recommends \
|
||||
&& curl -LO https://github.com/ptitSeb/box64/releases/download/${BOX64_VERSION}/box64-GENERIC_ARM-RelWithDebInfo.zip \
|
||||
&& unzip box64-GENERIC_ARM-RelWithDebInfo.zip -d /bin \
|
||||
&& rm -f box64-GENERIC_ARM-RelWithDebInfo.zip \
|
||||
&& chmod +x /bin/box64; \
|
||||
fi \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
RUN addgroup --system --gid "$PGID" "$GROUP" \
|
||||
&& adduser --system --uid "$PUID" --gid "$PGID" --no-create-home --disabled-password --shell /bin/sh "$USER"
|
||||
|
||||
# version checksum of the archive to download
|
||||
ARG VERSION
|
||||
ARG SHA256
|
||||
|
||||
LABEL factorio.version=${VERSION}
|
||||
|
||||
ENV VERSION=${VERSION} \
|
||||
SHA256=${SHA256}
|
||||
|
||||
RUN set -ox pipefail \
|
||||
&& if [[ "${VERSION}" == "" ]]; then \
|
||||
echo "build-arg VERSION is required" \
|
||||
&& exit 1; \
|
||||
fi \
|
||||
&& if [[ "${SHA256}" == "" ]]; then \
|
||||
echo "build-arg SHA256 is required" \
|
||||
&& exit 1; \
|
||||
fi \
|
||||
&& archive="/tmp/factorio_headless_x64_$VERSION.tar.xz" \
|
||||
&& mkdir -p /opt /factorio \
|
||||
&& curl -sSL "https://www.factorio.com/get-download/$VERSION/headless/linux64" -o "$archive" --retry $CURL_RETRIES \
|
||||
&& echo "$SHA256 $archive" | sha256sum -c \
|
||||
|| (sha256sum "$archive" && file "$archive" && exit 1) \
|
||||
&& tar xf "$archive" --directory /opt \
|
||||
&& chmod ugo=rwx /opt/factorio \
|
||||
&& rm "$archive" \
|
||||
&& ln -s "$SCENARIOS" /opt/factorio/scenarios \
|
||||
&& ln -s "$SAVES" /opt/factorio/saves \
|
||||
&& mkdir -p /opt/factorio/config/ \
|
||||
&& chown -R "$USER":"$GROUP" /opt/factorio /factorio
|
||||
|
||||
COPY files/*.sh /
|
||||
COPY files/config.ini /opt/factorio/config/config.ini
|
||||
COPY --from=rcon-builder /src/rcon /bin/rcon
|
||||
|
||||
VOLUME /factorio
|
||||
EXPOSE $PORT/udp $RCON_PORT/tcp
|
||||
ENTRYPOINT ["/docker-entrypoint.sh"]
|
28
docker/docker-compose.yml
Normal file
28
docker/docker-compose.yml
Normal file
@ -0,0 +1,28 @@
|
||||
version: '2'
|
||||
services:
|
||||
factorio:
|
||||
build:
|
||||
context: .
|
||||
args:
|
||||
# Check buildinfo.json for supported versions and SHAs
|
||||
# https://github.com/factoriotools/factorio-docker/blob/master/buildinfo.json
|
||||
- VERSION=2.0.39
|
||||
- SHA256=0f8a3d0e43797b5ff4d8b85d7c334b095a3f07d9aa7f80b1e87f94939a93df34
|
||||
ports:
|
||||
- "34197:34197/udp"
|
||||
- "27015:27015/tcp"
|
||||
volumes:
|
||||
- /opt/factorio:/factorio
|
||||
# environment:
|
||||
# - PUID=1000
|
||||
# - PGID=1000
|
||||
# - UPDATE_MODS_ON_START=true
|
||||
# - USERNAME=FactorioUsername
|
||||
# - TOKEN=FactorioToken
|
||||
# - PORT=34198
|
||||
# - PRESET=deathworld
|
||||
# - ADDR=::1
|
||||
# # Uncomment the following line to enable the use of the host's network stack,
|
||||
# # which may be necessary for some setups like NAS or when using some proxy service like firewall rules.
|
||||
# extra_hosts:
|
||||
# - "host.docker.internal:host-gateway"
|
57
docker/files/docker-dlc.sh
Executable file
57
docker/files/docker-dlc.sh
Executable file
@ -0,0 +1,57 @@
|
||||
#!/bin/bash
|
||||
set -eou pipefail
|
||||
|
||||
# Path to the mod-list.json file
|
||||
MOD_LIST_FILE="$MODS/mod-list.json"
|
||||
|
||||
ALL_SPACE_AGE_MODS=("elevated-rails" "quality" "space-age")
|
||||
|
||||
if [[ ! -f "$MOD_LIST_FILE" ]]; then
|
||||
# Create the mod-list.json file if it doesn't exist
|
||||
echo '{"mods":[{"name":"base","enabled":true}]}' > "$MOD_LIST_FILE"
|
||||
fi
|
||||
|
||||
enable_mod()
|
||||
{
|
||||
echo "Enable mod $1 for DLC"
|
||||
jq --arg mod_name "$1" 'if .mods | map(.name) | index($mod_name) then .mods |= map(if .name == $mod_name and .enabled == false then .enabled = true else . end) else . end' "$MOD_LIST_FILE" > "$MOD_LIST_FILE.tmp"
|
||||
mv "$MOD_LIST_FILE.tmp" "$MOD_LIST_FILE"
|
||||
}
|
||||
|
||||
disable_mod()
|
||||
{
|
||||
echo "Disable mod $1 for DLC"
|
||||
jq --arg mod_name "$1" 'if .mods | map(.name) | index($mod_name) then .mods |= map(if .name == $mod_name and .enabled == true then .enabled = false else . end) else .mods += [{"name": $mod_name, "enabled": false}] end' "$MOD_LIST_FILE" > "$MOD_LIST_FILE.tmp"
|
||||
mv "$MOD_LIST_FILE.tmp" "$MOD_LIST_FILE"
|
||||
}
|
||||
|
||||
# Enable or disable DLCs if configured
|
||||
if [[ ${DLC_SPACE_AGE:-} == "true" ]]; then
|
||||
# Define the DLC mods
|
||||
ENABLE_MODS=(${ALL_SPACE_AGE_MODS[@]})
|
||||
elif [[ ${DLC_SPACE_AGE:-} == "false" ]]; then
|
||||
# Define the DLC mods
|
||||
DISABLE_MODS=(${ALL_SPACE_AGE_MODS[@]})
|
||||
else
|
||||
ENABLE_MODS=()
|
||||
DISABLE_MODS=()
|
||||
|
||||
for SPACE_AGE_MOD in "${ALL_SPACE_AGE_MODS[@]}"; do
|
||||
REGEX="(^|\s)$SPACE_AGE_MOD($|\s)"
|
||||
if [[ "$DLC_SPACE_AGE" =~ $REGEX ]]; then
|
||||
ENABLE_MODS+=($SPACE_AGE_MOD)
|
||||
else
|
||||
DISABLE_MODS+=($SPACE_AGE_MOD)
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
# Iterate over each DLC mod to enable
|
||||
for MOD in "${ENABLE_MODS[@]}"; do
|
||||
enable_mod "$MOD"
|
||||
done
|
||||
|
||||
# Iterate over each DLC mod to disable
|
||||
for MOD in "${DISABLE_MODS[@]}"; do
|
||||
disable_mod "$MOD"
|
||||
done
|
@ -1,10 +1,13 @@
|
||||
#!/bin/bash
|
||||
set -eoux pipefail
|
||||
|
||||
INSTALLED_DIRECTORY=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")
|
||||
FACTORIO_VOL=/factorio
|
||||
LOAD_LATEST_SAVE="${LOAD_LATEST_SAVE:-true}"
|
||||
GENERATE_NEW_SAVE="${GENERATE_NEW_SAVE:-false}"
|
||||
PRESET="${PRESET:-""}"
|
||||
SAVE_NAME="${SAVE_NAME:-""}"
|
||||
BIND="${BIND:-""}"
|
||||
CONSOLE_LOG_LOCATION="${CONSOLE_LOG_LOCATION:-""}"
|
||||
|
||||
mkdir -p "$FACTORIO_VOL"
|
||||
mkdir -p "$SAVES"
|
||||
@ -38,19 +41,25 @@ if [[ $NRTMPSAVES -gt 0 ]]; then
|
||||
fi
|
||||
|
||||
if [[ ${UPDATE_MODS_ON_START:-} == "true" ]]; then
|
||||
./docker-update-mods.sh
|
||||
${INSTALLED_DIRECTORY}/docker-update-mods.sh
|
||||
fi
|
||||
|
||||
if [[ $(id -u) = 0 ]]; then
|
||||
${INSTALLED_DIRECTORY}/docker-dlc.sh
|
||||
|
||||
EXEC=""
|
||||
if [[ $(id -u) == 0 ]]; then
|
||||
# Update the User and Group ID based on the PUID/PGID variables
|
||||
usermod -o -u "$PUID" factorio
|
||||
groupmod -o -g "$PGID" factorio
|
||||
# Take ownership of factorio data if running as root
|
||||
chown -R factorio:factorio "$FACTORIO_VOL"
|
||||
# Drop to the factorio user
|
||||
SU_EXEC="su-exec factorio"
|
||||
else
|
||||
SU_EXEC=""
|
||||
EXEC="runuser -u factorio -g factorio --"
|
||||
fi
|
||||
if [[ -f /bin/box64 ]]; then
|
||||
# Use an emulator to run on ARM hosts
|
||||
# this only gets installed when the target docker platform is linux/arm64
|
||||
EXEC="$EXEC /bin/box64"
|
||||
fi
|
||||
|
||||
sed -i '/write-data=/c\write-data=\/factorio/' /opt/factorio/config/config.ini
|
||||
@ -69,11 +78,19 @@ if [[ $GENERATE_NEW_SAVE == true ]]; then
|
||||
if [[ -f "$SAVES/$SAVE_NAME.zip" ]]; then
|
||||
echo "Map $SAVES/$SAVE_NAME.zip already exists, skipping map generation"
|
||||
else
|
||||
$SU_EXEC /opt/factorio/bin/x64/factorio \
|
||||
if [[ ! -z "$PRESET" ]]; then
|
||||
$EXEC /opt/factorio/bin/x64/factorio \
|
||||
--create "$SAVES/$SAVE_NAME.zip" \
|
||||
--preset "$PRESET" \
|
||||
--map-gen-settings "$CONFIG/map-gen-settings.json" \
|
||||
--map-settings "$CONFIG/map-settings.json"
|
||||
else
|
||||
$EXEC /opt/factorio/bin/x64/factorio \
|
||||
--create "$SAVES/$SAVE_NAME.zip" \
|
||||
--map-gen-settings "$CONFIG/map-gen-settings.json" \
|
||||
--map-settings "$CONFIG/map-settings.json"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
FLAGS=(\
|
||||
@ -86,8 +103,17 @@ FLAGS=(\
|
||||
--server-adminlist "$CONFIG/server-adminlist.json" \
|
||||
--rcon-password "$(cat "$CONFIG/rconpw")" \
|
||||
--server-id /factorio/config/server-id.json \
|
||||
--mod-directory "$MODS" \
|
||||
)
|
||||
|
||||
if [ -n "$CONSOLE_LOG_LOCATION" ]; then
|
||||
FLAGS+=( --console-log "$CONSOLE_LOG_LOCATION" )
|
||||
fi
|
||||
|
||||
if [ -n "$BIND" ]; then
|
||||
FLAGS+=( --bind "$BIND" )
|
||||
fi
|
||||
|
||||
if [[ $LOAD_LATEST_SAVE == true ]]; then
|
||||
FLAGS+=( --start-server-load-latest )
|
||||
else
|
||||
@ -95,4 +121,4 @@ else
|
||||
fi
|
||||
|
||||
# shellcheck disable=SC2086
|
||||
exec $SU_EXEC /opt/factorio/bin/x64/factorio "${FLAGS[@]}" "$@"
|
||||
exec $EXEC /opt/factorio/bin/x64/factorio "${FLAGS[@]}" "$@"
|
11
docker/files/players-online.sh
Executable file
11
docker/files/players-online.sh
Executable file
@ -0,0 +1,11 @@
|
||||
#!/bin/bash
|
||||
|
||||
PLAYERS=$(rcon /players)
|
||||
ONLINE_COUNT=$(echo "$PLAYERS" | grep -c " (online)$")
|
||||
|
||||
if [[ "$ONLINE_COUNT" -gt "0" ]]; then
|
||||
echo "$PLAYERS"
|
||||
# exit with 75 (EX_TEMPFAIL) so watchtower skips the update
|
||||
# https://containrrr.dev/watchtower/lifecycle-hooks/
|
||||
exit 75
|
||||
fi
|
@ -6,6 +6,8 @@ if [[ -z ${1:-} ]]; then
|
||||
fi
|
||||
|
||||
SERVER_SCENARIO="$1"
|
||||
PRESET="${PRESET:-""}"
|
||||
|
||||
mkdir -p "$SAVES"
|
||||
mkdir -p "$CONFIG"
|
||||
mkdir -p "$MODS"
|
||||
@ -32,6 +34,7 @@ fi
|
||||
exec /opt/factorio/bin/x64/factorio \
|
||||
--port "$PORT" \
|
||||
--start-server-load-scenario "$SERVER_SCENARIO" \
|
||||
--preset "$PRESET" \
|
||||
--map-gen-settings "$CONFIG/map-gen-settings.json" \
|
||||
--map-settings "$CONFIG/map-settings.json" \
|
||||
--server-settings "$CONFIG/server-settings.json" \
|
@ -28,7 +28,7 @@ update_mod()
|
||||
MOD_NAME="$1"
|
||||
MOD_NAME_ENCODED="${1// /%20}"
|
||||
|
||||
print_step "Checking for update of mod $MOD_NAME..."
|
||||
print_step "Checking for update of mod $MOD_NAME for factorio $FACTORIO_VERSION ..."
|
||||
|
||||
MOD_INFO_URL="$MOD_BASE_URL/api/mods/$MOD_NAME_ENCODED"
|
||||
MOD_INFO_JSON=$(curl --silent "$MOD_INFO_URL")
|
||||
@ -54,7 +54,7 @@ update_mod()
|
||||
return 0
|
||||
fi
|
||||
|
||||
print_step "Downloading..."
|
||||
print_step " Downloading $MOD_FILENAME"
|
||||
FULL_URL="$MOD_BASE_URL$MOD_URL?username=$USERNAME&token=$TOKEN"
|
||||
HTTP_STATUS=$(curl --silent -L -w "%{http_code}" -o "$MOD_DIR/$MOD_FILENAME" "$FULL_URL")
|
||||
|
13
docker/rcon/Makefile
Normal file
13
docker/rcon/Makefile
Normal file
@ -0,0 +1,13 @@
|
||||
# Optimization
|
||||
OPT = -O3 -flto
|
||||
TARGET = rcon
|
||||
|
||||
CC = gcc
|
||||
CFLAGS = -std=c17 -Wall -Wextra -pedantic $(OPT)
|
||||
REMOVE = rm -f
|
||||
|
||||
all:
|
||||
$(CC) $(CFLAGS) main.c -o $(TARGET)
|
||||
|
||||
clean:
|
||||
$(REMOVE) $(TARGET)
|
217
docker/rcon/main.c
Normal file
217
docker/rcon/main.c
Normal file
@ -0,0 +1,217 @@
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <unistd.h>
|
||||
#include <netdb.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
|
||||
#include <arpa/inet.h>
|
||||
|
||||
#define MIN_PACKET 10
|
||||
#define MAX_PACKET 4096
|
||||
#define MAX_BODY (MAX_PACKET - (3 * sizeof(uint32_t)) - 2)
|
||||
|
||||
#define RCON_HOST "127.0.0.1"
|
||||
|
||||
typedef enum {
|
||||
RCON_TYPE_RESPONSE = 0,
|
||||
RCON_TYPE_EXECCOMMAND = 2,
|
||||
RCON_TYPE_AUTH_RESPONSE = 2,
|
||||
RCON_TYPE_AUTH = 3,
|
||||
} packet_type;
|
||||
|
||||
typedef struct {
|
||||
uint32_t length;
|
||||
uint32_t id;
|
||||
packet_type type;
|
||||
char body[MAX_BODY];
|
||||
} packet;
|
||||
|
||||
int rcon_open(const char *port);
|
||||
void rcon_create(packet* pkt, packet_type type, const char* body);
|
||||
bool rcon_send(int rcon_socket, const packet* pkt);
|
||||
bool rcon_auth(int rcon_socket, const char* password);
|
||||
bool rcon_recv(int rcon_socket, packet* pkt, packet_type expected_type);
|
||||
char* combine_args(int argc, char* argv[]);
|
||||
char* read_password(const char* conf_dir);
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
if (argc < 2) {
|
||||
fprintf(stderr, "error: missing command argument\n");
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
srand((unsigned int)time(NULL));
|
||||
|
||||
const char* port = getenv("RCON_PORT");
|
||||
if (port == NULL) {
|
||||
fprintf(stderr, "error: missing $RCON_PORT env\n");
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
const char* conf_dir = getenv("CONFIG");
|
||||
if (conf_dir == NULL) {
|
||||
fprintf(stderr, "error: missing $CONFIG env");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
int rcon_socket = rcon_open(port);
|
||||
if (rcon_socket == -1) {
|
||||
fprintf(stderr, "error: could not connect\n");
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
if (!rcon_auth(rcon_socket, read_password(conf_dir))) {
|
||||
fprintf(stderr, "error: login failed\n");
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
packet pkt;
|
||||
rcon_create(&pkt, RCON_TYPE_EXECCOMMAND, combine_args(argc, argv));
|
||||
if (!rcon_send(rcon_socket, &pkt)) {
|
||||
fprintf(stderr, "error: send command failed\n");
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
if (rcon_recv(rcon_socket, &pkt, RCON_TYPE_RESPONSE) && pkt.length > 0) {
|
||||
puts(pkt.body);
|
||||
}
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
char* combine_args(int argc, char* argv[]) {
|
||||
// combine all cli arguments
|
||||
char* command = malloc(MAX_BODY);
|
||||
memset(command, 0, MAX_BODY);
|
||||
strcat(command, argv[1]);
|
||||
|
||||
for (int idx = 2; idx < argc; idx++) {
|
||||
strcat(command, " ");
|
||||
strcat(command, argv[idx]);
|
||||
}
|
||||
|
||||
return command;
|
||||
}
|
||||
|
||||
char* read_password(const char* conf_dir) {
|
||||
char* path = malloc(strlen(conf_dir) + 64);
|
||||
strcpy(path, conf_dir);
|
||||
strcat(path, "/rconpw");
|
||||
|
||||
FILE* fptr = fopen(path, "r");
|
||||
fseek(fptr, 0, SEEK_END);
|
||||
long fsize = ftell(fptr);
|
||||
fseek(fptr, 0, SEEK_SET); /* same as rewind(f); */
|
||||
|
||||
char *password = malloc(fsize + 1);
|
||||
fread(password, fsize, 1, fptr);
|
||||
fclose(fptr);
|
||||
|
||||
password[fsize] = 0;
|
||||
if (password[fsize-1] == '\n') {
|
||||
password[fsize-1] = 0;
|
||||
}
|
||||
|
||||
return password;
|
||||
}
|
||||
|
||||
int rcon_open(const char *port) {
|
||||
struct sockaddr_in address = {
|
||||
.sin_family = AF_INET,
|
||||
.sin_port = htons(atoi(port))
|
||||
};
|
||||
inet_aton(RCON_HOST, &address.sin_addr);
|
||||
|
||||
int rcon_socket = socket(AF_INET, SOCK_STREAM, 0);
|
||||
if (connect(rcon_socket, (struct sockaddr*) &address, sizeof(address)) < 0) {
|
||||
return -1;
|
||||
} else {
|
||||
return rcon_socket;
|
||||
}
|
||||
}
|
||||
|
||||
void rcon_create(packet* pkt, packet_type type, const char* body) {
|
||||
size_t body_length = strlen(body);
|
||||
if (body_length >= MAX_BODY - 2) {
|
||||
fprintf(stderr, "error: command to long");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
pkt->id = abs(rand());
|
||||
pkt->type = type;
|
||||
pkt->length = (uint32_t)(sizeof(pkt->id) + sizeof(pkt->type) + body_length + 2);
|
||||
|
||||
memset(pkt->body, 0, MAX_BODY);
|
||||
strncpy(pkt->body, body, MAX_BODY);
|
||||
}
|
||||
|
||||
bool rcon_recv(int rcon_socket, packet* pkt, packet_type expected_type) {
|
||||
memset(pkt, 0, sizeof(*pkt));
|
||||
|
||||
// Read response packet length
|
||||
ssize_t expected_length_bytes = sizeof(pkt->length);
|
||||
ssize_t rx_bytes = recv(rcon_socket, &(pkt->length), expected_length_bytes, 0);
|
||||
|
||||
if (rx_bytes == -1) {
|
||||
perror("error: socket error");
|
||||
return false;
|
||||
} else if (rx_bytes == 0) {
|
||||
fprintf(stderr, "error: no data recieved\n");
|
||||
return false;
|
||||
} else if (rx_bytes < expected_length_bytes || pkt->length < MIN_PACKET || pkt->length > MAX_PACKET) {
|
||||
fprintf(stderr, "error: invalid data\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
ssize_t received = 0;
|
||||
while (received < pkt->length) {
|
||||
rx_bytes = recv(rcon_socket, (char *)pkt + sizeof(pkt->length) + received, pkt->length - received, 0);
|
||||
if (rx_bytes < 0) {
|
||||
perror("error: socket error");
|
||||
return false;
|
||||
} else if (rx_bytes == 0) {
|
||||
fprintf(stderr, "error: connection lost\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
received += rx_bytes;
|
||||
}
|
||||
|
||||
return pkt->type == expected_type;
|
||||
}
|
||||
|
||||
bool rcon_send(int rcon_socket, const packet* pkt) {
|
||||
size_t length = sizeof(pkt->length) + pkt->length;
|
||||
char *ptr = (char*) pkt;
|
||||
|
||||
while (length > 0) {
|
||||
ssize_t ret = send(rcon_socket, ptr, length, 0);
|
||||
|
||||
if (ret == -1) {
|
||||
return false;
|
||||
}
|
||||
|
||||
ptr += ret;
|
||||
length -= ret;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool rcon_auth(int rcon_socket, const char* password) {
|
||||
packet pkt;
|
||||
rcon_create(&pkt, RCON_TYPE_AUTH, password);
|
||||
|
||||
if (!rcon_send(rcon_socket, &pkt)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!rcon_recv(rcon_socket, &pkt, RCON_TYPE_AUTH_RESPONSE)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
116
update.sh
Executable file
116
update.sh
Executable file
@ -0,0 +1,116 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
SEMVER_REGEX="^(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)$"
|
||||
|
||||
stable_online_version=$(curl 'https://factorio.com/api/latest-releases' | jq '.stable.headless' -r)
|
||||
experimental_online_version=$(curl 'https://factorio.com/api/latest-releases' | jq '.experimental.headless' -r)
|
||||
|
||||
stable_sha256=$(curl "https://factorio.com/download/sha256sums/" | grep -E "(factorio_headless_x64_|factorio-headless_linux_)${stable_online_version}.tar.xz" | awk '{print $1}')
|
||||
experimental_sha256=$(curl "https://factorio.com/download/sha256sums/" | grep -E "(factorio_headless_x64_|factorio-headless_linux_)${experimental_online_version}.tar.xz" | awk '{print $1}')
|
||||
|
||||
stable_current_version=$(jq 'with_entries(select(.value.tags | index("stable"))) | keys | .[0]' buildinfo.json -r)
|
||||
latest_current_version=$(jq 'with_entries(select(.value.tags | index("latest"))) | keys | .[0]' buildinfo.json -r)
|
||||
|
||||
echo "stable_online_version=${stable_online_version} experimental_online_version=${experimental_online_version}"
|
||||
echo "stable_current_version=${stable_current_version} latest_current_version=${latest_current_version}"
|
||||
|
||||
if [[ -z "${stable_online_version}" ]] || [[ -z "${experimental_online_version}" ]]; then
|
||||
exit
|
||||
fi
|
||||
if [[ "${stable_current_version}" == "${stable_online_version}" ]] && [[ "${latest_current_version}" == "${experimental_online_version}" ]]; then
|
||||
exit
|
||||
fi
|
||||
|
||||
function get-semver(){
|
||||
local ver=$1
|
||||
local type=$2
|
||||
if [[ "$ver" =~ $SEMVER_REGEX ]]; then
|
||||
local major=${BASH_REMATCH[1]}
|
||||
local minor=${BASH_REMATCH[2]}
|
||||
local patch=${BASH_REMATCH[3]}
|
||||
fi
|
||||
case $type in
|
||||
major)
|
||||
echo "$major"
|
||||
;;
|
||||
minor)
|
||||
echo "$minor"
|
||||
;;
|
||||
patch)
|
||||
echo "$patch"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
stableOnlineVersionMajor=$(get-semver "${stable_online_version}" major)
|
||||
stableOnlineVersionMinor=$(get-semver "${stable_online_version}" minor)
|
||||
experimentalOnlineVersionMajor=$(get-semver "${experimental_online_version}" major)
|
||||
experimentalOnlineVersionMinor=$(get-semver "${experimental_online_version}" minor)
|
||||
stableCurrentVersionMajor=$(get-semver "${stable_current_version}" major)
|
||||
stableCurrentVersionMinor=$(get-semver "${stable_current_version}" minor)
|
||||
latestCurrentVersionMajor=$(get-semver "${latest_current_version}" major)
|
||||
latestCurrentVersionMinor=$(get-semver "${latest_current_version}" minor)
|
||||
|
||||
stableOnlineVersionShort=$stableOnlineVersionMajor.$stableOnlineVersionMinor
|
||||
experimentalOnlineVersionShort=$experimentalOnlineVersionMajor.$experimentalOnlineVersionMinor
|
||||
stableCurrentVersionShort=$stableCurrentVersionMajor.$stableCurrentVersionMinor
|
||||
latestCurrentVersionShort=$latestCurrentVersionMajor.$latestCurrentVersionMinor
|
||||
|
||||
echo "stableOnlineVersionShort=${stableOnlineVersionShort} experimentalOnlineVersionShort=${experimentalOnlineVersionShort}"
|
||||
echo "stableCurrentVersionShort=${stableCurrentVersionShort} latestCurrentVersionShort=${latestCurrentVersionShort}"
|
||||
|
||||
tmpfile=$(mktemp)
|
||||
|
||||
# Remove stable tag
|
||||
cp buildinfo.json "$tmpfile"
|
||||
jq --arg stable_current_version "$stable_current_version" 'with_entries(if .key == $stable_current_version then .value.tags |= . - ["stable"] else . end)' "$tmpfile" > buildinfo.json
|
||||
rm -f -- "$tmpfile"
|
||||
|
||||
# Remove latest tag
|
||||
cp buildinfo.json "$tmpfile"
|
||||
jq --arg latest_current_version "$latest_current_version" 'with_entries(if .key == $latest_current_version then .value.tags |= . - ["latest"] else . end)' "$tmpfile" > buildinfo.json
|
||||
rm -f -- "$tmpfile"
|
||||
|
||||
# Update tag by stable
|
||||
cp buildinfo.json "$tmpfile"
|
||||
if [[ "$stable_online_version" == "$stable_current_version" ]]; then
|
||||
jq --arg stable_current_version "$stable_current_version" --arg stable_online_version "$stable_online_version" --arg sha256 "$stable_sha256" 'with_entries(if .key == $stable_current_version then .key |= $stable_online_version | .value.sha256 |= $sha256 | .value.tags |= . - [$stable_current_version] + [$stable_online_version, "stable"] else . end)' "$tmpfile" > buildinfo.json
|
||||
else
|
||||
jq --arg stable_current_version "$stable_current_version" --arg stable_online_version "$stable_online_version" --arg sha256 "$stable_sha256" --arg stableOnlineVersionShort "$stableOnlineVersionShort" --arg stableOnlineVersionMajor "$stableOnlineVersionMajor" 'with_entries(if .key == $stable_current_version then .value.tags |= . - ["latest","stable",$stableOnlineVersionMajor] else . end) | to_entries | . + [{ key: $stable_online_version, value: { sha256: $sha256, tags: ["latest","stable",("stable-" + $stable_online_version),$stableOnlineVersionMajor,$stableOnlineVersionShort,$stable_online_version]}}] | from_entries' "$tmpfile" > buildinfo.json
|
||||
fi
|
||||
rm -f -- "$tmpfile"
|
||||
|
||||
# Update tag by latest
|
||||
cp buildinfo.json "$tmpfile"
|
||||
if [[ $experimental_online_version != "$stable_online_version" ]]; then
|
||||
if [[ $stableOnlineVersionShort == "$experimentalOnlineVersionShort" ]]; then
|
||||
jq --arg experimental_online_version "$experimental_online_version" --arg stable_online_version "$stable_online_version" --arg sha256 "$experimental_sha256" 'with_entries(if .key == $stable_online_version then .value.tags |= . - ["latest"] else . end) | to_entries | . + [{ key: $experimental_online_version, value: { sha256: $sha256, tags: ["latest", $experimental_online_version]}}] | from_entries' "$tmpfile" > buildinfo.json
|
||||
else
|
||||
jq --arg experimental_online_version "$experimental_online_version" --arg stable_online_version "$stable_online_version" --arg sha256 "$experimental_sha256" --arg experimentalOnlineVersionShort "$experimentalOnlineVersionShort" --arg experimentalOnlineVersionMajor "$experimentalOnlineVersionMajor" 'with_entries(if .key == $stable_online_version then .value.tags |= . - ["latest"] else . end) | to_entries | . + [{ key: $experimental_online_version, value: { sha256: $sha256, tags: ["latest",$experimentalOnlineVersionMajor,$experimentalOnlineVersionShort,$experimental_online_version]}}] | from_entries' "$tmpfile" > buildinfo.json
|
||||
fi
|
||||
fi
|
||||
rm -f -- "$tmpfile"
|
||||
|
||||
readme_tags=$(jq --sort-keys 'keys[]' buildinfo.json | tac | (while read -r line
|
||||
do
|
||||
tags="$tags\n* "$(jq --sort-keys ".$line.tags | sort | .[]" buildinfo.json | sed 's/"/`/g' | sed ':a; /$/N; s/\n/, /; ta')
|
||||
done && printf "%s\n\n" "$tags"))
|
||||
|
||||
perl -i -0777 -pe "s/<!-- start autogeneration tags -->.+<!-- end autogeneration tags -->/<!-- start autogeneration tags -->$readme_tags<!-- end autogeneration tags -->/s" README.md
|
||||
|
||||
# Replace VERSION and SHA256 args in docker-compose.yaml with latest stable values.
|
||||
docker_compose_path="docker/docker-compose.yml"
|
||||
sov="VERSION=${stable_online_version}" yq -i '.services.factorio.build.args[0] = env(sov)' "$docker_compose_path"
|
||||
sha="SHA256=${stable_sha256}" yq -i '.services.factorio.build.args[1] = env(sha)' "$docker_compose_path"
|
||||
|
||||
git config user.name github-actions[bot]
|
||||
git config user.email 41898282+github-actions[bot]@users.noreply.github.com
|
||||
|
||||
git add buildinfo.json
|
||||
git add README.md
|
||||
git add docker/docker-compose.yml
|
||||
git commit -a -m "Auto Update Factorio to stable version: ${stable_online_version} experimental version: ${experimental_online_version}"
|
||||
|
||||
git tag -f latest
|
||||
git push
|
||||
git push origin --tags -f
|
Loading…
x
Reference in New Issue
Block a user